From cbb51dd7f174e1a97f7cda62da1d81154a2e8234 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 9 Oct 2019 14:14:29 -0700 Subject: [PATCH 001/936] Adding the manifest schema --- .gitignore | 1 + README.md | 21 + _schemas/manifest.schema.json | 421 +++++ datadog/manifest.json | 7 +- package.json | 24 + yarn.lock | 2853 +++++++++++++++++++++++++++++++++ 6 files changed, 3324 insertions(+), 3 deletions(-) create mode 100644 _schemas/manifest.schema.json create mode 100644 package.json create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 4272981e..5320ff70 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +node_modules/ .cache .env *.log diff --git a/README.md b/README.md index e69de29b..0fc5f611 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,21 @@ +# LaunchDarkly integrations + +Feature flags not only provide you control over your deployment and rollout, but +also provides context to other related systems -- giving your team visibility +into how your services react due to changes to flags. This repository contains +LaunchDarkly integrations built by our community. Most of these integrations +consume events from LaunchDarkly in order to provide their users more context. + +## Building integrations + +TODO + +## Submitting your integrations + +After you've forked this repository and created your integration, send us a pull +request. Your branch will be validated and reviewed by someone on our team. Once +everything checks out, we'll publish your integration. + +## Got issues? + +Please visit our [support site](https://support.launchdarkly.com/hc/en-us). diff --git a/_schemas/manifest.schema.json b/_schemas/manifest.schema.json new file mode 100644 index 00000000..35f924e5 --- /dev/null +++ b/_schemas/manifest.schema.json @@ -0,0 +1,421 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://launchdarkly.com/schemas/v1.0/integrations", + "title": "LaunchDarkly Integrations Manifest", + "description": "Describes the capabilities and intent of a LaunchDarkly integration", + "type": "object", + "properties": { + "name": { + "$id": "#/properties/name", + "title": "Integration name", + "description": "Your integration's name. No spaces", + "minLength": 3, + "maxLength": 50, + "type": "string", + "pattern": "^\\S*$" + }, + "version": { + "$id": "#/properties/version", + "title": "Version", + "description": "A semantic version of the integration", + "examples": ["0.0.1", "1.0.0", "1.0.1-beta"], + "$ref": "#/definitions/semver" + }, + "overview": { + "$id": "#/properties/overview", + "title": "Short description", + "description": "A short-one liner describing your integration", + "type": "string", + "minLength": 10, + "maxLength": 100, + "pattern": "^(.*)$" + }, + "description": { + "$id": "#/properties/description", + "title": "Long description", + "description": "A longer description of your integration", + "type": "string", + "minLength": 50, + "maxLength": 2048, + "pattern": "^(.*)$" + }, + "author": { + "$id": "#/properties/author", + "title": "Author", + "description": "Name of the author or organization responsible for the integration", + "type": "string", + "minLength": 3, + "maxLength": 100, + "pattern": "^(.*)$" + }, + "links": { + "$id": "#/properties/links", + "title": "Links", + "description": "A set of reference links supporting your integration", + "type": "object", + "properties": { + "site": { + "$id": "#/properties/links/site", + "title": "Website", + "description": "URL to your website", + "$ref": "#/definitions/https-url" + }, + "privacyPolicy": { + "$id": "#/properties/links/privacy-policy", + "title": "Privacy Policy", + "description": "URL to your organization's privacy policy", + "$ref": "#/definitions/https-url" + }, + "supportEmail": { + "$id": "#/properties/links/support-email", + "title": "Support Email", + "description": "Email address for your integration's support", + "type": "string", + "format": "email" + }, + "supportWebsite": { + "$id": "#/properties/links/support-website", + "title": "Support Website", + "description": "URL to your integration's support website", + "$ref": "#/definitions/https-url" + } + }, + "required": ["site", "privacyPolicy", "supportEmail"] + }, + "categories": { + "$id": "#/properties/categories", + "title": "Categories", + "description": "Categories that describe your integration", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "maxItems": 3, + "items": { + "$ref": "#/definitions/category" + } + }, + "icons": { + "$id": "#/properties/icons", + "title": "Icons", + "description": "Logos describing your integration in SVG format", + "type": "object", + "properties": { + "square": { + "$id": "#/properties/icons/square", + "title": "Square logo", + "description": "A square version of your integration's logo in SVG format", + "type": "string", + "pattern": "\\.svg$" + }, + "rectangular": { + "$id": "#/properties/icons/rectangular", + "title": "Rectangular logo", + "description": "A rectangular version of your integration's logo in SVG format", + "type": "string", + "pattern": "\\.svg$" + } + }, + "required": ["square", "rectangular"] + }, + "authentication": { + "$id": "#/properties/authentication", + "title": "Authentication", + "description": "Specify the authentication method required by your integration", + "type": "object", + "oneOf": [ + { + "$ref": "#/definitions/auth-none" + }, + { + "$ref": "#/definitions/auth-token" + } + ] + }, + "capabilities": { + "$id": "#/properties/capabilities", + "title": "Capabilities", + "description": "Specify which capabilities you'd like your integration to have", + "type": "object", + "anyOf": [ + { + "properties": { + "auditLogEventsHook": { + "$ref": "#/definitions/capability-audit-log-events-hook" + } + } + } + ], + "minProperties": 1 + } + }, + "required": [ + "name", + "version", + "overview", + "description", + "author", + "links", + "categories", + "icons", + "authentication", + "capabilities" + ], + "definitions": { + "semver": { + "type": "string", + "minLength": 5, + "maxLength": 14, + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + }, + "https-url": { + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "category": { + "type": "string", + "enum": [ + "alerts", + "analytics-and-reporting", + "apm", + "automation", + "communication-and-collaboration", + "config-and-deployment", + "exceptions", + "experimentation", + "hr-and-operations", + "issue-tracking", + "it-and-project-management", + "marketing-and-social-media", + "monitoring", + "orchestration", + "product-and-design", + "provisioning", + "security", + "source-control" + ] + }, + "auth-none": { + "properties": { + "type": { + "$id": "#/properties/authentication/type", + "title": "Auth Type", + "description": "Specify the authentication method required by your integration", + "type": "string", + "enum": ["none"] + } + }, + "required": ["type"], + "maxProperties": 1 + }, + "auth-token": { + "properties": { + "type": { + "$id": "#/properties/authentication/type", + "title": "Auth Type", + "description": "Specify the authentication method required by your integration", + "type": "string", + "enum": ["token"] + }, + "label": { + "$id": "#/properties/authentication/label", + "title": "Token", + "description": "Label to use in the LaunchDarkly UI describing you token", + "examples": ["API key", "API token"], + "type": "string" + }, + "hint": { + "$id": "#/properties/authentication/hint", + "title": "Hint", + "description": "A placeholder hint used in the LaunchDarkly UI describing your token", + "examples": ["Enter API key from your SpaceXYZ account"], + "type": "string" + }, + "acceptedAs": { + "$id": "#/properties/authentication/acceptedAs", + "title": "Token accepted as...", + "description": "Specify how your token should be provided in the request to your service", + "type": "object", + "oneOf": [ + { + "$ref": "#/definitions/accepted-as-header" + }, + { + "$ref": "#/definitions/accepted-as-query-param" + } + ] + } + }, + "required": ["type", "label", "hint", "acceptedAs"] + }, + "accepted-as-header": { + "properties": { + "type": { + "$id": "#/properties/authentication/acceptedAs/header-type", + "title": "Type", + "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", + "type": "string", + "enum": ["header"] + }, + "name": { + "$id": "#/properties/authentication/acceptedAs/type/header-name", + "title": "Header name", + "description": "Specify the name of the header you'd like to use", + "type": "string", + "examples": ["Authorization", "X-SpaceXYZ-Auth"], + "minLength": 1 + }, + "prefix": { + "$id": "#/properties/authentication/acceptedAs/type/header-value-prefix", + "title": "Header value prefix", + "description": "If your token needs to be padded with a prefix, specify it here", + "type": "string", + "examples": ["Bearer "] + } + }, + "required": ["type", "name"] + }, + "accepted-as-query-param": { + "properties": { + "type": { + "$id": "#/properties/authentication/acceptedAs/query-param-type", + "title": "Type", + "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", + "type": "string", + "enum": ["query-param"] + }, + "name": { + "$id": "#/properties/authentication/acceptedAs/type/query-param-name", + "title": "Query parameter name", + "description": "Specify the name of the query parameter you'd like to use", + "type": "string", + "examples": ["token", "key"], + "minLength": 1 + } + }, + "required": ["type", "name"] + }, + "capability-audit-log-events-hook": { + "$id": "#/properties/capability/audit-log-events-hook", + "title": "Audit Log Events Hook", + "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", + "type": "object", + "propertyNames": { + "enum": ["receivingEndpoint", "method", "templates", "defaultPolicy"] + }, + "properties": { + "receivingEndpoint": { + "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", + "title": "Endpoint URL", + "description": "URL where you'd like LaunchDarkly to send webhooks to", + "$ref": "#/definitions/https-url" + }, + "method": { + "$id": "#/properties/capability/audit-log-events-hook/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": ["post", "put", "patch"] + }, + "templates": { + "$id": "#/properties/capability/audit-log-events-hook/templates", + "title": "Webhook body template", + "description": "Templates to use for body of the webhook request", + "type": "object", + "anyOf": [ + { + "propertyNames": { + "enum": ["flag", "project", "environment", "metric"] + }, + "patternProperties": { + "": { + "type": "string" + } + } + } + ] + }, + "defaultPolicy": { + "$id": "#/properties/capability/audit-log-events-hook/default-policy", + "title": "Default Policy", + "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "array", + "items": { + "$id": "#/properties/capability/audit-log-events-hook/policy", + "title": "Policy", + "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "object", + "propertyNames": { + "enum": [ + "actions", + "effect", + "notActions", + "notResources", + "resources" + ] + }, + "properties": { + "actions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/actions", + "title": "Actions", + "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": ["*"], + "examples": [ + "updateOn", + "createFlag", + "updateRules", + "updateTargets" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "effect": { + "$id": "#/properties/capability/audit-log-events-hook/policy/effect", + "title": "Effect", + "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", + "default": "allow", + "type": "string", + "enum": ["allow", "deny"] + }, + "notActions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", + "title": "Not actions", + "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": ["*"], + "examples": ["createFlag", "deleteFlag", "cloneFlag"], + "type": "array", + "items": { + "type": "string" + } + }, + "notResources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", + "title": "Not resources", + "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": ["*"], + "examples": ["proj/*:env/production:flag/*"], + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/resources", + "title": "Resources", + "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": ["*"], + "examples": ["proj/*:env/production:flag/*"], + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "required": ["receivingEndpoint", "method"] + } + } +} diff --git a/datadog/manifest.json b/datadog/manifest.json index 19991bee..08eefa5e 100644 --- a/datadog/manifest.json +++ b/datadog/manifest.json @@ -1,4 +1,5 @@ { + "$schema": "../_tests/manifestSchema.json", "name": "SpaceXYZ", "version": "1.0.0", "overview": "Short one-liner describing your integration", @@ -9,17 +10,17 @@ "privacyPolicy": "https://spacexyz.com/privacy", "supportEmail": "support@spacexyz.com" }, - "categories": ["APM", "DevOps"], + "categories": ["apm", "monitoring", "alerts"], "icons": { "square": "assets/images/square.svg", "rectangular": "assets/images/rectangular.svg" }, "authentication": { - "type": "", + "type": "token", "label": "API key", "hint": "Enter API key from your [SpaceXYZ account](https://spacexyz.com/api)", "acceptedAs": { - "type": "", + "type": "query-param", "name": "token" } }, diff --git a/package.json b/package.json new file mode 100644 index 00000000..aa34e7d9 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "ld-integrations", + "version": "1.0.0", + "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", + "main": "index.js", + "scripts": { + "prepare": "jsonschema2md -d _schemas -o ." + }, + "repository": { + "type": "git", + "url": "git+https://github.com/launchdarkly/ld-integrations.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/launchdarkly/ld-integrations/issues" + }, + "homepage": "https://github.com/launchdarkly/ld-integrations#readme", + "dependencies": {}, + "devDependencies": { + "@adobe/jsonschema2md": "3.3.1", + "ajv-cli": "3.0.0" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..c11bce5d --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2853 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adobe/helix-log@^2.0.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@adobe/helix-log/-/helix-log-2.2.2.tgz#1a2b54e32bbbc667baad77b2ec50cc99cc67e626" + integrity sha512-Jn8EUE2Mpb3NRz5wWrj3xu51kZDYboTlAueG5mgYdG3/NnHNUJU75N/JMpA+QTPSAi9XjWoUmM7nQW346qbU3g== + dependencies: + colorette "^1.1.0" + ferrum "^1.2.0" + phin "^3.4.0" + polka "^0.5.2" + snyk "^1.226.1" + uuid "^3.3.3" + +"@adobe/jsonschema2md@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@adobe/jsonschema2md/-/jsonschema2md-3.3.1.tgz#8ddc1e855c6997c6e496ce54f7e77cf9ec302c44" + integrity sha512-fF3TaFazqZ52DaM9Au97STq7LnnMzDFr5Nr4RUY/7XImL0fW8SbjLl3M3AuALI2UZv28qcWxu+h03Nz3k2h7HA== + dependencies: + "@adobe/helix-log" "^2.0.0" + ajv "^6.10.2" + bluebird "^3.5.5" + ejs "^2.6.2" + github-slugger "^1.2.1" + i18n "^0.8.3" + jasmine-xml-reporter "^1.2.1" + json-pointer "^0.6.0" + lodash "^4.17.15" + mkdirp "^0.5.1" + optimist "^0.6.1" + prettier "^1.18.2" + readdirp "^3.1.1" + valid-url "1.0.9" + +"@arr/every@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@arr/every/-/every-1.0.0.tgz#314f8168f50ae48a032cfdad5fdb436f464a97ac" + integrity sha1-MU+BaPUK5IoDLP2tX9tDb0ZKl6w= + +"@polka/url@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-0.5.0.tgz#b21510597fd601e5d7c95008b76bf0d254ebfd31" + integrity sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw== + +"@snyk/cli-interface@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-1.5.0.tgz#b9dbe6ebfb86e67ffabf29d4e0d28a52670ac456" + integrity sha512-+Qo+IO3YOXWgazlo+CKxOuWFLQQdaNCJ9cSfhFQd687/FuesaIxWdInaAdfpsLScq0c6M1ieZslXgiZELSzxbg== + dependencies: + tslib "^1.9.3" + +"@snyk/cli-interface@^2.0.3", "@snyk/cli-interface@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.1.0.tgz#2e7ecd9457c91b78ce3e5b91451e823f218a25af" + integrity sha512-b/magC8iNQP9QhSDeV9RQDSaY3sNy57k0UH1Y/sMOSvVLHLsA7dOi/HrPWTiLouyGqcuYzwjkz7bNbu8cwmVDQ== + dependencies: + tslib "^1.9.3" + +"@snyk/cocoapods-lockfile-parser@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-2.0.4.tgz#296421454ba2ee9248ce1f13da57aa1b10b54de7" + integrity sha512-d57bajPjqCiNXMuyMmt9Zt98zbjABZUFw+91B705flzV6oB7OThgtA40Eoin6iatYoStIx28bC3T6b0mScy/iA== + dependencies: + "@snyk/dep-graph" "^1.11.0" + "@snyk/ruby-semver" "^2.0.4" + "@types/js-yaml" "^3.12.1" + core-js "^3.2.0" + js-yaml "^3.13.1" + source-map-support "^0.5.7" + tslib "^1.9.3" + +"@snyk/composer-lockfile-parser@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@snyk/composer-lockfile-parser/-/composer-lockfile-parser-1.0.3.tgz#4b703883ec36f3cec63c64355031e06698c771f5" + integrity sha512-hb+6E7kMzWlcwfe//ILDoktBPKL2a3+RnJT/CXnzRXaiLQpsdkf5li4q2v0fmvd+4v7L3tTN8KM+//lJyviEkg== + dependencies: + lodash "^4.17.13" + +"@snyk/dep-graph@1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.12.0.tgz#aa0df8549849a4857bc5510e839da268293e4750" + integrity sha512-n7+PlHn3SqznHgsCpeBRfEvU1oiQydoGkXQlnSB2+tfImiKXvY7YZbrg4wlbvYgylYiTbpCi5CpPNkJG14S+UQ== + dependencies: + graphlib "^2.1.5" + lodash "^4.7.14" + object-hash "^1.3.1" + semver "^6.0.0" + source-map-support "^0.5.11" + tslib "^1.9.3" + +"@snyk/dep-graph@1.13.0", "@snyk/dep-graph@^1.11.0": + version "1.13.0" + resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.13.0.tgz#855f628da0b833dd16c02c2f977507bbf090b894" + integrity sha512-e0XcLH6Kgs/lunf6iDjbxEnm9+JYFEJn6eo/PlEUW+SMWBZ2uEXHBTDNp9oxjJou48PngzWMveEkniBAN+ulOQ== + dependencies: + graphlib "^2.1.5" + lodash "^4.7.14" + object-hash "^1.3.1" + semver "^6.0.0" + source-map-support "^0.5.11" + tslib "^1.9.3" + +"@snyk/gemfile@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@snyk/gemfile/-/gemfile-1.2.0.tgz#919857944973cce74c650e5428aaf11bcd5c0457" + integrity sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA== + +"@snyk/ruby-semver@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@snyk/ruby-semver/-/ruby-semver-2.0.4.tgz#457686ea7a4d60b10efddde99587efb3a53ba884" + integrity sha512-ceMD4CBS3qtAg+O0BUvkKdsheUNCqi+/+Rju243Ul8PsUgZnXmGiqfk/2z7DCprRQnxUTra4+IyeDQT7wAheCQ== + dependencies: + lodash "^4.17.14" + +"@snyk/snyk-cocoapods-plugin@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-1.0.3.tgz#eb685590e6a478e1d86f1042c9493426f2f9764a" + integrity sha512-AHAA7z23nPi1eHODsDxeSkl73Ze3yphuqJjMl39ie323EzBDcb9g6uAACrk0Qn2K/K2D8uyxMAf2zDtc+JGQfw== + dependencies: + "@snyk/cli-interface" "1.5.0" + "@snyk/cocoapods-lockfile-parser" "2.0.4" + "@snyk/dep-graph" "1.13.0" + source-map-support "^0.5.7" + tslib "^1.9.3" + +"@types/agent-base@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/agent-base/-/agent-base-4.2.0.tgz#00644e8b395b40e1bf50aaf1d22cabc1200d5051" + integrity sha512-8mrhPstU+ZX0Ugya8tl5DsDZ1I5ZwQzbL/8PA0z8Gj0k9nql7nkaMzmPVLj+l/nixWaliXi+EBiLA8bptw3z7Q== + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@types/bunyan@*": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.6.tgz#6527641cca30bedec5feb9ab527b7803b8000582" + integrity sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ== + dependencies: + "@types/node" "*" + +"@types/debug@^4.1.4": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" + integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/js-yaml@^3.12.1": + version "3.12.1" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656" + integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA== + +"@types/node@*": + version "12.7.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.12.tgz#7c6c571cc2f3f3ac4a59a5f2bd48f5bdbc8653cc" + integrity sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ== + +"@types/node@^6.14.4": + version "6.14.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.7.tgz#2173f79d7a61d97d3aad2feeaac7ac69a3df39af" + integrity sha512-YbPXbaynBTe0pVExPhL76TsWnxSPeFAvImIsmylpBWn/yfw+lHy+Q68aawvZHsgskT44ZAoeE67GM5f+Brekew== + +"@types/restify@^4.3.6": + version "4.3.6" + resolved "https://registry.yarnpkg.com/@types/restify/-/restify-4.3.6.tgz#5da5889b65c34c33937a67686bab591325dde806" + integrity sha512-4l4f0EXnleXQttlhRCXtTuJ8UelsKiAKIK2AAEd2epBHu41aEbM0U2z6E5tUrNwlbxz7qaNBISduGMeg+G3PaA== + dependencies: + "@types/bunyan" "*" + "@types/node" "*" + +"@types/semver@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" + integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== + +"@types/xml2js@0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.3.tgz#2f41bfc74d5a4022511721f872ed395a210ad3b7" + integrity sha512-Pv2HGRE4gWLs31In7nsyXEH4uVVsd0HNV9i2dyASvtDIlOtSTr1eczPLDpdEuyv5LWH5LT20GIXwPjkshKWI1g== + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@yarnpkg/lockfile@^1.0.2": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +abbrev@1, abbrev@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +agent-base@4, agent-base@^4.2.0, agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +agent-base@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== + dependencies: + es6-promisify "^5.0.0" + +ajv-cli@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ajv-cli/-/ajv-cli-3.0.0.tgz#5823231f64e2833054130690b18099609e980f29" + integrity sha1-WCMjH2TigzBUEwaQsYCZYJ6YDyk= + dependencies: + ajv "^6.0.0" + ajv-pack "^0.3.0" + fast-json-patch "^0.5.6" + glob "^7.0.3" + json-schema-migrate "^0.2.0" + minimist "^1.2.0" + +ajv-pack@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ajv-pack/-/ajv-pack-0.3.1.tgz#b72c4d4219e3928e62842d742ded93bf50796560" + integrity sha1-tyxNQhnjko5ihC10Le2Tv1B5ZWA= + dependencies: + js-beautify "^1.6.4" + require-from-string "^1.2.0" + +ajv@6.10.2, ajv@^6.0.0, ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^5.0.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ambi@^2.2.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ambi/-/ambi-2.5.0.tgz#7c8e372be48891157e7cea01cb6f9143d1f74220" + integrity sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA= + dependencies: + editions "^1.1.1" + typechecker "^4.3.0" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-escapes@3.2.0, ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansicolors@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +ast-types@0.x.x: + version "0.13.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" + integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + +async@^1.4.0, async@~1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +bluebird@^3.5.5: + version "3.7.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf" + integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg== + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +camelcase@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +centra@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/centra/-/centra-2.4.0.tgz#53846f97db27705e9f90c46e0f824f6eb697e2d1" + integrity sha512-AWmF3EHNe/noJHviynZOrdnUuQzT5AMgl9nJPXGvnzGXrI2ZvNDrEcdqskc4EtQwt2Q1IggXb0OXy7zZ1Xvvew== + +chalk@^2.0.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^3.0.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-deep@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8" + integrity sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg= + dependencies: + for-own "^1.0.0" + is-plain-object "^2.0.1" + kind-of "^3.2.2" + shallow-clone "^0.1.2" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +colorette@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7" + integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg== + +commander@^2.19.0: + version "2.20.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.1.tgz#3863ce3ca92d0831dcf2a102f5fb4b5926afd0f9" + integrity sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +config-chain@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + +configstore@^3.0.0, configstore@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +core-js@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" + integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +csextends@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/csextends/-/csextends-1.2.0.tgz#6374b210984b54d4495f29c99d3dd069b80543e5" + integrity sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg== + +data-uri-to-buffer@2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" + integrity sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA== + +debug@*, debug@4, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +degenerator@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" + integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU= + dependencies: + ast-types "0.x.x" + escodegen "1.x.x" + esprima "3.x.x" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + +dockerfile-ast@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/dockerfile-ast/-/dockerfile-ast-0.0.16.tgz#10b329d343329dab1de70375833495f85ad65913" + integrity sha512-+HZToHjjiLPl46TqBrok5dMrg5oCkZFPSROMQjRmvin0zG4FxK0DJXTpV/CUPYY2zpmEvVza55XLwSHFx/xZMw== + dependencies: + vscode-languageserver-types "^3.5.0" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +dotnet-deps-parser@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/dotnet-deps-parser/-/dotnet-deps-parser-4.5.0.tgz#53ef53a058dec156fcdf9008b880ecc9675ddde0" + integrity sha512-t6rBxcWVZSDNhhWdsbq9ozaCzfPXV79FiyES1JLNEoA7nYF+zDC2VZvFZSnH8ilU3bghJXxZPH+EcKYvfw8g/g== + dependencies: + "@types/xml2js" "0.4.3" + lodash "^4.17.11" + source-map-support "^0.5.7" + tslib "^1.9.3" + xml2js "0.4.19" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +eachr@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/eachr/-/eachr-2.0.4.tgz#466f7caa10708f610509e32c807aafe57fc122bf" + integrity sha1-Rm98qhBwj2EFCeMsgHqv5X/BIr8= + dependencies: + typechecker "^2.0.8" + +editions@^1.1.1, editions@^1.3.3: + version "1.3.4" + resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" + integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== + +editions@^2.1.0, editions@^2.1.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/editions/-/editions-2.2.0.tgz#dacd0c2a9441ebef592bba316a6264febb337f35" + integrity sha512-RYg3iEA2BDLCNVe8PUkD+ox5vAKxB9XS/mAhx1bdxGCF0CpX077C0pyTA9t5D6idCYA3avl5/XDHKPsHFrygfw== + dependencies: + errlop "^1.1.2" + semver "^6.3.0" + +editorconfig@^0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== + dependencies: + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" + +ejs@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228" + integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ== + +email-validator@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed" + integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== + +"emoji-regex@>=6.0.0 <=6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" + integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +errlop@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/errlop/-/errlop-1.1.2.tgz#a99a48f37aa264d614e342ffdbbaa49eec9220e0" + integrity sha512-djkRp+urJ+SmqDBd7F6LUgm4Be1TTYBxia2bhjNdFBuBDQtJDHExD2VbxR6eyst3h1TZy3qPRCdqb6FBoFttTA== + dependencies: + editions "^2.1.3" + +es-abstract@^1.5.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.15.0.tgz#8884928ec7e40a79e3c9bc812d37d10c8b24cc57" + integrity sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.0" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.6.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.1.0" + string.prototype.trimright "^2.1.0" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@1.x.x: + version "1.12.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" + integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@3.x.x, esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.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" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + 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" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extendr@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/extendr/-/extendr-2.1.0.tgz#301aa0bbea565f4d2dc8f570f2a22611a8527b56" + integrity sha1-MBqgu+pWX00tyPVw8qImEahSe1Y= + dependencies: + typechecker "~2.0.1" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extract-opts@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/extract-opts/-/extract-opts-2.2.0.tgz#1fa28eba7352c6db480f885ceb71a46810be6d7d" + integrity sha1-H6KOunNSxttID4hc63GkaBC+bX0= + dependencies: + typechecker "~2.0.1" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-patch@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-0.5.7.tgz#b5a8f49d259624596ef98b872f3fda895b4d8665" + integrity sha1-taj0nSWWJFlu+YuHLz/aiVtNhmU= + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +ferrum@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/ferrum/-/ferrum-1.4.1.tgz#234bcfe2b4fda2a0f8a3221c0e103defc7c13681" + integrity sha512-LaSFwwkAtRGcgJxAyE7wYTJHQrfKHWpOO0ay1HQD8qRoTLBwE6+vTI4FTUZNf4TGgNPhLALn6Kv3FdYdgoIPUQ== + dependencies: + lodash.isplainobject "4.0.6" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +file-uri-to-path@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= + dependencies: + for-in "^1.0.1" + +foreach@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +ftp@~0.3.10: + version "0.3.10" + resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" + integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= + dependencies: + readable-stream "1.1.x" + xregexp "2.0.0" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-uri@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.3.tgz#fa13352269781d75162c6fc813c9e905323fbab5" + integrity sha512-x5j6Ks7FOgLD/GlvjKwgu7wdmMR55iuRHhn8hj/+gA+eSbxQvZ+AEomq+3MgVEZj1vpi738QahGbCCSIDtXtkw== + dependencies: + data-uri-to-buffer "2" + debug "4" + extend "~3.0.2" + file-uri-to-path "1" + ftp "~0.3.10" + readable-stream "3" + +git-up@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" + integrity sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw== + dependencies: + is-ssh "^1.3.0" + parse-url "^5.0.0" + +git-url-parse@11.1.2: + version "11.1.2" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.1.2.tgz#aff1a897c36cc93699270587bea3dbcbbb95de67" + integrity sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ== + dependencies: + git-up "^4.0.0" + +github-slugger@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.2.1.tgz#47e904e70bf2dccd0014748142d31126cfd49508" + integrity sha512-SsZUjg/P03KPzQBt7OxJPasGw6NRO5uOgiZ5RGXVud5iSIZ0eNZeNp5rTwCxtavrRUa/A77j8mePVc5lEvk0KQ== + dependencies: + emoji-regex ">=6.0.0 <=6.1.1" + +glob@^7.0.3, glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + 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" + +glob@~6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@*, graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" + integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== + +graphlib@^2.1.1, graphlib@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.7.tgz#b6a69f9f44bd9de3963ce6804a2fc9e73d86aecc" + integrity sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w== + dependencies: + lodash "^4.17.5" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.7.1: + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + +http-errors@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== + dependencies: + agent-base "4" + debug "3.1.0" + +https-proxy-agent@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz#271ea8e90f836ac9f119daccd39c19ff7dfb0793" + integrity sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + +i18n@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.8.3.tgz#2d8cf1c24722602c2041d01ba6ae5eaa51388f0e" + integrity sha1-LYzxwkciYCwgQdAbpq5eqlE4jw4= + dependencies: + debug "*" + make-plural "^3.0.3" + math-interval-parser "^1.1.0" + messageformat "^0.3.1" + mustache "*" + sprintf-js ">=1.0.3" + +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignorefs@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ignorefs/-/ignorefs-1.2.0.tgz#da59fb858976e4a5e43702ccd1f282fdbc9e5756" + integrity sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y= + dependencies: + editions "^1.3.3" + ignorepatterns "^1.1.0" + +ignorepatterns@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ignorepatterns/-/ignorepatterns-1.1.0.tgz#ac8f436f2239b5dfb66d5f0d3a904a87ac67cc5e" + integrity sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4= + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.0, ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@^6.2.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-ssh@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.1.tgz#f349a8cadd24e65298037a522cf7520f2e81a0f3" + integrity sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg== + dependencies: + protocols "^1.1.0" + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +jasmine-reporters@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz#898818ffc234eb8b3f635d693de4586f95548d43" + integrity sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A== + dependencies: + mkdirp "^0.5.1" + xmldom "^0.1.22" + +jasmine-xml-reporter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jasmine-xml-reporter/-/jasmine-xml-reporter-1.2.1.tgz#7caa2a51802fefedbe24b3ea8a7ad427c9ea7db3" + integrity sha1-fKoqUYAv7+2+JLPqinrUJ8nqfbM= + dependencies: + jasmine-reporters "^2.2.0" + +js-beautify@^1.6.4: + version "1.10.2" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.2.tgz#88c9099cd6559402b124cfab18754936f8a7b178" + integrity sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ== + dependencies: + config-chain "^1.1.12" + editorconfig "^0.15.3" + glob "^7.1.3" + mkdirp "~0.5.1" + nopt "~4.0.1" + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-pointer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.0.tgz#8e500550a6aac5464a473377da57aa6cc22828d7" + integrity sha1-jlAFUKaqxUZKRzN32leqbMIoKNc= + dependencies: + foreach "^2.0.4" + +json-schema-migrate@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/json-schema-migrate/-/json-schema-migrate-0.2.0.tgz#ba47a5b0072fc72396460e1bd60b44d52178bbc6" + integrity sha1-ukelsAcvxyOWRg4b1gtE1SF4u8Y= + dependencies: + ajv "^5.0.0" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +jszip@^3.1.5: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.2.tgz#b143816df7e106a9597a94c77493385adca5bd1d" + integrity sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" + +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" + integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + +lodash.assignin@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= + +lodash.clone@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= + +lodash.clonedeep@^4.3.0, lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.isplainobject@4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= + +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@^4.7.14: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +macos-release@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" + integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-plural@^3.0.3, make-plural@~3.0.3: + version "3.0.6" + resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-3.0.6.tgz#2033a03bac290b8f3bb91258f65b9df7e8b01ca7" + integrity sha1-IDOgO6wpC487uRJY9lud9+iwHKc= + optionalDependencies: + minimist "^1.2.0" + +matchit@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/matchit/-/matchit-1.0.8.tgz#9a129e38f79b2053dd75339215b19e1f6bb88efb" + integrity sha512-CwPPICzozd/ezCzpVwGYG5bMVieaapnA0vvHDQnmQ2u2vZtVLynoPmvFsZjL67hFOvTBhhpqSR0bq3uloDP/Rw== + dependencies: + "@arr/every" "^1.0.0" + +math-interval-parser@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-1.1.0.tgz#dbeda5b06b3249973c6df6170fde2386f0afd893" + integrity sha1-2+2lsGsySZc8bfYXD94jhvCv2JM= + dependencies: + xregexp "^2.0.0" + +messageformat@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-0.3.1.tgz#e58fff8245e9b3971799e5b43db58b3e9417f5a2" + integrity sha1-5Y//gkXps5cXmeW0PbWLPpQX9aI= + dependencies: + async "~1.5.2" + glob "~6.0.4" + make-plural "~3.0.3" + nopt "~3.0.6" + watchr "~2.4.13" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +"minimatch@2 || 3", minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mustache@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.1.0.tgz#9fba26e7aefc5709f07ff585abb7e0abced6c372" + integrity sha512-3Bxq1R5LBZp7fbFPZzFe5WN4s0q3+gxZaZuZVY+QctYJiCiVgXHOTIC0/HgZuOPFt/6BQcx5u0H2CUOxT/RoGQ== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nconf@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.10.0.tgz#da1285ee95d0a922ca6cee75adcf861f48205ad2" + integrity sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q== + dependencies: + async "^1.4.0" + ini "^1.3.0" + secure-keys "^1.0.0" + yargs "^3.19.0" + +needle@^2.2.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +netmask@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" + integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + +nopt@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-url@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-hash@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" + integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== + +object-inspect@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + +os-name@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +pac-proxy-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-3.0.0.tgz#11d578b72a164ad74bf9d5bac9ff462a38282432" + integrity sha512-AOUX9jES/EkQX2zRz0AW7lSx9jD//hQS8wFXBvcnd/J2Py9KaMJMqV/LPqJssj1tgGufotb2mmopGPR15ODv1Q== + dependencies: + agent-base "^4.2.0" + debug "^3.1.0" + get-uri "^2.0.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + pac-resolver "^3.0.0" + raw-body "^2.2.0" + socks-proxy-agent "^4.0.1" + +pac-resolver@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-3.0.0.tgz#6aea30787db0a891704deb7800a722a7615a6f26" + integrity sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA== + dependencies: + co "^4.6.0" + degenerator "^1.0.4" + ip "^1.1.5" + netmask "^1.0.6" + thunkify "^2.1.2" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pako@~1.0.2: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== + +parse-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.1.tgz#0ec769704949778cb3b8eda5e994c32073a1adff" + integrity sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA== + dependencies: + is-ssh "^1.3.0" + protocols "^1.4.0" + +parse-url@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.1.tgz#99c4084fc11be14141efa41b3d117a96fcb9527f" + integrity sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg== + dependencies: + is-ssh "^1.3.0" + normalize-url "^3.3.0" + parse-path "^4.0.0" + protocols "^1.4.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +phin@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/phin/-/phin-3.4.0.tgz#479df2ecfbbc2b8a6039852970b8b15a78da5169" + integrity sha512-wueoW9X6HbzBN4AqV3Etv9kkgYyaObwPTsIYsUEmgDWiLI6SzYozEsOZ5e3Hd/9H0mrIUbqUuvOTA6SCqErJrQ== + dependencies: + centra "^2.2.1" + +picomatch@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" + integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +polka@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/polka/-/polka-0.5.2.tgz#588bee0c5806dbc6c64958de3a1251860e9f2e26" + integrity sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw== + dependencies: + "@polka/url" "^0.5.0" + trouter "^2.0.1" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prettier@^1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" + integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +"promise@>=3.2 <8": + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +protocols@^1.1.0, protocols@^1.4.0: + version "1.4.7" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32" + integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== + +proxy-agent@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-3.1.0.tgz#3cf86ee911c94874de4359f37efd9de25157c113" + integrity sha512-IkbZL4ClW3wwBL/ABFD2zJ8iP84CY0uKMvBPk/OceQe/cEjrxzN1pMHsLwhbzUoRhG9QbSxYC+Z7LBkTiBNvrA== + dependencies: + agent-base "^4.2.0" + debug "^3.1.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + lru-cache "^4.1.2" + pac-proxy-agent "^3.0.0" + proxy-from-env "^1.0.0" + socks-proxy-agent "^4.0.1" + +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +raw-body@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@1.1.x: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + 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" + +readdirp@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.3.tgz#d6e011ed5b9240a92f08651eeb40f7942ceb6cc1" + integrity sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q== + dependencies: + picomatch "^2.0.4" + +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +require-from-string@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rxjs@^6.4.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safefs@^3.1.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/safefs/-/safefs-3.2.2.tgz#8170c1444d7038e08caea05a374fae2fa349e15c" + integrity sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw= + dependencies: + graceful-fs "*" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0, sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scandirectory@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/scandirectory/-/scandirectory-2.5.0.tgz#6ce03f54a090b668e3cbedbf20edf9e310593e72" + integrity sha1-bOA/VKCQtmjjy+2/IO354xBZPnI= + dependencies: + ignorefs "^1.0.0" + safefs "^3.1.2" + taskgroup "^4.0.5" + +secure-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca" + integrity sha1-8MgtmKOxOah3aogIBQuCRDEIf8o= + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +semver@^5.0.3, semver@^5.1.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +set-immediate-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" + integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +smart-buffer@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.2.tgz#5207858c3815cc69110703c6b94e46c15634395d" + integrity sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw== + +snyk-config@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-2.2.3.tgz#8e09bb98602ad044954d30a9fc1695ab5b6042fa" + integrity sha512-9NjxHVMd1U1LFw66Lya4LXgrsFUiuRiL4opxfTFo0LmMNzUoU5Bk/p0zDdg3FE5Wg61r4fP2D8w+QTl6M8CGiw== + dependencies: + debug "^3.1.0" + lodash "^4.17.15" + nconf "^0.10.0" + +snyk-docker-plugin@1.29.1: + version "1.29.1" + resolved "https://registry.yarnpkg.com/snyk-docker-plugin/-/snyk-docker-plugin-1.29.1.tgz#4ae989e5084eef744b371f88b2890a8d971ab871" + integrity sha512-Mucc1rZ7l0U8Dykr5m6HPjau8b2H8JVtVaXGbKSZD6e/47JDJhudkgrWjsS5Yt/Zdp1weE3+4SguftFiVR971A== + dependencies: + debug "^4.1.1" + dockerfile-ast "0.0.16" + semver "^6.1.0" + tslib "^1" + +snyk-go-parser@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/snyk-go-parser/-/snyk-go-parser-1.3.1.tgz#427387507578baf008a3e73828e0e53ed8c796f3" + integrity sha512-jrFRfIk6yGHFeipGD66WV9ei/A/w/lIiGqI80w1ndMbg6D6M5pVNbK7ngDTmo4GdHrZDYqx/VBGBsUm2bol3Rg== + dependencies: + toml "^3.0.0" + tslib "^1.9.3" + +snyk-go-plugin@1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/snyk-go-plugin/-/snyk-go-plugin-1.11.1.tgz#cd7c73c42bd3cf5faa2a90a54cd7c6db926fea5d" + integrity sha512-IsNi7TmpHoRHzONOWJTT8+VYozQJnaJpKgnYNQjzNm2JlV8bDGbdGQ1a8LcEoChxnJ8v8aMZy7GTiQyGGABtEQ== + dependencies: + debug "^4.1.1" + graphlib "^2.1.1" + snyk-go-parser "1.3.1" + tmp "0.0.33" + tslib "^1.10.0" + +snyk-gradle-plugin@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/snyk-gradle-plugin/-/snyk-gradle-plugin-3.1.0.tgz#7e24b5da2210f18e2476a94a3b5586405c3ac262" + integrity sha512-789Rqyhv1+WYbfy1Qilgsw0FMccedSaCO5n+54CXXGVUZWMsVvqJj3T8k7+vis+9Eq+Sgbdzti8vDtApz6rWWQ== + dependencies: + "@snyk/cli-interface" "^2.1.0" + "@types/debug" "^4.1.4" + chalk "^2.4.2" + clone-deep "^0.3.0" + debug "^4.1.1" + tmp "0.0.33" + tslib "^1.9.3" + +snyk-module@1.9.1, snyk-module@^1.6.0, snyk-module@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/snyk-module/-/snyk-module-1.9.1.tgz#b2a78f736600b0ab680f1703466ed7309c980804" + integrity sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA== + dependencies: + debug "^3.1.0" + hosted-git-info "^2.7.1" + +snyk-mvn-plugin@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/snyk-mvn-plugin/-/snyk-mvn-plugin-2.4.0.tgz#b653050a4095feccffc1b9387dc3a3f2f1aa69da" + integrity sha512-Fmt6Mjx6zZz+4q6PnBkhuNGhEX++q/pKMI26ls4p3JPkx4KxBz89oncpkmf7P8YCkoaka8oHhtDEv/R4Z9LleQ== + dependencies: + lodash "^4.17.15" + tslib "1.9.3" + +snyk-nodejs-lockfile-parser@1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.16.0.tgz#1c1d0aba4643830901ef999415816e7a92b0974d" + integrity sha512-cf3uozRXEG88nsjOQlo+SfOJPpcLs45qpnuk2vhBBZ577IMnV+fTOJQsP2YRiikLUbdgkVlduviwUO6OVn1PhA== + dependencies: + "@yarnpkg/lockfile" "^1.0.2" + graphlib "^2.1.5" + lodash "^4.17.14" + source-map-support "^0.5.7" + tslib "^1.9.3" + uuid "^3.3.2" + +snyk-nuget-plugin@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/snyk-nuget-plugin/-/snyk-nuget-plugin-1.12.1.tgz#a57becf9e60593f8b94c4b8717069521748b9a2e" + integrity sha512-QuANQxBjTGj3hEf2YpEQ0WuI4Yq/93boqWUs4eoSTfDyBRFgIkUP6fLkzNldrkL8fQbcagqQ2Xz8M9IEKRQtMg== + dependencies: + debug "^3.1.0" + dotnet-deps-parser "4.5.0" + jszip "^3.1.5" + lodash "^4.17.14" + snyk-paket-parser "1.5.0" + tslib "^1.9.3" + xml2js "^0.4.17" + +snyk-paket-parser@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/snyk-paket-parser/-/snyk-paket-parser-1.5.0.tgz#a0e96888d9d304b1ae6203a0369971575f099548" + integrity sha512-1CYMPChJ9D9LBy3NLqHyv8TY7pR/LMISSr08LhfFw/FpfRZ+gTH8W6bbxCmybAYrOFNCqZkRprqOYDqZQFHipA== + dependencies: + tslib "^1.9.3" + +snyk-php-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/snyk-php-plugin/-/snyk-php-plugin-1.6.4.tgz#c3470aea2f185d2f3417cfc5e966ecf7fd1efa20" + integrity sha512-FFQeimtbwq17nDUS0o0zuKgyjXSX7SpoC9iYTeKvxTXrmKf2QlxTtPvmMM4/hQxehEu1i40ow1Ozw0Ahxm8Dpw== + dependencies: + "@snyk/composer-lockfile-parser" "1.0.3" + tslib "1.9.3" + +snyk-policy@1.13.5: + version "1.13.5" + resolved "https://registry.yarnpkg.com/snyk-policy/-/snyk-policy-1.13.5.tgz#c5cf262f759879a65ab0810dd58d59c8ec7e9e47" + integrity sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ== + dependencies: + debug "^3.1.0" + email-validator "^2.0.4" + js-yaml "^3.13.1" + lodash.clonedeep "^4.5.0" + semver "^6.0.0" + snyk-module "^1.9.1" + snyk-resolve "^1.0.1" + snyk-try-require "^1.3.1" + then-fs "^2.0.0" + +snyk-python-plugin@^1.13.3: + version "1.13.3" + resolved "https://registry.yarnpkg.com/snyk-python-plugin/-/snyk-python-plugin-1.13.3.tgz#34587001de2cca8fb400f3f21110c29b39a80e83" + integrity sha512-Ud7mHmpMG4uCChvYLx5jA8HwOV/FNpT65xTxSt+6wsOjIUTuLiqM86mbvgzgk3pir8vMP9yQEsCi1i0zYLBArw== + dependencies: + "@snyk/cli-interface" "^2.0.3" + tmp "0.0.33" + +snyk-resolve-deps@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/snyk-resolve-deps/-/snyk-resolve-deps-4.4.0.tgz#ef20fb578a4c920cc262fb73dd292ff21215f52d" + integrity sha512-aFPtN8WLqIk4E1ulMyzvV5reY1Iksz+3oPnUVib1jKdyTHymmOIYF7z8QZ4UUr52UsgmrD9EA/dq7jpytwFoOQ== + dependencies: + "@types/node" "^6.14.4" + "@types/semver" "^5.5.0" + ansicolors "^0.3.2" + debug "^3.2.5" + lodash.assign "^4.2.0" + lodash.assignin "^4.2.0" + lodash.clone "^4.5.0" + lodash.flatten "^4.4.0" + lodash.get "^4.4.2" + lodash.set "^4.3.2" + lru-cache "^4.0.0" + semver "^5.5.1" + snyk-module "^1.6.0" + snyk-resolve "^1.0.0" + snyk-tree "^1.0.0" + snyk-try-require "^1.1.1" + then-fs "^2.0.0" + +snyk-resolve@1.0.1, snyk-resolve@^1.0.0, snyk-resolve@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/snyk-resolve/-/snyk-resolve-1.0.1.tgz#eaa4a275cf7e2b579f18da5b188fe601b8eed9ab" + integrity sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw== + dependencies: + debug "^3.1.0" + then-fs "^2.0.0" + +snyk-sbt-plugin@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/snyk-sbt-plugin/-/snyk-sbt-plugin-2.8.0.tgz#6812e1df1c311e99a7aa565559032c7511d1e4d4" + integrity sha512-ZzyBdND5CsaO0xkv05geZXu8Dd6Llvr/5oTj811U7h7UmrvljrAiABW4RGjRJPrPVuuJaDej2p633sgGtK9UsA== + dependencies: + semver "^6.1.2" + tmp "^0.1.0" + tree-kill "^1.2.1" + tslib "^1.10.0" + +snyk-tree@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/snyk-tree/-/snyk-tree-1.0.0.tgz#0fb73176dbf32e782f19100294160448f9111cc8" + integrity sha1-D7cxdtvzLngvGRAClBYESPkRHMg= + dependencies: + archy "^1.0.0" + +snyk-try-require@1.3.1, snyk-try-require@^1.1.1, snyk-try-require@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/snyk-try-require/-/snyk-try-require-1.3.1.tgz#6e026f92e64af7fcccea1ee53d524841e418a212" + integrity sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI= + dependencies: + debug "^3.1.0" + lodash.clonedeep "^4.3.0" + lru-cache "^4.0.0" + then-fs "^2.0.0" + +snyk@^1.226.1: + version "1.234.0" + resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.234.0.tgz#b368d9a2c137778ff5f84bb600fbe312a1515068" + integrity sha512-A/F6hB/Gyh7bxAueXxuF9/tvQ5xyrma5v6SnEY5ZBRGJtpIcolVY0KQRgbbjTRjYuO/2vI5Kd1vVhSj6WGud3g== + dependencies: + "@snyk/cli-interface" "^2.0.3" + "@snyk/dep-graph" "1.12.0" + "@snyk/gemfile" "1.2.0" + "@snyk/snyk-cocoapods-plugin" "1.0.3" + "@types/agent-base" "^4.2.0" + "@types/restify" "^4.3.6" + abbrev "^1.1.1" + ansi-escapes "3.2.0" + chalk "^2.4.2" + configstore "^3.1.2" + debug "^3.1.0" + diff "^4.0.1" + git-url-parse "11.1.2" + glob "^7.1.3" + inquirer "^6.2.2" + lodash "^4.17.14" + needle "^2.2.4" + opn "^5.5.0" + os-name "^3.0.0" + proxy-from-env "^1.0.0" + semver "^6.0.0" + snyk-config "^2.2.1" + snyk-docker-plugin "1.29.1" + snyk-go-plugin "1.11.1" + snyk-gradle-plugin "3.1.0" + snyk-module "1.9.1" + snyk-mvn-plugin "2.4.0" + snyk-nodejs-lockfile-parser "1.16.0" + snyk-nuget-plugin "1.12.1" + snyk-php-plugin "1.6.4" + snyk-policy "1.13.5" + snyk-python-plugin "^1.13.3" + snyk-resolve "1.0.1" + snyk-resolve-deps "4.4.0" + snyk-sbt-plugin "2.8.0" + snyk-tree "^1.0.0" + snyk-try-require "1.3.1" + source-map-support "^0.5.11" + strip-ansi "^5.2.0" + tempfile "^2.0.0" + then-fs "^2.0.0" + update-notifier "^2.5.0" + uuid "^3.3.2" + wrap-ansi "^5.1.0" + +socks-proxy-agent@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" + integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== + dependencies: + agent-base "~4.2.1" + socks "~2.3.2" + +socks@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e" + integrity sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ== + dependencies: + ip "^1.1.5" + smart-buffer "4.0.2" + +source-map-support@^0.5.11, source-map-support@^0.5.7: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@>=1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trimleft@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" + integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" + integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +taskgroup@^4.0.5, taskgroup@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/taskgroup/-/taskgroup-4.3.1.tgz#7de193febd768273c457730497024d512c27915a" + integrity sha1-feGT/r12gnPEV3MElwJNUSwnkVo= + dependencies: + ambi "^2.2.0" + csextends "^1.0.3" + +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +tempfile@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" + integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU= + dependencies: + temp-dir "^1.0.0" + uuid "^3.0.1" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +then-fs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/then-fs/-/then-fs-2.0.0.tgz#72f792dd9d31705a91ae19ebfcf8b3f968c81da2" + integrity sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI= + dependencies: + promise ">=3.2 <8" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunkify@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" + integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmp@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +tree-kill@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" + integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== + +trouter@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/trouter/-/trouter-2.0.1.tgz#2726a5f8558e090d24c3a393f09eaab1df232df6" + integrity sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ== + dependencies: + matchit "^1.0.0" + +tslib@1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + +tslib@^1, tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +typechecker@^2.0.8: + version "2.1.0" + resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.1.0.tgz#d1c2093a54ff8a19f58cff877eeaa54f2242d383" + integrity sha1-0cIJOlT/ihn1jP+HfuqlTyJC04M= + +typechecker@^4.3.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-4.7.0.tgz#5249f427358f45b7250c4924fd4d01ed9ba435e9" + integrity sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ== + dependencies: + editions "^2.1.0" + +typechecker@~2.0.1: + version "2.0.8" + resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.0.8.tgz#e83da84bb64c584ccb345838576c40b0337db82e" + integrity sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4= + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +uuid@^3.0.1, uuid@^3.3.2, uuid@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + +valid-url@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" + integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= + +vscode-languageserver-types@^3.5.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz#d3b5952246d30e5241592b6dde8280e03942e743" + integrity sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A== + +watchr@~2.4.13: + version "2.4.13" + resolved "https://registry.yarnpkg.com/watchr/-/watchr-2.4.13.tgz#d74847bb4d6f90f61fe2c74f9f68662aa0e07601" + integrity sha1-10hHu01vkPYf4sdPn2hmKqDgdgE= + dependencies: + eachr "^2.0.2" + extendr "^2.1.0" + extract-opts "^2.2.0" + ignorefs "^1.0.0" + safefs "^3.1.2" + scandirectory "^2.5.0" + taskgroup "^4.2.0" + typechecker "^2.0.8" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +window-size@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= + +windows-release@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" + integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== + dependencies: + execa "^1.0.0" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^2.0.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xml2js@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== + dependencies: + sax ">=0.6.0" + xmlbuilder "~9.0.1" + +xml2js@^0.4.17: + version "0.4.22" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02" + integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw== + dependencies: + sax ">=0.6.0" + util.promisify "~1.0.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmldom@^0.1.22: + version "0.1.27" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + +xregexp@2.0.0, xregexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" + integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= + +y18n@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yargs@^3.19.0: + version "3.32.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= + dependencies: + camelcase "^2.0.1" + cliui "^3.0.3" + decamelize "^1.1.1" + os-locale "^1.4.0" + string-width "^1.0.1" + window-size "^0.1.4" + y18n "^3.2.0" From ff7456d16f6253da4a1d406cdf20a04652c895e6 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 9 Oct 2019 14:49:08 -0700 Subject: [PATCH 002/936] Adding manifest readme and updated the sample integration --- MANIFEST.md | 731 ++++++++++++++++++ README.md | 7 +- datadog/assets/images/rectangular.svg | 0 datadog/assets/images/square.svg | 0 datadog/templates/template.json | 0 package.json | 2 +- {datadog => sample-integration}/LICENSE.md | 0 {datadog => sample-integration}/README.md | 0 .../assets/images/rectangular.svg | 5 + sample-integration/assets/images/square.svg | 4 + {datadog => sample-integration}/manifest.json | 28 +- sample-integration/templates/template.json | 7 + 12 files changed, 768 insertions(+), 16 deletions(-) create mode 100644 MANIFEST.md delete mode 100644 datadog/assets/images/rectangular.svg delete mode 100644 datadog/assets/images/square.svg delete mode 100644 datadog/templates/template.json rename {datadog => sample-integration}/LICENSE.md (100%) rename {datadog => sample-integration}/README.md (100%) create mode 100644 sample-integration/assets/images/rectangular.svg create mode 100644 sample-integration/assets/images/square.svg rename {datadog => sample-integration}/manifest.json (53%) create mode 100644 sample-integration/templates/template.json diff --git a/MANIFEST.md b/MANIFEST.md new file mode 100644 index 00000000..cb85b31c --- /dev/null +++ b/MANIFEST.md @@ -0,0 +1,731 @@ +# LaunchDarkly Integrations Manifest Schema + +``` +https://launchdarkly.com/schemas/v1.0/integrations +``` + +Describes the capabilities and intent of a LaunchDarkly integration + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Defined In | +| ------------------- | ---------- | ------------ | ------------ | ----------------- | --------------------- | -------------------------------------------- | +| Can be instantiated | Yes | Experimental | No | Forbidden | Permitted | [manifest.schema.json](manifest.schema.json) | + +# LaunchDarkly Integrations Manifest Definitions + +| Property | Type | Group | +| --------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------- | +| [acceptedAs](#acceptedas) | `object` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | +| [defaultPolicy](#defaultpolicy) | `object[]` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | +| [hint](#hint) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | +| [label](#label) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | +| [method](#method) | `enum` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | +| [prefix](#prefix) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/accepted-as-header` | +| [receivingEndpoint](#receivingendpoint) | reference | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | +| [templates](#templates) | `object` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | +| [type](#type) | `enum` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/accepted-as-query-param` | + +## acceptedAs + +### Token accepted as... + +Specify how your token should be provided in the request to your service + +`acceptedAs` + +- is **required** +- type: `object` +- defined in this schema + +### acceptedAs Type + +`object` with following properties: + +| Property | Type | Required | +| -------- | ---- | -------- | + + +## defaultPolicy + +### Default Policy + +LaunchDarkly policy that allows you to filter events sent to your webhook. See +https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. + +`defaultPolicy` + +- is optional +- type: `object[]` +- defined in this schema + +### defaultPolicy Type + +Array type: `object[]` + +All items must be of the type: `object` with following properties: + +| Property | Type | Required | Default | +| -------------- | ------ | -------- | --------- | +| `actions` | array | Optional | `["*"]` | +| `effect` | string | Optional | `"allow"` | +| `notActions` | array | Optional | `["*"]` | +| `notResources` | array | Optional | `["*"]` | +| `resources` | array | Optional | `["*"]` | + +#### actions + +##### Actions + +A list of action specifiers defining the actions to which the statement applies. See +https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. + +`actions` + +- is optional +- type: `string[]` +- default: `["*"]` + +##### actions Type + +Array type: `string[]` + +All items must be of the type: `string` + +##### actions Examples + +```json +updateOn +``` + +```json +createFlag +``` + +```json +updateRules +``` + +```json +updateTargets +``` + +#### effect + +##### Effect + +This attribute defines whether the statement allows or denies access to the named resources and actions. + +`effect` + +- is optional +- type: `enum` +- default: `"allow"` + +The value of this property **must** be equal to one of the [known values below](#defaultpolicy-known-values). + +##### effect Known Values + +| Value | Description | +| ------- | ----------- | +| `allow` | | +| `deny` | | + +#### notActions + +##### Not actions + +A list of action specifiers defining the actions to which the statement does not apply. See +https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. + +`notActions` + +- is optional +- type: `string[]` +- default: `["*"]` + +##### notActions Type + +Array type: `string[]` + +All items must be of the type: `string` + +##### notActions Examples + +```json +createFlag +``` + +```json +deleteFlag +``` + +```json +cloneFlag +``` + +#### notResources + +##### Not resources + +A list of resource specifiers defining the resources to which the statement does not apply. See +https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. + +`notResources` + +- is optional +- type: `string[]` +- default: `["*"]` + +##### notResources Type + +Array type: `string[]` + +All items must be of the type: `string` + +##### notResources Example + +```json +proj/*:env/production:flag/* +``` + +#### resources + +##### Resources + +A list of resource specifiers defining the resources to which the statement applies. See +https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. + +`resources` + +- is optional +- type: `string[]` +- default: `["*"]` + +##### resources Type + +Array type: `string[]` + +All items must be of the type: `string` + +##### resources Example + +```json +proj/*:env/production:flag/* +``` + +A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. + +## hint + +### Hint + +A placeholder hint used in the LaunchDarkly UI describing your token + +`hint` + +- is **required** +- type: `string` +- defined in this schema + +### hint Type + +`string` + +### hint Example + +```json +"Enter API key from your SpaceXYZ account" +``` + +## label + +### Token + +Label to use in the LaunchDarkly UI describing you token + +`label` + +- is **required** +- type: `string` +- defined in this schema + +### label Type + +`string` + +### label Examples + +```json +"API key" +``` + +```json +"API token" +``` + +## method + +### HTTP method + +HTTP method to use when LaunchDarkly makes the request to your endpoint + +`method` + +- is **required** +- type: `enum` +- defined in this schema + +The value of this property **must** be equal to one of the [known values below](#method-known-values). + +### method Known Values + +| Value | Description | +| ------- | ----------- | +| `post` | | +| `put` | | +| `patch` | | + +## prefix + +### Header value prefix + +If your token needs to be padded with a prefix, specify it here + +`prefix` + +- is optional +- type: `string` +- defined in this schema + +### prefix Type + +`string` + +### prefix Example + +```json +"Bearer " +``` + +## receivingEndpoint + +### Endpoint URL + +URL where you'd like LaunchDarkly to send webhooks to + +`receivingEndpoint` + +- is **required** +- type: reference +- defined in this schema + +### receivingEndpoint Type + +- []() – `#/definitions/https-url` + +## templates + +### Webhook body template + +Templates to use for body of the webhook request + +`templates` + +- is optional +- type: `object` +- defined in this schema + +### templates Type + +`object` with following properties: + +| Property | Type | Required | +| -------- | ---- | -------- | + + +## type + +### Type + +Specify the method in which your token is provided in the request. In most cases, tokens are either passed through +query parameter or a header. + +`type` + +- is **required** +- type: `enum` +- defined in this schema + +The value of this property **must** be equal to one of the [known values below](#type-known-values). + +### type Known Values + +| Value | Description | +| ------------- | ----------- | +| `query-param` | | + +# LaunchDarkly Integrations Manifest Properties + +| Property | Type | Required | Nullable | Defined by | +| --------------------------------- | --------- | ------------ | -------- | ------------------------------------------------ | +| [authentication](#authentication) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [categories](#categories) | reference | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [description](#description) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [icons](#icons) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [links](#links) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [name](#name) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [overview](#overview) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [version](#version) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| `*` | any | Additional | Yes | this schema _allows_ additional properties | + +## authentication + +### Authentication + +Specify the authentication method required by your integration + +`authentication` + +- is **required** +- type: `object` +- defined in this schema + +### authentication Type + +`object` with following properties: + +| Property | Type | Required | +| -------- | ---- | -------- | + + +## author + +### Author + +Name of the author or organization responsible for the integration + +`author` + +- is **required** +- type: `string` +- defined in this schema + +### author Type + +`string` + +- minimum length: 3 characters +- maximum length: 100 characters All instances must conform to this regular expression (test examples + [here]()): + +```regex +^(.*)$ +``` + +## capabilities + +### Capabilities + +Specify which capabilities you'd like your integration to have + +`capabilities` + +- is **required** +- type: `object` +- defined in this schema + +### capabilities Type + +`object` with following properties: + +| Property | Type | Required | +| -------- | ---- | -------- | + + +## categories + +### Categories + +Categories that describe your integration + +`categories` + +- is **required** +- type: reference +- between `1` and `3` items in the array +- defined in this schema + +### categories Type + +Array type: reference + +All items must be of the type: + +- []() – `#/definitions/category` + +## description + +### Long description + +A longer description of your integration + +`description` + +- is **required** +- type: `string` +- defined in this schema + +### description Type + +`string` + +- minimum length: 50 characters +- maximum length: 2048 characters All instances must conform to this regular expression (test examples + [here]()): + +```regex +^(.*)$ +``` + +## icons + +### Icons + +Logos describing your integration in SVG format + +`icons` + +- is **required** +- type: `object` +- defined in this schema + +### icons Type + +`object` with following properties: + +| Property | Type | Required | +| ------------- | ------ | ------------ | +| `rectangular` | string | **Required** | +| `square` | string | **Required** | + +#### rectangular + +##### Rectangular logo + +A rectangular version of your integration's logo in SVG format + +`rectangular` + +- is **required** +- type: `string` + +##### rectangular Type + +`string` + +All instances must conform to this regular expression (test examples +[here](https://regexr.com/?expression=%5C.svg%24)): + +```regex +\.svg$ +``` + +#### square + +##### Square logo + +A square version of your integration's logo in SVG format + +`square` + +- is **required** +- type: `string` + +##### square Type + +`string` + +All instances must conform to this regular expression (test examples +[here](https://regexr.com/?expression=%5C.svg%24)): + +```regex +\.svg$ +``` + +## links + +### Links + +A set of reference links supporting your integration + +`links` + +- is **required** +- type: `object` +- defined in this schema + +### links Type + +`object` with following properties: + +| Property | Type | Required | +| ---------------- | ------ | ------------ | +| `privacyPolicy` | | **Required** | +| `site` | | **Required** | +| `supportEmail` | string | **Required** | +| `supportWebsite` | | Optional | + +#### privacyPolicy + +##### Privacy Policy + +URL to your organization's privacy policy + +`privacyPolicy` + +- is **required** +- type: reference + +##### privacyPolicy Type + +- []() – `#/definitions/https-url` + +#### site + +##### Website + +URL to your website + +`site` + +- is **required** +- type: reference + +##### site Type + +- []() – `#/definitions/https-url` + +#### supportEmail + +##### Support Email + +Email address for your integration's support + +`supportEmail` + +- is **required** +- type: `string` + +##### supportEmail Type + +`string` + +- format: `email` – email address (according to [RFC 5322, section 3.4.1](https://tools.ietf.org/html/rfc5322)) + +#### supportWebsite + +##### Support Website + +URL to your integration's support website + +`supportWebsite` + +- is optional +- type: reference + +##### supportWebsite Type + +- []() – `#/definitions/https-url` + +## name + +### Integration name + +Your integration's name. No spaces + +`name` + +- is **required** +- type: `string` +- defined in this schema + +### name Type + +`string` + +- minimum length: 3 characters +- maximum length: 50 characters All instances must conform to this regular expression (test examples + [here](https://regexr.com/?expression=%5E%5CS*%24)): + +```regex +^\S*$ +``` + +## overview + +### Short description + +A short-one liner describing your integration + +`overview` + +- is **required** +- type: `string` +- defined in this schema + +### overview Type + +`string` + +- minimum length: 10 characters +- maximum length: 100 characters All instances must conform to this regular expression (test examples + [here]()): + +```regex +^(.*)$ +``` + +## version + +### Version + +A semantic version of the integration + +`version` + +- is **required** +- type: `string` +- defined in this schema + +### version Type + +`string` + +- minimum length: 5 characters +- maximum length: 14 characters All instances must conform to this regular expression + +```regex +^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$ +``` + +- test example: + [0.0.1]() +- test example: + [1.0.0]() +- test example: + [1.0.1-beta]() + +### version Examples + +```json +"0.0.1" +``` + +```json +"1.0.0" +``` + +```json +"1.0.1-beta" +``` diff --git a/README.md b/README.md index 0fc5f611..291881e8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,12 @@ consume events from LaunchDarkly in order to provide their users more context. ## Building integrations -TODO +There are a few steps to creating an integration with LaunchDarkly. + +1. Fork this repository. +2. Create a new top level directory named after your organization or integration's name (e.g., `spacexyz`). +3. Create a `manifest.json` inside your new directory. [Read the `manifest.json` documentation](./MANIFEST.md) for the details. + A LaunchDarkly integration starts with a `manifest.json`. This file describes the intent and capabilities of your integration. ## Submitting your integrations diff --git a/datadog/assets/images/rectangular.svg b/datadog/assets/images/rectangular.svg deleted file mode 100644 index e69de29b..00000000 diff --git a/datadog/assets/images/square.svg b/datadog/assets/images/square.svg deleted file mode 100644 index e69de29b..00000000 diff --git a/datadog/templates/template.json b/datadog/templates/template.json deleted file mode 100644 index e69de29b..00000000 diff --git a/package.json b/package.json index aa34e7d9..509235ef 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", "main": "index.js", "scripts": { - "prepare": "jsonschema2md -d _schemas -o ." + "prepare": "jsonschema2md -d _schemas -o . -x - -n && mv manifest.schema.md MANIFEST.md" }, "repository": { "type": "git", diff --git a/datadog/LICENSE.md b/sample-integration/LICENSE.md similarity index 100% rename from datadog/LICENSE.md rename to sample-integration/LICENSE.md diff --git a/datadog/README.md b/sample-integration/README.md similarity index 100% rename from datadog/README.md rename to sample-integration/README.md diff --git a/sample-integration/assets/images/rectangular.svg b/sample-integration/assets/images/rectangular.svg new file mode 100644 index 00000000..9a3b9639 --- /dev/null +++ b/sample-integration/assets/images/rectangular.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/sample-integration/assets/images/square.svg b/sample-integration/assets/images/square.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/sample-integration/assets/images/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/datadog/manifest.json b/sample-integration/manifest.json similarity index 53% rename from datadog/manifest.json rename to sample-integration/manifest.json index 08eefa5e..8532175a 100644 --- a/datadog/manifest.json +++ b/sample-integration/manifest.json @@ -1,14 +1,14 @@ { - "$schema": "../_tests/manifestSchema.json", - "name": "SpaceXYZ", + "$schema": "../_schemas/manifest.schema.json", + "name": "sample-integration", "version": "1.0.0", "overview": "Short one-liner describing your integration", "description": "Send flag data to space. Markdown based description.", - "author": "SpaceXYZ", + "author": "LaunchDarkly", "links": { - "site": "https://spacexyz.com/launchdarkly", - "privacyPolicy": "https://spacexyz.com/privacy", - "supportEmail": "support@spacexyz.com" + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy", + "supportEmail": "support@example.com" }, "categories": ["apm", "monitoring", "alerts"], "icons": { @@ -18,21 +18,21 @@ "authentication": { "type": "token", "label": "API key", - "hint": "Enter API key from your [SpaceXYZ account](https://spacexyz.com/api)", + "hint": "Enter API key from your account", "acceptedAs": { - "type": "query-param", - "name": "token" + "type": "header", + "name": "X-Custom-Auth" } }, "capabilities": { "auditLogEventsHook": { - "receivingEndpoint": "https://spaceXYZ.com/webhookin", + "receivingEndpoint": "https://example.com/webhookin", "method": "post", "templates": { - "flag": "templates/flag.json", - "project": "templates/project.json", - "environment": "templates/environment.json", - "metric": "templates/metric.json" + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" }, "defaultPolicy": [ { diff --git a/sample-integration/templates/template.json b/sample-integration/templates/template.json new file mode 100644 index 00000000..2d785a1f --- /dev/null +++ b/sample-integration/templates/template.json @@ -0,0 +1,7 @@ +{ + "title": "{{summary}}", + "text": "{{memberName}} {{action}} {{resourceName}}", + "date_happened": "{{dateHappened}}", + "tags": ["any", "arbitrary", "tag"], + "source_type_name": "example.com" +} From 9dfe954aac96e2f3336b5c5d89d1db990abcf58e Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 9 Oct 2019 14:52:30 -0700 Subject: [PATCH 003/936] Make sure manifest.schema.json is at root --- README.md | 16 +- manifest.schema.json | 502 +++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 3 files changed, 513 insertions(+), 7 deletions(-) create mode 100644 manifest.schema.json diff --git a/README.md b/README.md index 291881e8..18217685 100644 --- a/README.md +++ b/README.md @@ -11,15 +11,19 @@ consume events from LaunchDarkly in order to provide their users more context. There are a few steps to creating an integration with LaunchDarkly. 1. Fork this repository. -2. Create a new top level directory named after your organization or integration's name (e.g., `spacexyz`). -3. Create a `manifest.json` inside your new directory. [Read the `manifest.json` documentation](./MANIFEST.md) for the details. - A LaunchDarkly integration starts with a `manifest.json`. This file describes the intent and capabilities of your integration. +2. Create a new top level directory named after your organization or + integration's name (e.g., `spacexyz`). +3. Create a `manifest.json` inside your new directory. [Read the `manifest.json` + documentation](./MANIFEST.md) for the details. + +A LaunchDarkly integration starts with a `manifest.json`. This file describes +the intent and capabilities of your integration. ## Submitting your integrations -After you've forked this repository and created your integration, send us a pull -request. Your branch will be validated and reviewed by someone on our team. Once -everything checks out, we'll publish your integration. +Once you're done with your integration, send us a pull request. Your branch will +be validated and reviewed by someone on our team. Once everything checks out, +we'll publish your integration. ## Got issues? diff --git a/manifest.schema.json b/manifest.schema.json new file mode 100644 index 00000000..b7f5d1d2 --- /dev/null +++ b/manifest.schema.json @@ -0,0 +1,502 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://launchdarkly.com/schemas/v1.0/integrations", + "title": "LaunchDarkly Integrations Manifest", + "description": "Describes the capabilities and intent of a LaunchDarkly integration", + "type": "object", + "properties": { + "name": { + "$id": "#/properties/name", + "title": "Integration name", + "description": "Your integration's name. No spaces", + "minLength": 3, + "maxLength": 50, + "type": "string", + "pattern": "^\\S*$" + }, + "version": { + "$id": "#/properties/version", + "title": "Version", + "description": "A semantic version of the integration", + "examples": [ + "0.0.1", + "1.0.0", + "1.0.1-beta" + ], + "$ref": "#/definitions/semver" + }, + "overview": { + "$id": "#/properties/overview", + "title": "Short description", + "description": "A short-one liner describing your integration", + "type": "string", + "minLength": 10, + "maxLength": 100, + "pattern": "^(.*)$" + }, + "description": { + "$id": "#/properties/description", + "title": "Long description", + "description": "A longer description of your integration", + "type": "string", + "minLength": 50, + "maxLength": 2048, + "pattern": "^(.*)$" + }, + "author": { + "$id": "#/properties/author", + "title": "Author", + "description": "Name of the author or organization responsible for the integration", + "type": "string", + "minLength": 3, + "maxLength": 100, + "pattern": "^(.*)$" + }, + "links": { + "$id": "#/properties/links", + "title": "Links", + "description": "A set of reference links supporting your integration", + "type": "object", + "properties": { + "site": { + "$id": "#/properties/links/site", + "title": "Website", + "description": "URL to your website", + "$ref": "#/definitions/https-url" + }, + "privacyPolicy": { + "$id": "#/properties/links/privacy-policy", + "title": "Privacy Policy", + "description": "URL to your organization's privacy policy", + "$ref": "#/definitions/https-url" + }, + "supportEmail": { + "$id": "#/properties/links/support-email", + "title": "Support Email", + "description": "Email address for your integration's support", + "type": "string", + "format": "email" + }, + "supportWebsite": { + "$id": "#/properties/links/support-website", + "title": "Support Website", + "description": "URL to your integration's support website", + "$ref": "#/definitions/https-url" + } + }, + "required": [ + "site", + "privacyPolicy", + "supportEmail" + ] + }, + "categories": { + "$id": "#/properties/categories", + "title": "Categories", + "description": "Categories that describe your integration", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "maxItems": 3, + "items": { + "$ref": "#/definitions/category" + } + }, + "icons": { + "$id": "#/properties/icons", + "title": "Icons", + "description": "Logos describing your integration in SVG format", + "type": "object", + "properties": { + "square": { + "$id": "#/properties/icons/square", + "title": "Square logo", + "description": "A square version of your integration's logo in SVG format", + "type": "string", + "pattern": "\\.svg$" + }, + "rectangular": { + "$id": "#/properties/icons/rectangular", + "title": "Rectangular logo", + "description": "A rectangular version of your integration's logo in SVG format", + "type": "string", + "pattern": "\\.svg$" + } + }, + "required": [ + "square", + "rectangular" + ] + }, + "authentication": { + "$id": "#/properties/authentication", + "title": "Authentication", + "description": "Specify the authentication method required by your integration", + "type": "object", + "oneOf": [ + { + "$ref": "#/definitions/auth-none" + }, + { + "$ref": "#/definitions/auth-token" + } + ] + }, + "capabilities": { + "$id": "#/properties/capabilities", + "title": "Capabilities", + "description": "Specify which capabilities you'd like your integration to have", + "type": "object", + "anyOf": [ + { + "properties": { + "auditLogEventsHook": { + "$ref": "#/definitions/capability-audit-log-events-hook" + } + } + } + ], + "minProperties": 1 + } + }, + "required": [ + "name", + "version", + "overview", + "description", + "author", + "links", + "categories", + "icons", + "authentication", + "capabilities" + ], + "definitions": { + "semver": { + "type": "string", + "minLength": 5, + "maxLength": 14, + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + }, + "https-url": { + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "category": { + "type": "string", + "enum": [ + "alerts", + "analytics-and-reporting", + "apm", + "automation", + "communication-and-collaboration", + "config-and-deployment", + "exceptions", + "experimentation", + "hr-and-operations", + "issue-tracking", + "it-and-project-management", + "marketing-and-social-media", + "monitoring", + "orchestration", + "product-and-design", + "provisioning", + "security", + "source-control" + ] + }, + "auth-none": { + "properties": { + "type": { + "$id": "#/properties/authentication/type", + "title": "Auth Type", + "description": "Specify the authentication method required by your integration", + "type": "string", + "enum": [ + "none" + ] + } + }, + "required": [ + "type" + ], + "maxProperties": 1 + }, + "auth-token": { + "properties": { + "type": { + "$id": "#/properties/authentication/type", + "title": "Auth Type", + "description": "Specify the authentication method required by your integration", + "type": "string", + "enum": [ + "token" + ] + }, + "label": { + "$id": "#/properties/authentication/label", + "title": "Token", + "description": "Label to use in the LaunchDarkly UI describing you token", + "examples": [ + "API key", + "API token" + ], + "type": "string" + }, + "hint": { + "$id": "#/properties/authentication/hint", + "title": "Hint", + "description": "A placeholder hint used in the LaunchDarkly UI describing your token", + "examples": [ + "Enter API key from your SpaceXYZ account" + ], + "type": "string" + }, + "acceptedAs": { + "$id": "#/properties/authentication/acceptedAs", + "title": "Token accepted as...", + "description": "Specify how your token should be provided in the request to your service", + "type": "object", + "oneOf": [ + { + "$ref": "#/definitions/accepted-as-header" + }, + { + "$ref": "#/definitions/accepted-as-query-param" + } + ] + } + }, + "required": [ + "type", + "label", + "hint", + "acceptedAs" + ] + }, + "accepted-as-header": { + "properties": { + "type": { + "$id": "#/properties/authentication/acceptedAs/header-type", + "title": "Type", + "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", + "type": "string", + "enum": [ + "header" + ] + }, + "name": { + "$id": "#/properties/authentication/acceptedAs/type/header-name", + "title": "Header name", + "description": "Specify the name of the header you'd like to use", + "type": "string", + "examples": [ + "Authorization", + "X-SpaceXYZ-Auth" + ], + "minLength": 1 + }, + "prefix": { + "$id": "#/properties/authentication/acceptedAs/type/header-value-prefix", + "title": "Header value prefix", + "description": "If your token needs to be padded with a prefix, specify it here", + "type": "string", + "examples": [ + "Bearer " + ] + } + }, + "required": [ + "type", + "name" + ] + }, + "accepted-as-query-param": { + "properties": { + "type": { + "$id": "#/properties/authentication/acceptedAs/query-param-type", + "title": "Type", + "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", + "type": "string", + "enum": [ + "query-param" + ] + }, + "name": { + "$id": "#/properties/authentication/acceptedAs/type/query-param-name", + "title": "Query parameter name", + "description": "Specify the name of the query parameter you'd like to use", + "type": "string", + "examples": [ + "token", + "key" + ], + "minLength": 1 + } + }, + "required": [ + "type", + "name" + ] + }, + "capability-audit-log-events-hook": { + "$id": "#/properties/capability/audit-log-events-hook", + "title": "Audit Log Events Hook", + "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", + "type": "object", + "propertyNames": { + "enum": [ + "receivingEndpoint", + "method", + "templates", + "defaultPolicy" + ] + }, + "properties": { + "receivingEndpoint": { + "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", + "title": "Endpoint URL", + "description": "URL where you'd like LaunchDarkly to send webhooks to", + "$ref": "#/definitions/https-url" + }, + "method": { + "$id": "#/properties/capability/audit-log-events-hook/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "post", + "put", + "patch" + ] + }, + "templates": { + "$id": "#/properties/capability/audit-log-events-hook/templates", + "title": "Webhook body template", + "description": "Templates to use for body of the webhook request", + "type": "object", + "anyOf": [ + { + "propertyNames": { + "enum": [ + "flag", + "project", + "environment", + "metric" + ] + }, + "patternProperties": { + "": { + "type": "string" + } + } + } + ] + }, + "defaultPolicy": { + "$id": "#/properties/capability/audit-log-events-hook/default-policy", + "title": "Default Policy", + "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "array", + "items": { + "$id": "#/properties/capability/audit-log-events-hook/policy", + "title": "Policy", + "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "object", + "propertyNames": { + "enum": [ + "actions", + "effect", + "notActions", + "notResources", + "resources" + ] + }, + "properties": { + "actions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/actions", + "title": "Actions", + "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "updateOn", + "createFlag", + "updateRules", + "updateTargets" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "effect": { + "$id": "#/properties/capability/audit-log-events-hook/policy/effect", + "title": "Effect", + "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", + "default": "allow", + "type": "string", + "enum": [ + "allow", + "deny" + ] + }, + "notActions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", + "title": "Not actions", + "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "createFlag", + "deleteFlag", + "cloneFlag" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "notResources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", + "title": "Not resources", + "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "proj/*:env/production:flag/*" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/resources", + "title": "Resources", + "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "proj/*:env/production:flag/*" + ], + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "required": [ + "receivingEndpoint", + "method" + ] + } + } +} \ No newline at end of file diff --git a/package.json b/package.json index 509235ef..5b2ae4ea 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", "main": "index.js", "scripts": { - "prepare": "jsonschema2md -d _schemas -o . -x - -n && mv manifest.schema.md MANIFEST.md" + "prepare": "jsonschema2md -d _schemas -o . -n && mv manifest.schema.md MANIFEST.md" }, "repository": { "type": "git", From 19f03abb1dfa2095d5ec2c2bd44f4e10c772bb56 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 9 Oct 2019 15:01:06 -0700 Subject: [PATCH 004/936] Added license to sample --- sample-integration/LICENSE.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sample-integration/LICENSE.md b/sample-integration/LICENSE.md index e69de29b..aa12a4cb 100644 --- a/sample-integration/LICENSE.md +++ b/sample-integration/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. From 9fb37c4b3d5094ccf43f89b634f1a5fe72c4689a Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 9 Oct 2019 15:22:35 -0700 Subject: [PATCH 005/936] Cleaning up manifest.md --- MANIFEST.md | 844 ++++++++++++++++++++++++++-------------------------- 1 file changed, 416 insertions(+), 428 deletions(-) diff --git a/MANIFEST.md b/MANIFEST.md index cb85b31c..00670ae8 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -1,42 +1,32 @@ -# LaunchDarkly Integrations Manifest Schema - -``` -https://launchdarkly.com/schemas/v1.0/integrations -``` - -Describes the capabilities and intent of a LaunchDarkly integration - -| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Defined In | -| ------------------- | ---------- | ------------ | ------------ | ----------------- | --------------------- | -------------------------------------------- | -| Can be instantiated | Yes | Experimental | No | Forbidden | Permitted | [manifest.schema.json](manifest.schema.json) | - -# LaunchDarkly Integrations Manifest Definitions +# LaunchDarkly Integrations Manifest Properties -| Property | Type | Group | -| --------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------- | -| [acceptedAs](#acceptedas) | `object` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | -| [defaultPolicy](#defaultpolicy) | `object[]` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | -| [hint](#hint) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | -| [label](#label) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | -| [method](#method) | `enum` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | -| [prefix](#prefix) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/accepted-as-header` | -| [receivingEndpoint](#receivingendpoint) | reference | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | -| [templates](#templates) | `object` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | -| [type](#type) | `enum` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/accepted-as-query-param` | +| Property | Type | Required | Nullable | Defined by | +| --------------------------------- | --------- | ------------ | -------- | ------------------------------------------------ | +| [authentication](#authentication) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [categories](#categories) | reference | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [description](#description) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [icons](#icons) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [links](#links) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [name](#name) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [overview](#overview) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [version](#version) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| `*` | any | Additional | Yes | this schema _allows_ additional properties | -## acceptedAs +## authentication -### Token accepted as... +### Authentication -Specify how your token should be provided in the request to your service +Specify the authentication method required by your integration -`acceptedAs` +`authentication` - is **required** - type: `object` - defined in this schema -### acceptedAs Type +### authentication Type `object` with following properties: @@ -44,398 +34,364 @@ Specify how your token should be provided in the request to your service | -------- | ---- | -------- | -## defaultPolicy +## author -### Default Policy +### Author -LaunchDarkly policy that allows you to filter events sent to your webhook. See -https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. +Name of the author or organization responsible for the integration -`defaultPolicy` +`author` -- is optional -- type: `object[]` +- is **required** +- type: `string` - defined in this schema -### defaultPolicy Type - -Array type: `object[]` - -All items must be of the type: `object` with following properties: - -| Property | Type | Required | Default | -| -------------- | ------ | -------- | --------- | -| `actions` | array | Optional | `["*"]` | -| `effect` | string | Optional | `"allow"` | -| `notActions` | array | Optional | `["*"]` | -| `notResources` | array | Optional | `["*"]` | -| `resources` | array | Optional | `["*"]` | - -#### actions - -##### Actions - -A list of action specifiers defining the actions to which the statement applies. See -https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. +### author Type -`actions` +`string` -- is optional -- type: `string[]` -- default: `["*"]` +- minimum length: 3 characters +- maximum length: 100 characters All instances must conform to this regular expression (test examples + [here]()): -##### actions Type +```regex +^(.*)$ +``` -Array type: `string[]` +## capabilities -All items must be of the type: `string` +### Capabilities -##### actions Examples +Specify which capabilities you'd like your integration to have -```json -updateOn -``` +`capabilities` -```json -createFlag -``` +- is **required** +- type: `object` +- defined in this schema -```json -updateRules -``` +### capabilities Type -```json -updateTargets -``` +`object` with following properties: -#### effect +| Property | Type | Required | +| -------- | ---- | -------- | -##### Effect -This attribute defines whether the statement allows or denies access to the named resources and actions. +## categories -`effect` +### Categories -- is optional -- type: `enum` -- default: `"allow"` +Categories that describe your integration -The value of this property **must** be equal to one of the [known values below](#defaultpolicy-known-values). +`categories` -##### effect Known Values +- is **required** +- type: reference +- between `1` and `3` items in the array +- defined in this schema -| Value | Description | -| ------- | ----------- | -| `allow` | | -| `deny` | | +### categories Type -#### notActions +Array type: reference -##### Not actions +All items must be of the type: -A list of action specifiers defining the actions to which the statement does not apply. See -https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. +- []() – `#/definitions/category` -`notActions` +## description -- is optional -- type: `string[]` -- default: `["*"]` +### Long description -##### notActions Type +A longer description of your integration -Array type: `string[]` +`description` -All items must be of the type: `string` +- is **required** +- type: `string` +- defined in this schema -##### notActions Examples +### description Type -```json -createFlag -``` +`string` -```json -deleteFlag -``` +- minimum length: 50 characters +- maximum length: 2048 characters All instances must conform to this regular expression (test examples + [here]()): -```json -cloneFlag +```regex +^(.*)$ ``` -#### notResources - -##### Not resources - -A list of resource specifiers defining the resources to which the statement does not apply. See -https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. - -`notResources` +## icons -- is optional -- type: `string[]` -- default: `["*"]` +### Icons -##### notResources Type +Logos describing your integration in SVG format -Array type: `string[]` +`icons` -All items must be of the type: `string` +- is **required** +- type: `object` +- defined in this schema -##### notResources Example +### icons Type -```json -proj/*:env/production:flag/* -``` +`object` with following properties: -#### resources +| Property | Type | Required | +| ------------- | ------ | ------------ | +| `rectangular` | string | **Required** | +| `square` | string | **Required** | -##### Resources +#### rectangular -A list of resource specifiers defining the resources to which the statement applies. See -https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. +##### Rectangular logo -`resources` +A rectangular version of your integration's logo in SVG format -- is optional -- type: `string[]` -- default: `["*"]` +`rectangular` -##### resources Type +- is **required** +- type: `string` -Array type: `string[]` +##### rectangular Type -All items must be of the type: `string` +`string` -##### resources Example +All instances must conform to this regular expression (test examples +[here](https://regexr.com/?expression=%5C.svg%24)): -```json -proj/*:env/production:flag/* +```regex +\.svg$ ``` -A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. - -## hint +#### square -### Hint +##### Square logo -A placeholder hint used in the LaunchDarkly UI describing your token +A square version of your integration's logo in SVG format -`hint` +`square` - is **required** - type: `string` -- defined in this schema -### hint Type +##### square Type `string` -### hint Example +All instances must conform to this regular expression (test examples +[here](https://regexr.com/?expression=%5C.svg%24)): -```json -"Enter API key from your SpaceXYZ account" +```regex +\.svg$ ``` -## label +## links -### Token +### Links -Label to use in the LaunchDarkly UI describing you token +A set of reference links supporting your integration -`label` +`links` - is **required** -- type: `string` +- type: `object` - defined in this schema -### label Type - -`string` - -### label Examples +### links Type -```json -"API key" -``` +`object` with following properties: -```json -"API token" -``` +| Property | Type | Required | +| ---------------- | ------ | ------------ | +| `privacyPolicy` | | **Required** | +| `site` | | **Required** | +| `supportEmail` | string | **Required** | +| `supportWebsite` | | Optional | -## method +#### privacyPolicy -### HTTP method +##### Privacy Policy -HTTP method to use when LaunchDarkly makes the request to your endpoint +URL to your organization's privacy policy -`method` +`privacyPolicy` - is **required** -- type: `enum` -- defined in this schema - -The value of this property **must** be equal to one of the [known values below](#method-known-values). - -### method Known Values - -| Value | Description | -| ------- | ----------- | -| `post` | | -| `put` | | -| `patch` | | +- type: reference -## prefix +##### privacyPolicy Type -### Header value prefix +- []() – `#/definitions/https-url` -If your token needs to be padded with a prefix, specify it here +#### site -`prefix` +##### Website -- is optional -- type: `string` -- defined in this schema +URL to your website -### prefix Type +`site` -`string` +- is **required** +- type: reference -### prefix Example +##### site Type -```json -"Bearer " -``` +- []() – `#/definitions/https-url` -## receivingEndpoint +#### supportEmail -### Endpoint URL +##### Support Email -URL where you'd like LaunchDarkly to send webhooks to +Email address for your integration's support -`receivingEndpoint` +`supportEmail` - is **required** -- type: reference -- defined in this schema - -### receivingEndpoint Type +- type: `string` -- []() – `#/definitions/https-url` +##### supportEmail Type -## templates +`string` -### Webhook body template +- format: `email` – email address (according to [RFC 5322, section 3.4.1](https://tools.ietf.org/html/rfc5322)) -Templates to use for body of the webhook request +#### supportWebsite -`templates` +##### Support Website -- is optional -- type: `object` -- defined in this schema +URL to your integration's support website -### templates Type +`supportWebsite` -`object` with following properties: +- is optional +- type: reference -| Property | Type | Required | -| -------- | ---- | -------- | +##### supportWebsite Type +- []() – `#/definitions/https-url` -## type +## name -### Type +### Integration name -Specify the method in which your token is provided in the request. In most cases, tokens are either passed through -query parameter or a header. +Your integration's name. No spaces -`type` +`name` - is **required** -- type: `enum` +- type: `string` - defined in this schema -The value of this property **must** be equal to one of the [known values below](#type-known-values). - -### type Known Values +### name Type -| Value | Description | -| ------------- | ----------- | -| `query-param` | | +`string` -# LaunchDarkly Integrations Manifest Properties +- minimum length: 3 characters +- maximum length: 50 characters All instances must conform to this regular expression (test examples + [here](https://regexr.com/?expression=%5E%5CS*%24)): -| Property | Type | Required | Nullable | Defined by | -| --------------------------------- | --------- | ------------ | -------- | ------------------------------------------------ | -| [authentication](#authentication) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [categories](#categories) | reference | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [description](#description) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [icons](#icons) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [links](#links) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [name](#name) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [overview](#overview) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [version](#version) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| `*` | any | Additional | Yes | this schema _allows_ additional properties | +```regex +^\S*$ +``` -## authentication +## overview -### Authentication +### Short description -Specify the authentication method required by your integration +A short-one liner describing your integration -`authentication` +`overview` - is **required** -- type: `object` +- type: `string` - defined in this schema -### authentication Type +### overview Type -`object` with following properties: +`string` -| Property | Type | Required | -| -------- | ---- | -------- | +- minimum length: 10 characters +- maximum length: 100 characters All instances must conform to this regular expression (test examples + [here]()): +```regex +^(.*)$ +``` -## author +## version -### Author +### Version -Name of the author or organization responsible for the integration +A semantic version of the integration -`author` +`version` - is **required** - type: `string` - defined in this schema -### author Type +### version Type `string` -- minimum length: 3 characters -- maximum length: 100 characters All instances must conform to this regular expression (test examples - [here]()): +- minimum length: 5 characters +- maximum length: 14 characters All instances must conform to this regular expression ```regex -^(.*)$ +^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$ ``` -## capabilities +- test example: + [0.0.1]() +- test example: + [1.0.0]() +- test example: + [1.0.1-beta]() -### Capabilities +### version Examples -Specify which capabilities you'd like your integration to have +```json +"0.0.1" +``` -`capabilities` +```json +"1.0.0" +``` + +```json +"1.0.1-beta" +``` + +# LaunchDarkly Integrations Manifest Definitions + +| Property | Type | Group | +| --------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------- | +| [acceptedAs](#acceptedas) | `object` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | +| [defaultPolicy](#defaultpolicy) | `object[]` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | +| [hint](#hint) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | +| [label](#label) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | +| [method](#method) | `enum` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | +| [prefix](#prefix) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/accepted-as-header` | +| [receivingEndpoint](#receivingendpoint) | reference | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | +| [templates](#templates) | `object` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | +| [type](#type) | `enum` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/accepted-as-query-param` | + +## acceptedAs + +### Token accepted as... + +Specify how your token should be provided in the request to your service + +`acceptedAs` - is **required** - type: `object` - defined in this schema -### capabilities Type +### acceptedAs Type `object` with following properties: @@ -443,289 +399,321 @@ Specify which capabilities you'd like your integration to have | -------- | ---- | -------- | -## categories +## defaultPolicy -### Categories +### Default Policy -Categories that describe your integration +LaunchDarkly policy that allows you to filter events sent to your webhook. See +https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. -`categories` +`defaultPolicy` -- is **required** -- type: reference -- between `1` and `3` items in the array +- is optional +- type: `object[]` - defined in this schema -### categories Type +### defaultPolicy Type -Array type: reference +Array type: `object[]` -All items must be of the type: +All items must be of the type: `object` with following properties: -- []() – `#/definitions/category` +| Property | Type | Required | Default | +| -------------- | ------ | -------- | --------- | +| `actions` | array | Optional | `["*"]` | +| `effect` | string | Optional | `"allow"` | +| `notActions` | array | Optional | `["*"]` | +| `notResources` | array | Optional | `["*"]` | +| `resources` | array | Optional | `["*"]` | -## description +#### actions -### Long description +##### Actions -A longer description of your integration +A list of action specifiers defining the actions to which the statement applies. See +https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. -`description` +`actions` -- is **required** -- type: `string` -- defined in this schema +- is optional +- type: `string[]` +- default: `["*"]` -### description Type +##### actions Type -`string` +Array type: `string[]` -- minimum length: 50 characters -- maximum length: 2048 characters All instances must conform to this regular expression (test examples - [here]()): +All items must be of the type: `string` -```regex -^(.*)$ +##### actions Examples + +```json +updateOn ``` -## icons +```json +createFlag +``` -### Icons +```json +updateRules +``` -Logos describing your integration in SVG format +```json +updateTargets +``` -`icons` +#### effect -- is **required** -- type: `object` -- defined in this schema +##### Effect -### icons Type +This attribute defines whether the statement allows or denies access to the named resources and actions. -`object` with following properties: +`effect` -| Property | Type | Required | -| ------------- | ------ | ------------ | -| `rectangular` | string | **Required** | -| `square` | string | **Required** | +- is optional +- type: `enum` +- default: `"allow"` + +The value of this property **must** be equal to one of the [known values below](#defaultpolicy-known-values). + +##### effect Known Values + +| Value | Description | +| ------- | ----------- | +| `allow` | | +| `deny` | | + +#### notActions + +##### Not actions -#### rectangular +A list of action specifiers defining the actions to which the statement does not apply. See +https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. -##### Rectangular logo +`notActions` -A rectangular version of your integration's logo in SVG format +- is optional +- type: `string[]` +- default: `["*"]` -`rectangular` +##### notActions Type -- is **required** -- type: `string` +Array type: `string[]` -##### rectangular Type +All items must be of the type: `string` -`string` +##### notActions Examples -All instances must conform to this regular expression (test examples -[here](https://regexr.com/?expression=%5C.svg%24)): +```json +createFlag +``` -```regex -\.svg$ +```json +deleteFlag ``` -#### square +```json +cloneFlag +``` -##### Square logo +#### notResources -A square version of your integration's logo in SVG format +##### Not resources -`square` +A list of resource specifiers defining the resources to which the statement does not apply. See +https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. -- is **required** -- type: `string` +`notResources` -##### square Type +- is optional +- type: `string[]` +- default: `["*"]` -`string` +##### notResources Type -All instances must conform to this regular expression (test examples -[here](https://regexr.com/?expression=%5C.svg%24)): +Array type: `string[]` -```regex -\.svg$ -``` +All items must be of the type: `string` -## links +##### notResources Example -### Links +```json +proj/*:env/production:flag/* +``` -A set of reference links supporting your integration +#### resources -`links` +##### Resources -- is **required** -- type: `object` -- defined in this schema +A list of resource specifiers defining the resources to which the statement applies. See +https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. -### links Type +`resources` -`object` with following properties: +- is optional +- type: `string[]` +- default: `["*"]` -| Property | Type | Required | -| ---------------- | ------ | ------------ | -| `privacyPolicy` | | **Required** | -| `site` | | **Required** | -| `supportEmail` | string | **Required** | -| `supportWebsite` | | Optional | +##### resources Type -#### privacyPolicy +Array type: `string[]` -##### Privacy Policy +All items must be of the type: `string` -URL to your organization's privacy policy +##### resources Example -`privacyPolicy` +```json +proj/*:env/production:flag/* +``` -- is **required** -- type: reference +A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. -##### privacyPolicy Type +## hint -- []() – `#/definitions/https-url` +### Hint -#### site +A placeholder hint used in the LaunchDarkly UI describing your token -##### Website +`hint` -URL to your website +- is **required** +- type: `string` +- defined in this schema -`site` +### hint Type -- is **required** -- type: reference +`string` -##### site Type +### hint Example -- []() – `#/definitions/https-url` +```json +"Enter API key from your SpaceXYZ account" +``` -#### supportEmail +## label -##### Support Email +### Token -Email address for your integration's support +Label to use in the LaunchDarkly UI describing you token -`supportEmail` +`label` - is **required** - type: `string` +- defined in this schema -##### supportEmail Type +### label Type `string` -- format: `email` – email address (according to [RFC 5322, section 3.4.1](https://tools.ietf.org/html/rfc5322)) +### label Examples -#### supportWebsite +```json +"API key" +``` -##### Support Website +```json +"API token" +``` -URL to your integration's support website +## method -`supportWebsite` +### HTTP method -- is optional -- type: reference +HTTP method to use when LaunchDarkly makes the request to your endpoint -##### supportWebsite Type +`method` -- []() – `#/definitions/https-url` +- is **required** +- type: `enum` +- defined in this schema -## name +The value of this property **must** be equal to one of the [known values below](#method-known-values). -### Integration name +### method Known Values -Your integration's name. No spaces +| Value | Description | +| ------- | ----------- | +| `post` | | +| `put` | | +| `patch` | | -`name` +## prefix -- is **required** +### Header value prefix + +If your token needs to be padded with a prefix, specify it here + +`prefix` + +- is optional - type: `string` - defined in this schema -### name Type +### prefix Type `string` -- minimum length: 3 characters -- maximum length: 50 characters All instances must conform to this regular expression (test examples - [here](https://regexr.com/?expression=%5E%5CS*%24)): +### prefix Example -```regex -^\S*$ +```json +"Bearer " ``` -## overview +## receivingEndpoint -### Short description +### Endpoint URL -A short-one liner describing your integration +URL where you'd like LaunchDarkly to send webhooks to -`overview` +`receivingEndpoint` - is **required** -- type: `string` +- type: reference - defined in this schema -### overview Type +### receivingEndpoint Type -`string` +- []() – `#/definitions/https-url` -- minimum length: 10 characters -- maximum length: 100 characters All instances must conform to this regular expression (test examples - [here]()): +## templates -```regex -^(.*)$ -``` +### Webhook body template -## version +Templates to use for body of the webhook request -### Version +`templates` -A semantic version of the integration +- is optional +- type: `object` +- defined in this schema -`version` +### templates Type -- is **required** -- type: `string` -- defined in this schema +`object` with following properties: -### version Type +| Property | Type | Required | +| -------- | ---- | -------- | -`string` -- minimum length: 5 characters -- maximum length: 14 characters All instances must conform to this regular expression +## type -```regex -^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$ -``` +### Type -- test example: - [0.0.1]() -- test example: - [1.0.0]() -- test example: - [1.0.1-beta]() +Specify the method in which your token is provided in the request. In most cases, tokens are either passed through +query parameter or a header. -### version Examples +`type` -```json -"0.0.1" -``` +- is **required** +- type: `enum` +- defined in this schema -```json -"1.0.0" -``` +The value of this property **must** be equal to one of the [known values below](#type-known-values). -```json -"1.0.1-beta" -``` +### type Known Values + +| Value | Description | +| ------------- | ----------- | +| `query-param` | From a495ea129249eb7c66fc8941ce7d362f6e24ec43 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 10 Oct 2019 10:10:17 -0700 Subject: [PATCH 006/936] Added vscode setting to apply the schema to manifest.json --- .vscode/settings.json | 8 ++++++++ sample-integration/manifest.json | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..0af5d7a6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "json.schemas": [ + { + "fileMatch": ["manifest.json"], + "url": "./_schemas/manifest.schema.json" + } + ] +} diff --git a/sample-integration/manifest.json b/sample-integration/manifest.json index 8532175a..3652021a 100644 --- a/sample-integration/manifest.json +++ b/sample-integration/manifest.json @@ -1,5 +1,4 @@ { - "$schema": "../_schemas/manifest.schema.json", "name": "sample-integration", "version": "1.0.0", "overview": "Short one-liner describing your integration", From 0081c3e08ba2090e61228cb4546c19812e6fa6e2 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 10 Oct 2019 15:25:51 -0700 Subject: [PATCH 007/936] Refactored manifest.schema.json --- MANIFEST.md | 461 ++++------------------ _schemas/manifest.schema.json | 553 ++++++++++++++------------- manifest.schema.json | 700 ++++++++++++++++++---------------- 3 files changed, 725 insertions(+), 989 deletions(-) diff --git a/MANIFEST.md b/MANIFEST.md index 00670ae8..68045220 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -1,18 +1,29 @@ +# LaunchDarkly Integrations Manifest Schema + +``` +https://launchdarkly.com/schemas/v1.0/integrations +``` + +Describes the capabilities and intent of a LaunchDarkly integration + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Defined In | +| ------------------- | ---------- | ------------ | ------------ | ----------------- | --------------------- | -------------------------------------------- | +| Can be instantiated | No | Experimental | No | Forbidden | Forbidden | [manifest.schema.json](manifest.schema.json) | + # LaunchDarkly Integrations Manifest Properties -| Property | Type | Required | Nullable | Defined by | -| --------------------------------- | --------- | ------------ | -------- | ------------------------------------------------ | -| [authentication](#authentication) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [categories](#categories) | reference | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [description](#description) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [icons](#icons) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [links](#links) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [name](#name) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [overview](#overview) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [version](#version) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| `*` | any | Additional | Yes | this schema _allows_ additional properties | +| Property | Type | Required | Nullable | Defined by | +| --------------------------------- | -------- | ------------ | -------- | ------------------------------------------------ | +| [authentication](#authentication) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [categories](#categories) | `enum[]` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [description](#description) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [icons](#icons) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [links](#links) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [name](#name) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [overview](#overview) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [version](#version) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | ## authentication @@ -30,9 +41,29 @@ Specify the authentication method required by your integration `object` with following properties: -| Property | Type | Required | -| -------- | ---- | -------- | +| Property | Type | Required | +| -------- | ------ | ------------ | +| `type` | string | **Required** | + +#### type + +##### Auth Type + +Specify the authentication method required by your integration + +`type` + +- is **required** +- type: `enum` + +The value of this property **must** be equal to one of the [known values below](#authentication-known-values). +##### type Known Values + +| Value | Description | +| ------- | ----------- | +| `none` | | +| `token` | | ## author @@ -87,17 +118,15 @@ Categories that describe your integration `categories` - is **required** -- type: reference +- type: `enum[]` - between `1` and `3` items in the array - defined in this schema ### categories Type -Array type: reference - -All items must be of the type: +Array type: `enum[]` -- []() – `#/definitions/category` +All items must be of the type: `string` ## description @@ -206,10 +235,10 @@ A set of reference links supporting your integration | Property | Type | Required | | ---------------- | ------ | ------------ | -| `privacyPolicy` | | **Required** | -| `site` | | **Required** | +| `privacyPolicy` | string | **Required** | +| `site` | string | **Required** | | `supportEmail` | string | **Required** | -| `supportWebsite` | | Optional | +| `supportWebsite` | string | Optional | #### privacyPolicy @@ -220,11 +249,18 @@ URL to your organization's privacy policy `privacyPolicy` - is **required** -- type: reference +- type: `string` ##### privacyPolicy Type -- []() – `#/definitions/https-url` +`string` + +- maximum length: 2048 characters All instances must conform to this regular expression (test examples + [here](https://regexr.com/?expression=%5E%5BHh%5D%5BTt%5D%5BTt%5D%5BPp%5D%5BSs%5D%3F%3A%2F%2F)): + +```regex +^[Hh][Tt][Tt][Pp][Ss]?:// +``` #### site @@ -235,11 +271,18 @@ URL to your website `site` - is **required** -- type: reference +- type: `string` ##### site Type -- []() – `#/definitions/https-url` +`string` + +- maximum length: 2048 characters All instances must conform to this regular expression (test examples + [here](https://regexr.com/?expression=%5E%5BHh%5D%5BTt%5D%5BTt%5D%5BPp%5D%5BSs%5D%3F%3A%2F%2F)): + +```regex +^[Hh][Tt][Tt][Pp][Ss]?:// +``` #### supportEmail @@ -267,11 +310,18 @@ URL to your integration's support website `supportWebsite` - is optional -- type: reference +- type: `string` ##### supportWebsite Type -- []() – `#/definitions/https-url` +`string` + +- maximum length: 2048 characters All instances must conform to this regular expression (test examples + [here](https://regexr.com/?expression=%5E%5BHh%5D%5BTt%5D%5BTt%5D%5BPp%5D%5BSs%5D%3F%3A%2F%2F)): + +```regex +^[Hh][Tt][Tt][Pp][Ss]?:// +``` ## name @@ -364,356 +414,3 @@ A semantic version of the integration ```json "1.0.1-beta" ``` - -# LaunchDarkly Integrations Manifest Definitions - -| Property | Type | Group | -| --------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------- | -| [acceptedAs](#acceptedas) | `object` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | -| [defaultPolicy](#defaultpolicy) | `object[]` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | -| [hint](#hint) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | -| [label](#label) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/auth-token` | -| [method](#method) | `enum` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | -| [prefix](#prefix) | `string` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/accepted-as-header` | -| [receivingEndpoint](#receivingendpoint) | reference | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | -| [templates](#templates) | `object` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/capability-audit-log-events-hook` | -| [type](#type) | `enum` | `https://launchdarkly.com/schemas/v1.0/integrations#/definitions/accepted-as-query-param` | - -## acceptedAs - -### Token accepted as... - -Specify how your token should be provided in the request to your service - -`acceptedAs` - -- is **required** -- type: `object` -- defined in this schema - -### acceptedAs Type - -`object` with following properties: - -| Property | Type | Required | -| -------- | ---- | -------- | - - -## defaultPolicy - -### Default Policy - -LaunchDarkly policy that allows you to filter events sent to your webhook. See -https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. - -`defaultPolicy` - -- is optional -- type: `object[]` -- defined in this schema - -### defaultPolicy Type - -Array type: `object[]` - -All items must be of the type: `object` with following properties: - -| Property | Type | Required | Default | -| -------------- | ------ | -------- | --------- | -| `actions` | array | Optional | `["*"]` | -| `effect` | string | Optional | `"allow"` | -| `notActions` | array | Optional | `["*"]` | -| `notResources` | array | Optional | `["*"]` | -| `resources` | array | Optional | `["*"]` | - -#### actions - -##### Actions - -A list of action specifiers defining the actions to which the statement applies. See -https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. - -`actions` - -- is optional -- type: `string[]` -- default: `["*"]` - -##### actions Type - -Array type: `string[]` - -All items must be of the type: `string` - -##### actions Examples - -```json -updateOn -``` - -```json -createFlag -``` - -```json -updateRules -``` - -```json -updateTargets -``` - -#### effect - -##### Effect - -This attribute defines whether the statement allows or denies access to the named resources and actions. - -`effect` - -- is optional -- type: `enum` -- default: `"allow"` - -The value of this property **must** be equal to one of the [known values below](#defaultpolicy-known-values). - -##### effect Known Values - -| Value | Description | -| ------- | ----------- | -| `allow` | | -| `deny` | | - -#### notActions - -##### Not actions - -A list of action specifiers defining the actions to which the statement does not apply. See -https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. - -`notActions` - -- is optional -- type: `string[]` -- default: `["*"]` - -##### notActions Type - -Array type: `string[]` - -All items must be of the type: `string` - -##### notActions Examples - -```json -createFlag -``` - -```json -deleteFlag -``` - -```json -cloneFlag -``` - -#### notResources - -##### Not resources - -A list of resource specifiers defining the resources to which the statement does not apply. See -https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. - -`notResources` - -- is optional -- type: `string[]` -- default: `["*"]` - -##### notResources Type - -Array type: `string[]` - -All items must be of the type: `string` - -##### notResources Example - -```json -proj/*:env/production:flag/* -``` - -#### resources - -##### Resources - -A list of resource specifiers defining the resources to which the statement applies. See -https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. - -`resources` - -- is optional -- type: `string[]` -- default: `["*"]` - -##### resources Type - -Array type: `string[]` - -All items must be of the type: `string` - -##### resources Example - -```json -proj/*:env/production:flag/* -``` - -A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. - -## hint - -### Hint - -A placeholder hint used in the LaunchDarkly UI describing your token - -`hint` - -- is **required** -- type: `string` -- defined in this schema - -### hint Type - -`string` - -### hint Example - -```json -"Enter API key from your SpaceXYZ account" -``` - -## label - -### Token - -Label to use in the LaunchDarkly UI describing you token - -`label` - -- is **required** -- type: `string` -- defined in this schema - -### label Type - -`string` - -### label Examples - -```json -"API key" -``` - -```json -"API token" -``` - -## method - -### HTTP method - -HTTP method to use when LaunchDarkly makes the request to your endpoint - -`method` - -- is **required** -- type: `enum` -- defined in this schema - -The value of this property **must** be equal to one of the [known values below](#method-known-values). - -### method Known Values - -| Value | Description | -| ------- | ----------- | -| `post` | | -| `put` | | -| `patch` | | - -## prefix - -### Header value prefix - -If your token needs to be padded with a prefix, specify it here - -`prefix` - -- is optional -- type: `string` -- defined in this schema - -### prefix Type - -`string` - -### prefix Example - -```json -"Bearer " -``` - -## receivingEndpoint - -### Endpoint URL - -URL where you'd like LaunchDarkly to send webhooks to - -`receivingEndpoint` - -- is **required** -- type: reference -- defined in this schema - -### receivingEndpoint Type - -- []() – `#/definitions/https-url` - -## templates - -### Webhook body template - -Templates to use for body of the webhook request - -`templates` - -- is optional -- type: `object` -- defined in this schema - -### templates Type - -`object` with following properties: - -| Property | Type | Required | -| -------- | ---- | -------- | - - -## type - -### Type - -Specify the method in which your token is provided in the request. In most cases, tokens are either passed through -query parameter or a header. - -`type` - -- is **required** -- type: `enum` -- defined in this schema - -The value of this property **must** be equal to one of the [known values below](#type-known-values). - -### type Known Values - -| Value | Description | -| ------------- | ----------- | -| `query-param` | diff --git a/_schemas/manifest.schema.json b/_schemas/manifest.schema.json index 35f924e5..964aae4a 100644 --- a/_schemas/manifest.schema.json +++ b/_schemas/manifest.schema.json @@ -4,6 +4,7 @@ "title": "LaunchDarkly Integrations Manifest", "description": "Describes the capabilities and intent of a LaunchDarkly integration", "type": "object", + "additionalProperties": false, "properties": { "name": { "$id": "#/properties/name", @@ -19,7 +20,10 @@ "title": "Version", "description": "A semantic version of the integration", "examples": ["0.0.1", "1.0.0", "1.0.1-beta"], - "$ref": "#/definitions/semver" + "type": "string", + "minLength": 5, + "maxLength": 14, + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" }, "overview": { "$id": "#/properties/overview", @@ -58,13 +62,17 @@ "$id": "#/properties/links/site", "title": "Website", "description": "URL to your website", - "$ref": "#/definitions/https-url" + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, "privacyPolicy": { "$id": "#/properties/links/privacy-policy", "title": "Privacy Policy", "description": "URL to your organization's privacy policy", - "$ref": "#/definitions/https-url" + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, "supportEmail": { "$id": "#/properties/links/support-email", @@ -77,7 +85,9 @@ "$id": "#/properties/links/support-website", "title": "Support Website", "description": "URL to your integration's support website", - "$ref": "#/definitions/https-url" + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" } }, "required": ["site", "privacyPolicy", "supportEmail"] @@ -91,7 +101,27 @@ "minItems": 1, "maxItems": 3, "items": { - "$ref": "#/definitions/category" + "type": "string", + "enum": [ + "alerts", + "analytics-and-reporting", + "apm", + "automation", + "communication-and-collaboration", + "config-and-deployment", + "exceptions", + "experimentation", + "hr-and-operations", + "issue-tracking", + "it-and-project-management", + "marketing-and-social-media", + "monitoring", + "orchestration", + "product-and-design", + "provisioning", + "security", + "source-control" + ] } }, "icons": { @@ -122,14 +152,131 @@ "title": "Authentication", "description": "Specify the authentication method required by your integration", "type": "object", - "oneOf": [ + "properties": { + "type": { + "$id": "#/properties/authentication/type", + "title": "Auth Type", + "description": "Specify the authentication method required by your integration", + "type": "string", + "enum": ["none", "token"] + } + }, + "allOf": [ { - "$ref": "#/definitions/auth-none" + "if": { + "properties": { + "type": { + "const": "none" + } + } + }, + "then": { + "propertyNames": { + "enum": ["type"] + } + } }, { - "$ref": "#/definitions/auth-token" + "if": { + "properties": { + "type": { + "const": "token" + } + } + }, + "then": { + "properties": { + "label": { + "$id": "#/properties/authentication/label", + "title": "Token", + "description": "Label to use in the LaunchDarkly UI describing you token", + "examples": ["API key", "API token"], + "type": "string" + }, + "hint": { + "$id": "#/properties/authentication/hint", + "title": "Hint", + "description": "A placeholder hint used in the LaunchDarkly UI describing your token", + "examples": ["Enter API key from your SpaceXYZ account"], + "type": "string" + }, + "acceptedAs": { + "$id": "#/properties/authentication/acceptedAs", + "title": "Token accepted as...", + "description": "Specify how your token should be provided in the request to your service", + "type": "object", + "properties": { + "type": { + "$id": "#/properties/authentication/acceptedAs/type", + "title": "Type", + "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", + "type": "string", + "enum": ["query-param", "header"] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { "const": "query-param" } + } + }, + "then": { + "properties": { + "name": { + "$id": "#/properties/authentication/acceptedAs/type/query-param-name", + "title": "Query parameter name", + "description": "Specify the name of the query parameter you'd like to use", + "type": "string", + "examples": ["token", "key"] + } + }, + "required": ["name"], + "propertyNames": { + "enum": ["type", "name"] + } + } + }, + { + "if": { + "properties": { + "type": { "const": "header" } + } + }, + "then": { + "properties": { + "name": { + "$id": "#/properties/authentication/acceptedAs/type/header-name", + "title": "Header name", + "description": "Specify the name of the header you'd like to use", + "type": "string", + "examples": ["Authorization", "X-SpaceXYZ-Auth"] + }, + "prefix": { + "$id": "#/properties/authentication/acceptedAs/type/header-value-prefix", + "title": "Header value prefix", + "description": "If your token needs to be padded with a prefix, specify it here", + "type": "string", + "examples": ["Bearer "] + } + }, + "required": ["name"], + "propertyNames": { + "enum": ["type", "name", "prefix"] + } + } + } + ] + } + }, + "required": ["type", "label", "hint", "acceptedAs"], + "propertyNames": { + "enum": ["type", "label", "hint", "acceptedAs"] + } + } } - ] + ], + "required": ["type"] }, "capabilities": { "$id": "#/properties/capabilities", @@ -140,7 +287,133 @@ { "properties": { "auditLogEventsHook": { - "$ref": "#/definitions/capability-audit-log-events-hook" + "$id": "#/properties/capability/audit-log-events-hook", + "title": "Audit Log Events Hook", + "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", + "type": "object", + "propertyNames": { + "enum": [ + "receivingEndpoint", + "method", + "templates", + "defaultPolicy" + ] + }, + "properties": { + "receivingEndpoint": { + "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", + "title": "Endpoint URL", + "description": "URL where you'd like LaunchDarkly to send webhooks to", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "method": { + "$id": "#/properties/capability/audit-log-events-hook/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": ["post", "put", "patch"] + }, + "templates": { + "$id": "#/properties/capability/audit-log-events-hook/templates", + "title": "Webhook body template", + "description": "Templates to use for body of the webhook request", + "type": "object", + "anyOf": [ + { + "propertyNames": { + "enum": ["flag", "project", "environment", "metric"] + }, + "patternProperties": { + "": { + "type": "string" + } + } + } + ] + }, + "defaultPolicy": { + "$id": "#/properties/capability/audit-log-events-hook/default-policy", + "title": "Default Policy", + "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "array", + "items": { + "$id": "#/properties/capability/audit-log-events-hook/policy", + "title": "Policy", + "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "object", + "propertyNames": { + "enum": [ + "actions", + "effect", + "notActions", + "notResources", + "resources" + ] + }, + "properties": { + "actions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/actions", + "title": "Actions", + "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": ["*"], + "examples": [ + "updateOn", + "createFlag", + "updateRules", + "updateTargets" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "effect": { + "$id": "#/properties/capability/audit-log-events-hook/policy/effect", + "title": "Effect", + "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", + "default": "allow", + "type": "string", + "enum": ["allow", "deny"] + }, + "notActions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", + "title": "Not actions", + "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": ["*"], + "examples": ["createFlag", "deleteFlag", "cloneFlag"], + "type": "array", + "items": { + "type": "string" + } + }, + "notResources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", + "title": "Not resources", + "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": ["*"], + "examples": ["proj/*:env/production:flag/*"], + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/resources", + "title": "Resources", + "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": ["*"], + "examples": ["proj/*:env/production:flag/*"], + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "required": ["receivingEndpoint", "method"] } } } @@ -159,263 +432,5 @@ "icons", "authentication", "capabilities" - ], - "definitions": { - "semver": { - "type": "string", - "minLength": 5, - "maxLength": 14, - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" - }, - "https-url": { - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - }, - "category": { - "type": "string", - "enum": [ - "alerts", - "analytics-and-reporting", - "apm", - "automation", - "communication-and-collaboration", - "config-and-deployment", - "exceptions", - "experimentation", - "hr-and-operations", - "issue-tracking", - "it-and-project-management", - "marketing-and-social-media", - "monitoring", - "orchestration", - "product-and-design", - "provisioning", - "security", - "source-control" - ] - }, - "auth-none": { - "properties": { - "type": { - "$id": "#/properties/authentication/type", - "title": "Auth Type", - "description": "Specify the authentication method required by your integration", - "type": "string", - "enum": ["none"] - } - }, - "required": ["type"], - "maxProperties": 1 - }, - "auth-token": { - "properties": { - "type": { - "$id": "#/properties/authentication/type", - "title": "Auth Type", - "description": "Specify the authentication method required by your integration", - "type": "string", - "enum": ["token"] - }, - "label": { - "$id": "#/properties/authentication/label", - "title": "Token", - "description": "Label to use in the LaunchDarkly UI describing you token", - "examples": ["API key", "API token"], - "type": "string" - }, - "hint": { - "$id": "#/properties/authentication/hint", - "title": "Hint", - "description": "A placeholder hint used in the LaunchDarkly UI describing your token", - "examples": ["Enter API key from your SpaceXYZ account"], - "type": "string" - }, - "acceptedAs": { - "$id": "#/properties/authentication/acceptedAs", - "title": "Token accepted as...", - "description": "Specify how your token should be provided in the request to your service", - "type": "object", - "oneOf": [ - { - "$ref": "#/definitions/accepted-as-header" - }, - { - "$ref": "#/definitions/accepted-as-query-param" - } - ] - } - }, - "required": ["type", "label", "hint", "acceptedAs"] - }, - "accepted-as-header": { - "properties": { - "type": { - "$id": "#/properties/authentication/acceptedAs/header-type", - "title": "Type", - "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", - "type": "string", - "enum": ["header"] - }, - "name": { - "$id": "#/properties/authentication/acceptedAs/type/header-name", - "title": "Header name", - "description": "Specify the name of the header you'd like to use", - "type": "string", - "examples": ["Authorization", "X-SpaceXYZ-Auth"], - "minLength": 1 - }, - "prefix": { - "$id": "#/properties/authentication/acceptedAs/type/header-value-prefix", - "title": "Header value prefix", - "description": "If your token needs to be padded with a prefix, specify it here", - "type": "string", - "examples": ["Bearer "] - } - }, - "required": ["type", "name"] - }, - "accepted-as-query-param": { - "properties": { - "type": { - "$id": "#/properties/authentication/acceptedAs/query-param-type", - "title": "Type", - "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", - "type": "string", - "enum": ["query-param"] - }, - "name": { - "$id": "#/properties/authentication/acceptedAs/type/query-param-name", - "title": "Query parameter name", - "description": "Specify the name of the query parameter you'd like to use", - "type": "string", - "examples": ["token", "key"], - "minLength": 1 - } - }, - "required": ["type", "name"] - }, - "capability-audit-log-events-hook": { - "$id": "#/properties/capability/audit-log-events-hook", - "title": "Audit Log Events Hook", - "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", - "type": "object", - "propertyNames": { - "enum": ["receivingEndpoint", "method", "templates", "defaultPolicy"] - }, - "properties": { - "receivingEndpoint": { - "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", - "title": "Endpoint URL", - "description": "URL where you'd like LaunchDarkly to send webhooks to", - "$ref": "#/definitions/https-url" - }, - "method": { - "$id": "#/properties/capability/audit-log-events-hook/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": ["post", "put", "patch"] - }, - "templates": { - "$id": "#/properties/capability/audit-log-events-hook/templates", - "title": "Webhook body template", - "description": "Templates to use for body of the webhook request", - "type": "object", - "anyOf": [ - { - "propertyNames": { - "enum": ["flag", "project", "environment", "metric"] - }, - "patternProperties": { - "": { - "type": "string" - } - } - } - ] - }, - "defaultPolicy": { - "$id": "#/properties/capability/audit-log-events-hook/default-policy", - "title": "Default Policy", - "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "array", - "items": { - "$id": "#/properties/capability/audit-log-events-hook/policy", - "title": "Policy", - "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "object", - "propertyNames": { - "enum": [ - "actions", - "effect", - "notActions", - "notResources", - "resources" - ] - }, - "properties": { - "actions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/actions", - "title": "Actions", - "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": ["*"], - "examples": [ - "updateOn", - "createFlag", - "updateRules", - "updateTargets" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "effect": { - "$id": "#/properties/capability/audit-log-events-hook/policy/effect", - "title": "Effect", - "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", - "default": "allow", - "type": "string", - "enum": ["allow", "deny"] - }, - "notActions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", - "title": "Not actions", - "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": ["*"], - "examples": ["createFlag", "deleteFlag", "cloneFlag"], - "type": "array", - "items": { - "type": "string" - } - }, - "notResources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", - "title": "Not resources", - "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": ["*"], - "examples": ["proj/*:env/production:flag/*"], - "type": "array", - "items": { - "type": "string" - } - }, - "resources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/resources", - "title": "Resources", - "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": ["*"], - "examples": ["proj/*:env/production:flag/*"], - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": ["receivingEndpoint", "method"] - } - } + ] } diff --git a/manifest.schema.json b/manifest.schema.json index b7f5d1d2..44a9cbe0 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -4,6 +4,7 @@ "title": "LaunchDarkly Integrations Manifest", "description": "Describes the capabilities and intent of a LaunchDarkly integration", "type": "object", + "additionalProperties": false, "properties": { "name": { "$id": "#/properties/name", @@ -23,7 +24,10 @@ "1.0.0", "1.0.1-beta" ], - "$ref": "#/definitions/semver" + "type": "string", + "minLength": 5, + "maxLength": 14, + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" }, "overview": { "$id": "#/properties/overview", @@ -62,13 +66,17 @@ "$id": "#/properties/links/site", "title": "Website", "description": "URL to your website", - "$ref": "#/definitions/https-url" + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, "privacyPolicy": { "$id": "#/properties/links/privacy-policy", "title": "Privacy Policy", "description": "URL to your organization's privacy policy", - "$ref": "#/definitions/https-url" + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, "supportEmail": { "$id": "#/properties/links/support-email", @@ -81,7 +89,9 @@ "$id": "#/properties/links/support-website", "title": "Support Website", "description": "URL to your integration's support website", - "$ref": "#/definitions/https-url" + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" } }, "required": [ @@ -99,7 +109,27 @@ "minItems": 1, "maxItems": 3, "items": { - "$ref": "#/definitions/category" + "type": "string", + "enum": [ + "alerts", + "analytics-and-reporting", + "apm", + "automation", + "communication-and-collaboration", + "config-and-deployment", + "exceptions", + "experimentation", + "hr-and-operations", + "issue-tracking", + "it-and-project-management", + "marketing-and-social-media", + "monitoring", + "orchestration", + "product-and-design", + "provisioning", + "security", + "source-control" + ] } }, "icons": { @@ -133,13 +163,178 @@ "title": "Authentication", "description": "Specify the authentication method required by your integration", "type": "object", - "oneOf": [ + "properties": { + "type": { + "$id": "#/properties/authentication/type", + "title": "Auth Type", + "description": "Specify the authentication method required by your integration", + "type": "string", + "enum": [ + "none", + "token" + ] + } + }, + "allOf": [ { - "$ref": "#/definitions/auth-none" + "if": { + "properties": { + "type": { + "const": "none" + } + } + }, + "then": { + "propertyNames": { + "enum": [ + "type" + ] + } + } }, { - "$ref": "#/definitions/auth-token" + "if": { + "properties": { + "type": { + "const": "token" + } + } + }, + "then": { + "properties": { + "label": { + "$id": "#/properties/authentication/label", + "title": "Token", + "description": "Label to use in the LaunchDarkly UI describing you token", + "examples": [ + "API key", + "API token" + ], + "type": "string" + }, + "hint": { + "$id": "#/properties/authentication/hint", + "title": "Hint", + "description": "A placeholder hint used in the LaunchDarkly UI describing your token", + "examples": [ + "Enter API key from your SpaceXYZ account" + ], + "type": "string" + }, + "acceptedAs": { + "$id": "#/properties/authentication/acceptedAs", + "title": "Token accepted as...", + "description": "Specify how your token should be provided in the request to your service", + "type": "object", + "properties": { + "type": { + "$id": "#/properties/authentication/acceptedAs/type", + "title": "Type", + "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", + "type": "string", + "enum": [ + "query-param", + "header" + ] + } + }, + "allOf": [ + { + "if": { + "properties": { + "type": { + "const": "query-param" + } + } + }, + "then": { + "properties": { + "name": { + "$id": "#/properties/authentication/acceptedAs/type/query-param-name", + "title": "Query parameter name", + "description": "Specify the name of the query parameter you'd like to use", + "type": "string", + "examples": [ + "token", + "key" + ] + } + }, + "required": [ + "name" + ], + "propertyNames": { + "enum": [ + "type", + "name" + ] + } + } + }, + { + "if": { + "properties": { + "type": { + "const": "header" + } + } + }, + "then": { + "properties": { + "name": { + "$id": "#/properties/authentication/acceptedAs/type/header-name", + "title": "Header name", + "description": "Specify the name of the header you'd like to use", + "type": "string", + "examples": [ + "Authorization", + "X-SpaceXYZ-Auth" + ] + }, + "prefix": { + "$id": "#/properties/authentication/acceptedAs/type/header-value-prefix", + "title": "Header value prefix", + "description": "If your token needs to be padded with a prefix, specify it here", + "type": "string", + "examples": [ + "Bearer " + ] + } + }, + "required": [ + "name" + ], + "propertyNames": { + "enum": [ + "type", + "name", + "prefix" + ] + } + } + } + ] + } + }, + "required": [ + "type", + "label", + "hint", + "acceptedAs" + ], + "propertyNames": { + "enum": [ + "type", + "label", + "hint", + "acceptedAs" + ] + } + } } + ], + "required": [ + "type" ] }, "capabilities": { @@ -151,7 +346,164 @@ { "properties": { "auditLogEventsHook": { - "$ref": "#/definitions/capability-audit-log-events-hook" + "$id": "#/properties/capability/audit-log-events-hook", + "title": "Audit Log Events Hook", + "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", + "type": "object", + "propertyNames": { + "enum": [ + "receivingEndpoint", + "method", + "templates", + "defaultPolicy" + ] + }, + "properties": { + "receivingEndpoint": { + "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", + "title": "Endpoint URL", + "description": "URL where you'd like LaunchDarkly to send webhooks to", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "method": { + "$id": "#/properties/capability/audit-log-events-hook/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "post", + "put", + "patch" + ] + }, + "templates": { + "$id": "#/properties/capability/audit-log-events-hook/templates", + "title": "Webhook body template", + "description": "Templates to use for body of the webhook request", + "type": "object", + "anyOf": [ + { + "propertyNames": { + "enum": [ + "flag", + "project", + "environment", + "metric" + ] + }, + "patternProperties": { + "": { + "type": "string" + } + } + } + ] + }, + "defaultPolicy": { + "$id": "#/properties/capability/audit-log-events-hook/default-policy", + "title": "Default Policy", + "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "array", + "items": { + "$id": "#/properties/capability/audit-log-events-hook/policy", + "title": "Policy", + "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "object", + "propertyNames": { + "enum": [ + "actions", + "effect", + "notActions", + "notResources", + "resources" + ] + }, + "properties": { + "actions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/actions", + "title": "Actions", + "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "updateOn", + "createFlag", + "updateRules", + "updateTargets" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "effect": { + "$id": "#/properties/capability/audit-log-events-hook/policy/effect", + "title": "Effect", + "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", + "default": "allow", + "type": "string", + "enum": [ + "allow", + "deny" + ] + }, + "notActions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", + "title": "Not actions", + "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "createFlag", + "deleteFlag", + "cloneFlag" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "notResources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", + "title": "Not resources", + "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "proj/*:env/production:flag/*" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/resources", + "title": "Resources", + "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "proj/*:env/production:flag/*" + ], + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "required": [ + "receivingEndpoint", + "method" + ] } } } @@ -170,333 +522,5 @@ "icons", "authentication", "capabilities" - ], - "definitions": { - "semver": { - "type": "string", - "minLength": 5, - "maxLength": 14, - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" - }, - "https-url": { - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - }, - "category": { - "type": "string", - "enum": [ - "alerts", - "analytics-and-reporting", - "apm", - "automation", - "communication-and-collaboration", - "config-and-deployment", - "exceptions", - "experimentation", - "hr-and-operations", - "issue-tracking", - "it-and-project-management", - "marketing-and-social-media", - "monitoring", - "orchestration", - "product-and-design", - "provisioning", - "security", - "source-control" - ] - }, - "auth-none": { - "properties": { - "type": { - "$id": "#/properties/authentication/type", - "title": "Auth Type", - "description": "Specify the authentication method required by your integration", - "type": "string", - "enum": [ - "none" - ] - } - }, - "required": [ - "type" - ], - "maxProperties": 1 - }, - "auth-token": { - "properties": { - "type": { - "$id": "#/properties/authentication/type", - "title": "Auth Type", - "description": "Specify the authentication method required by your integration", - "type": "string", - "enum": [ - "token" - ] - }, - "label": { - "$id": "#/properties/authentication/label", - "title": "Token", - "description": "Label to use in the LaunchDarkly UI describing you token", - "examples": [ - "API key", - "API token" - ], - "type": "string" - }, - "hint": { - "$id": "#/properties/authentication/hint", - "title": "Hint", - "description": "A placeholder hint used in the LaunchDarkly UI describing your token", - "examples": [ - "Enter API key from your SpaceXYZ account" - ], - "type": "string" - }, - "acceptedAs": { - "$id": "#/properties/authentication/acceptedAs", - "title": "Token accepted as...", - "description": "Specify how your token should be provided in the request to your service", - "type": "object", - "oneOf": [ - { - "$ref": "#/definitions/accepted-as-header" - }, - { - "$ref": "#/definitions/accepted-as-query-param" - } - ] - } - }, - "required": [ - "type", - "label", - "hint", - "acceptedAs" - ] - }, - "accepted-as-header": { - "properties": { - "type": { - "$id": "#/properties/authentication/acceptedAs/header-type", - "title": "Type", - "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", - "type": "string", - "enum": [ - "header" - ] - }, - "name": { - "$id": "#/properties/authentication/acceptedAs/type/header-name", - "title": "Header name", - "description": "Specify the name of the header you'd like to use", - "type": "string", - "examples": [ - "Authorization", - "X-SpaceXYZ-Auth" - ], - "minLength": 1 - }, - "prefix": { - "$id": "#/properties/authentication/acceptedAs/type/header-value-prefix", - "title": "Header value prefix", - "description": "If your token needs to be padded with a prefix, specify it here", - "type": "string", - "examples": [ - "Bearer " - ] - } - }, - "required": [ - "type", - "name" - ] - }, - "accepted-as-query-param": { - "properties": { - "type": { - "$id": "#/properties/authentication/acceptedAs/query-param-type", - "title": "Type", - "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", - "type": "string", - "enum": [ - "query-param" - ] - }, - "name": { - "$id": "#/properties/authentication/acceptedAs/type/query-param-name", - "title": "Query parameter name", - "description": "Specify the name of the query parameter you'd like to use", - "type": "string", - "examples": [ - "token", - "key" - ], - "minLength": 1 - } - }, - "required": [ - "type", - "name" - ] - }, - "capability-audit-log-events-hook": { - "$id": "#/properties/capability/audit-log-events-hook", - "title": "Audit Log Events Hook", - "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", - "type": "object", - "propertyNames": { - "enum": [ - "receivingEndpoint", - "method", - "templates", - "defaultPolicy" - ] - }, - "properties": { - "receivingEndpoint": { - "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", - "title": "Endpoint URL", - "description": "URL where you'd like LaunchDarkly to send webhooks to", - "$ref": "#/definitions/https-url" - }, - "method": { - "$id": "#/properties/capability/audit-log-events-hook/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": [ - "post", - "put", - "patch" - ] - }, - "templates": { - "$id": "#/properties/capability/audit-log-events-hook/templates", - "title": "Webhook body template", - "description": "Templates to use for body of the webhook request", - "type": "object", - "anyOf": [ - { - "propertyNames": { - "enum": [ - "flag", - "project", - "environment", - "metric" - ] - }, - "patternProperties": { - "": { - "type": "string" - } - } - } - ] - }, - "defaultPolicy": { - "$id": "#/properties/capability/audit-log-events-hook/default-policy", - "title": "Default Policy", - "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "array", - "items": { - "$id": "#/properties/capability/audit-log-events-hook/policy", - "title": "Policy", - "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "object", - "propertyNames": { - "enum": [ - "actions", - "effect", - "notActions", - "notResources", - "resources" - ] - }, - "properties": { - "actions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/actions", - "title": "Actions", - "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "updateOn", - "createFlag", - "updateRules", - "updateTargets" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "effect": { - "$id": "#/properties/capability/audit-log-events-hook/policy/effect", - "title": "Effect", - "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", - "default": "allow", - "type": "string", - "enum": [ - "allow", - "deny" - ] - }, - "notActions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", - "title": "Not actions", - "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "createFlag", - "deleteFlag", - "cloneFlag" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "notResources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", - "title": "Not resources", - "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "proj/*:env/production:flag/*" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "resources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/resources", - "title": "Resources", - "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "proj/*:env/production:flag/*" - ], - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "receivingEndpoint", - "method" - ] - } - } + ] } \ No newline at end of file From bd915d3c5560b30726a789575192022ec6fe0744 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 10 Oct 2019 15:29:05 -0700 Subject: [PATCH 008/936] Updated capabilities --- MANIFEST.md | 253 ++++++++++++++++++++++++++++ _schemas/manifest.schema.json | 246 ++++++++++++++------------- manifest.schema.json | 306 +++++++++++++++++----------------- 3 files changed, 525 insertions(+), 280 deletions(-) diff --git a/MANIFEST.md b/MANIFEST.md index 68045220..84868cf3 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -105,6 +105,259 @@ Specify which capabilities you'd like your integration to have `object` with following properties: +| Property | Type | Required | +| -------------------- | ------ | -------- | +| `auditLogEventsHook` | object | Optional | + +#### auditLogEventsHook + +##### Audit Log Events Hook + +This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint. + +`auditLogEventsHook` + +- is optional +- type: `object` + +##### auditLogEventsHook Type + +`object` with following properties: + +| Property | Type | Required | +| ------------------- | ------ | ------------ | +| `defaultPolicy` | array | Optional | +| `method` | | **Required** | +| `receivingEndpoint` | string | **Required** | +| `templates` | object | Optional | + +#### defaultPolicy + +##### Default Policy + +LaunchDarkly policy that allows you to filter events sent to your webhook. See +https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. + +`defaultPolicy` + +- is optional +- type: `object[]` + +##### defaultPolicy Type + +Array type: `object[]` + +All items must be of the type: `object` with following properties: + +| Property | Type | Required | Default | +| -------------- | ------ | -------- | --------- | +| `actions` | array | Optional | `["*"]` | +| `effect` | string | Optional | `"allow"` | +| `notActions` | array | Optional | `["*"]` | +| `notResources` | array | Optional | `["*"]` | +| `resources` | array | Optional | `["*"]` | + +#### actions + +##### Actions + +A list of action specifiers defining the actions to which the statement applies. See +https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. + +`actions` + +- is optional +- type: `string[]` +- default: `["*"]` + +##### actions Type + +Array type: `string[]` + +All items must be of the type: `string` + +##### actions Examples + +```json +updateOn +``` + +```json +createFlag +``` + +```json +updateRules +``` + +```json +updateTargets +``` + +#### effect + +##### Effect + +This attribute defines whether the statement allows or denies access to the named resources and actions. + +`effect` + +- is optional +- type: `enum` +- default: `"allow"` + +The value of this property **must** be equal to one of the [known values below](#capabilities-known-values). + +##### effect Known Values + +| Value | Description | +| ------- | ----------- | +| `allow` | | +| `deny` | | + +#### notActions + +##### Not actions + +A list of action specifiers defining the actions to which the statement does not apply. See +https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. + +`notActions` + +- is optional +- type: `string[]` +- default: `["*"]` + +##### notActions Type + +Array type: `string[]` + +All items must be of the type: `string` + +##### notActions Examples + +```json +createFlag +``` + +```json +deleteFlag +``` + +```json +cloneFlag +``` + +#### notResources + +##### Not resources + +A list of resource specifiers defining the resources to which the statement does not apply. See +https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. + +`notResources` + +- is optional +- type: `string[]` +- default: `["*"]` + +##### notResources Type + +Array type: `string[]` + +All items must be of the type: `string` + +##### notResources Example + +```json +proj/*:env/production:flag/* +``` + +#### resources + +##### Resources + +A list of resource specifiers defining the resources to which the statement applies. See +https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. + +`resources` + +- is optional +- type: `string[]` +- default: `["*"]` + +##### resources Type + +Array type: `string[]` + +All items must be of the type: `string` + +##### resources Example + +```json +proj/*:env/production:flag/* +``` + +A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. + +#### method + +##### HTTP method + +HTTP method to use when LaunchDarkly makes the request to your endpoint + +`method` + +- is **required** +- type: `enum` + +The value of this property **must** be equal to one of the [known values below](#capabilities-known-values). + +##### method Known Values + +| Value | Description | +| ------- | ----------- | +| `post` | | +| `put` | | +| `patch` | | + +#### receivingEndpoint + +##### Endpoint URL + +URL where you'd like LaunchDarkly to send webhooks to + +`receivingEndpoint` + +- is **required** +- type: `string` + +##### receivingEndpoint Type + +`string` + +- maximum length: 2048 characters All instances must conform to this regular expression (test examples + [here](https://regexr.com/?expression=%5E%5BHh%5D%5BTt%5D%5BTt%5D%5BPp%5D%5BSs%5D%3F%3A%2F%2F)): + +```regex +^[Hh][Tt][Tt][Pp][Ss]?:// +``` + +#### templates + +##### Webhook body template + +Templates to use for body of the webhook request + +`templates` + +- is optional +- type: `object` + +##### templates Type + +`object` with following properties: + | Property | Type | Required | | -------- | ---- | -------- | diff --git a/_schemas/manifest.schema.json b/_schemas/manifest.schema.json index 964aae4a..3cd24fa0 100644 --- a/_schemas/manifest.schema.json +++ b/_schemas/manifest.schema.json @@ -283,141 +283,137 @@ "title": "Capabilities", "description": "Specify which capabilities you'd like your integration to have", "type": "object", - "anyOf": [ - { + "properties": { + "auditLogEventsHook": { + "$id": "#/properties/capability/audit-log-events-hook", + "title": "Audit Log Events Hook", + "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", + "type": "object", + "propertyNames": { + "enum": [ + "receivingEndpoint", + "method", + "templates", + "defaultPolicy" + ] + }, "properties": { - "auditLogEventsHook": { - "$id": "#/properties/capability/audit-log-events-hook", - "title": "Audit Log Events Hook", - "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", + "receivingEndpoint": { + "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", + "title": "Endpoint URL", + "description": "URL where you'd like LaunchDarkly to send webhooks to", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "method": { + "$id": "#/properties/capability/audit-log-events-hook/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": ["post", "put", "patch"] + }, + "templates": { + "$id": "#/properties/capability/audit-log-events-hook/templates", + "title": "Webhook body template", + "description": "Templates to use for body of the webhook request", "type": "object", - "propertyNames": { - "enum": [ - "receivingEndpoint", - "method", - "templates", - "defaultPolicy" - ] - }, - "properties": { - "receivingEndpoint": { - "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", - "title": "Endpoint URL", - "description": "URL where you'd like LaunchDarkly to send webhooks to", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - }, - "method": { - "$id": "#/properties/capability/audit-log-events-hook/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": ["post", "put", "patch"] - }, - "templates": { - "$id": "#/properties/capability/audit-log-events-hook/templates", - "title": "Webhook body template", - "description": "Templates to use for body of the webhook request", - "type": "object", - "anyOf": [ - { - "propertyNames": { - "enum": ["flag", "project", "environment", "metric"] - }, - "patternProperties": { - "": { - "type": "string" - } - } + "anyOf": [ + { + "propertyNames": { + "enum": ["flag", "project", "environment", "metric"] + }, + "patternProperties": { + "": { + "type": "string" } + } + } + ] + }, + "defaultPolicy": { + "$id": "#/properties/capability/audit-log-events-hook/default-policy", + "title": "Default Policy", + "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "array", + "items": { + "$id": "#/properties/capability/audit-log-events-hook/policy", + "title": "Policy", + "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "object", + "propertyNames": { + "enum": [ + "actions", + "effect", + "notActions", + "notResources", + "resources" ] }, - "defaultPolicy": { - "$id": "#/properties/capability/audit-log-events-hook/default-policy", - "title": "Default Policy", - "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "array", - "items": { - "$id": "#/properties/capability/audit-log-events-hook/policy", - "title": "Policy", - "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "object", - "propertyNames": { - "enum": [ - "actions", - "effect", - "notActions", - "notResources", - "resources" - ] - }, - "properties": { - "actions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/actions", - "title": "Actions", - "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": ["*"], - "examples": [ - "updateOn", - "createFlag", - "updateRules", - "updateTargets" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "effect": { - "$id": "#/properties/capability/audit-log-events-hook/policy/effect", - "title": "Effect", - "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", - "default": "allow", - "type": "string", - "enum": ["allow", "deny"] - }, - "notActions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", - "title": "Not actions", - "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": ["*"], - "examples": ["createFlag", "deleteFlag", "cloneFlag"], - "type": "array", - "items": { - "type": "string" - } - }, - "notResources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", - "title": "Not resources", - "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": ["*"], - "examples": ["proj/*:env/production:flag/*"], - "type": "array", - "items": { - "type": "string" - } - }, - "resources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/resources", - "title": "Resources", - "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": ["*"], - "examples": ["proj/*:env/production:flag/*"], - "type": "array", - "items": { - "type": "string" - } - } + "properties": { + "actions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/actions", + "title": "Actions", + "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": ["*"], + "examples": [ + "updateOn", + "createFlag", + "updateRules", + "updateTargets" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "effect": { + "$id": "#/properties/capability/audit-log-events-hook/policy/effect", + "title": "Effect", + "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", + "default": "allow", + "type": "string", + "enum": ["allow", "deny"] + }, + "notActions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", + "title": "Not actions", + "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": ["*"], + "examples": ["createFlag", "deleteFlag", "cloneFlag"], + "type": "array", + "items": { + "type": "string" + } + }, + "notResources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", + "title": "Not resources", + "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": ["*"], + "examples": ["proj/*:env/production:flag/*"], + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/resources", + "title": "Resources", + "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": ["*"], + "examples": ["proj/*:env/production:flag/*"], + "type": "array", + "items": { + "type": "string" } } } - }, - "required": ["receivingEndpoint", "method"] + } } - } + }, + "required": ["receivingEndpoint", "method"] } - ], + }, "minProperties": 1 } }, diff --git a/manifest.schema.json b/manifest.schema.json index 44a9cbe0..4f7af505 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -342,172 +342,168 @@ "title": "Capabilities", "description": "Specify which capabilities you'd like your integration to have", "type": "object", - "anyOf": [ - { + "properties": { + "auditLogEventsHook": { + "$id": "#/properties/capability/audit-log-events-hook", + "title": "Audit Log Events Hook", + "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", + "type": "object", + "propertyNames": { + "enum": [ + "receivingEndpoint", + "method", + "templates", + "defaultPolicy" + ] + }, "properties": { - "auditLogEventsHook": { - "$id": "#/properties/capability/audit-log-events-hook", - "title": "Audit Log Events Hook", - "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", + "receivingEndpoint": { + "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", + "title": "Endpoint URL", + "description": "URL where you'd like LaunchDarkly to send webhooks to", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "method": { + "$id": "#/properties/capability/audit-log-events-hook/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "post", + "put", + "patch" + ] + }, + "templates": { + "$id": "#/properties/capability/audit-log-events-hook/templates", + "title": "Webhook body template", + "description": "Templates to use for body of the webhook request", "type": "object", - "propertyNames": { - "enum": [ - "receivingEndpoint", - "method", - "templates", - "defaultPolicy" - ] - }, - "properties": { - "receivingEndpoint": { - "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", - "title": "Endpoint URL", - "description": "URL where you'd like LaunchDarkly to send webhooks to", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - }, - "method": { - "$id": "#/properties/capability/audit-log-events-hook/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "anyOf": [ + { + "propertyNames": { + "enum": [ + "flag", + "project", + "environment", + "metric" + ] + }, + "patternProperties": { + "": { + "type": "string" + } + } + } + ] + }, + "defaultPolicy": { + "$id": "#/properties/capability/audit-log-events-hook/default-policy", + "title": "Default Policy", + "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "array", + "items": { + "$id": "#/properties/capability/audit-log-events-hook/policy", + "title": "Policy", + "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "object", + "propertyNames": { "enum": [ - "post", - "put", - "patch" + "actions", + "effect", + "notActions", + "notResources", + "resources" ] }, - "templates": { - "$id": "#/properties/capability/audit-log-events-hook/templates", - "title": "Webhook body template", - "description": "Templates to use for body of the webhook request", - "type": "object", - "anyOf": [ - { - "propertyNames": { - "enum": [ - "flag", - "project", - "environment", - "metric" - ] - }, - "patternProperties": { - "": { - "type": "string" - } - } + "properties": { + "actions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/actions", + "title": "Actions", + "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "updateOn", + "createFlag", + "updateRules", + "updateTargets" + ], + "type": "array", + "items": { + "type": "string" } - ] - }, - "defaultPolicy": { - "$id": "#/properties/capability/audit-log-events-hook/default-policy", - "title": "Default Policy", - "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "array", - "items": { - "$id": "#/properties/capability/audit-log-events-hook/policy", - "title": "Policy", - "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "object", - "propertyNames": { - "enum": [ - "actions", - "effect", - "notActions", - "notResources", - "resources" - ] - }, - "properties": { - "actions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/actions", - "title": "Actions", - "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "updateOn", - "createFlag", - "updateRules", - "updateTargets" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "effect": { - "$id": "#/properties/capability/audit-log-events-hook/policy/effect", - "title": "Effect", - "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", - "default": "allow", - "type": "string", - "enum": [ - "allow", - "deny" - ] - }, - "notActions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", - "title": "Not actions", - "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "createFlag", - "deleteFlag", - "cloneFlag" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "notResources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", - "title": "Not resources", - "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "proj/*:env/production:flag/*" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "resources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/resources", - "title": "Resources", - "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "proj/*:env/production:flag/*" - ], - "type": "array", - "items": { - "type": "string" - } - } + }, + "effect": { + "$id": "#/properties/capability/audit-log-events-hook/policy/effect", + "title": "Effect", + "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", + "default": "allow", + "type": "string", + "enum": [ + "allow", + "deny" + ] + }, + "notActions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", + "title": "Not actions", + "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "createFlag", + "deleteFlag", + "cloneFlag" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "notResources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", + "title": "Not resources", + "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "proj/*:env/production:flag/*" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/resources", + "title": "Resources", + "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "proj/*:env/production:flag/*" + ], + "type": "array", + "items": { + "type": "string" } } } - }, - "required": [ - "receivingEndpoint", - "method" - ] + } } - } + }, + "required": [ + "receivingEndpoint", + "method" + ] } - ], + }, "minProperties": 1 } }, From cc94e4bbb103fa7498558d7f058071e36d71beca Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 10 Oct 2019 16:25:18 -0700 Subject: [PATCH 009/936] Added semver url --- MANIFEST.md | 2 +- _schemas/manifest.schema.json | 2 +- manifest.schema.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MANIFEST.md b/MANIFEST.md index 84868cf3..895814b7 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -628,7 +628,7 @@ A short-one liner describing your integration ### Version -A semantic version of the integration +A semantic version of the integration. See https://semver.org for more info. `version` diff --git a/_schemas/manifest.schema.json b/_schemas/manifest.schema.json index 3cd24fa0..26bcd991 100644 --- a/_schemas/manifest.schema.json +++ b/_schemas/manifest.schema.json @@ -18,7 +18,7 @@ "version": { "$id": "#/properties/version", "title": "Version", - "description": "A semantic version of the integration", + "description": "A semantic version of the integration. See https://semver.org for more info.", "examples": ["0.0.1", "1.0.0", "1.0.1-beta"], "type": "string", "minLength": 5, diff --git a/manifest.schema.json b/manifest.schema.json index 4f7af505..9cb6d032 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -18,7 +18,7 @@ "version": { "$id": "#/properties/version", "title": "Version", - "description": "A semantic version of the integration", + "description": "A semantic version of the integration. See https://semver.org for more info.", "examples": [ "0.0.1", "1.0.0", From f87dcaeed56827f18dae7faa2bcb17a7315ee9fb Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 10:27:15 -0700 Subject: [PATCH 010/936] Adding S3 upload action --- .github/workflows/copy2s3.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/copy2s3.yml diff --git a/.github/workflows/copy2s3.yml b/.github/workflows/copy2s3.yml new file mode 100644 index 00000000..8d016e0d --- /dev/null +++ b/.github/workflows/copy2s3.yml @@ -0,0 +1,18 @@ +name: CI + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - name: S3 Backup + uses: peter-evans/s3-backup@v1.0.0 + env: + ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }} + SECRET_ACCESS_KEY: ${{ secrets.SECRET_ACCESS_KEY }} + MIRROR_TARGET: repo-backup-bucket/at/some/path + with: + args: --overwrite --remove From 3deaa515b4aa6527fbb828c31304c713d97859e2 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 10:32:34 -0700 Subject: [PATCH 011/936] Update copy2s3.yml --- .github/workflows/copy2s3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/copy2s3.yml b/.github/workflows/copy2s3.yml index 8d016e0d..3c63fb84 100644 --- a/.github/workflows/copy2s3.yml +++ b/.github/workflows/copy2s3.yml @@ -13,6 +13,6 @@ jobs: env: ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }} SECRET_ACCESS_KEY: ${{ secrets.SECRET_ACCESS_KEY }} - MIRROR_TARGET: repo-backup-bucket/at/some/path + MIRROR_TARGET: launchdarkly-integrations-dev/integrations with: args: --overwrite --remove From 232c47da69ceb065b387659a1eacb30fc84f888c Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 10:41:18 -0700 Subject: [PATCH 012/936] Update copy2s3.yml --- .github/workflows/copy2s3.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/copy2s3.yml b/.github/workflows/copy2s3.yml index 3c63fb84..d52e6f3b 100644 --- a/.github/workflows/copy2s3.yml +++ b/.github/workflows/copy2s3.yml @@ -1,13 +1,14 @@ -name: CI - -on: [push] +name: Copy repo to S3 +on: + push: + branches: + - master jobs: - build: - - runs-on: ubuntu-latest - + s3copy: + runs-on: ubuntu-latest steps: + - uses: actions/checkout@master - name: S3 Backup uses: peter-evans/s3-backup@v1.0.0 env: From 1a773df7b665106e5f75e34399e3beeb1dc075da Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 11:24:48 -0700 Subject: [PATCH 013/936] Adding CircleCI config --- sample-integration/.circleci/config.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 sample-integration/.circleci/config.yml diff --git a/sample-integration/.circleci/config.yml b/sample-integration/.circleci/config.yml new file mode 100644 index 00000000..c65196f6 --- /dev/null +++ b/sample-integration/.circleci/config.yml @@ -0,0 +1,13 @@ +version: 2.1 + +orbs: + aws-s3: circleci/aws-s3@1.0.0 +jobs: + build: + docker: + - image: "circleci/python:2.7" + steps: + - checkout + - aws-s3/copy: + from: ./ + to: "s3://launchdarkly-integrations-dev" From d3ed129dcb93a47ac101597f58342af03e6a7caa Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 11:29:16 -0700 Subject: [PATCH 014/936] Move Circle CI dir to root --- {sample-integration/.circleci => .circleci}/config.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {sample-integration/.circleci => .circleci}/config.yml (100%) diff --git a/sample-integration/.circleci/config.yml b/.circleci/config.yml similarity index 100% rename from sample-integration/.circleci/config.yml rename to .circleci/config.yml From 85a7269890fb79c89a5f1c085b11a93be7c6ae4c Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 12:10:58 -0700 Subject: [PATCH 015/936] Circle CI stuff --- .circleci/config.yml | 13 ++++++------- .github/workflows/copy2s3.yml | 19 ------------------- .../sample-integration}/LICENSE.md | 0 .../sample-integration}/README.md | 0 .../assets/images/rectangular.svg | 0 .../assets/images/square.svg | 0 .../sample-integration}/manifest.json | 0 .../templates/template.json | 0 scripts/copy_to_s3.sh | 2 ++ 9 files changed, 8 insertions(+), 26 deletions(-) delete mode 100644 .github/workflows/copy2s3.yml rename {sample-integration => integrations/sample-integration}/LICENSE.md (100%) rename {sample-integration => integrations/sample-integration}/README.md (100%) rename {sample-integration => integrations/sample-integration}/assets/images/rectangular.svg (100%) rename {sample-integration => integrations/sample-integration}/assets/images/square.svg (100%) rename {sample-integration => integrations/sample-integration}/manifest.json (100%) rename {sample-integration => integrations/sample-integration}/templates/template.json (100%) create mode 100755 scripts/copy_to_s3.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index c65196f6..96d794f8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,13 +1,12 @@ version: 2.1 orbs: - aws-s3: circleci/aws-s3@1.0.0 + aws-cli: circleci/aws-cli@latest jobs: - build: - docker: - - image: "circleci/python:2.7" + copy2s3: steps: - checkout - - aws-s3/copy: - from: ./ - to: "s3://launchdarkly-integrations-dev" + - aws-cli/install + - deploy: + - command: | + ./scripts/copy_to_s3.sh \ No newline at end of file diff --git a/.github/workflows/copy2s3.yml b/.github/workflows/copy2s3.yml deleted file mode 100644 index d52e6f3b..00000000 --- a/.github/workflows/copy2s3.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Copy repo to S3 - -on: - push: - branches: - - master -jobs: - s3copy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - name: S3 Backup - uses: peter-evans/s3-backup@v1.0.0 - env: - ACCESS_KEY_ID: ${{ secrets.ACCESS_KEY_ID }} - SECRET_ACCESS_KEY: ${{ secrets.SECRET_ACCESS_KEY }} - MIRROR_TARGET: launchdarkly-integrations-dev/integrations - with: - args: --overwrite --remove diff --git a/sample-integration/LICENSE.md b/integrations/sample-integration/LICENSE.md similarity index 100% rename from sample-integration/LICENSE.md rename to integrations/sample-integration/LICENSE.md diff --git a/sample-integration/README.md b/integrations/sample-integration/README.md similarity index 100% rename from sample-integration/README.md rename to integrations/sample-integration/README.md diff --git a/sample-integration/assets/images/rectangular.svg b/integrations/sample-integration/assets/images/rectangular.svg similarity index 100% rename from sample-integration/assets/images/rectangular.svg rename to integrations/sample-integration/assets/images/rectangular.svg diff --git a/sample-integration/assets/images/square.svg b/integrations/sample-integration/assets/images/square.svg similarity index 100% rename from sample-integration/assets/images/square.svg rename to integrations/sample-integration/assets/images/square.svg diff --git a/sample-integration/manifest.json b/integrations/sample-integration/manifest.json similarity index 100% rename from sample-integration/manifest.json rename to integrations/sample-integration/manifest.json diff --git a/sample-integration/templates/template.json b/integrations/sample-integration/templates/template.json similarity index 100% rename from sample-integration/templates/template.json rename to integrations/sample-integration/templates/template.json diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh new file mode 100755 index 00000000..cbfcfd6d --- /dev/null +++ b/scripts/copy_to_s3.sh @@ -0,0 +1,2 @@ +aws s3 rm --recursive s3://launchdarkly-integrations-dev/integrations +aws s3 cp --recursive integrations s3://launchdarkly-integrations-dev/integrations \ No newline at end of file From e4088776b4a065262679d58e5855b7fd84648959 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 12:12:05 -0700 Subject: [PATCH 016/936] Circle CI job fix --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 96d794f8..a5a287f4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,5 +8,5 @@ jobs: - checkout - aws-cli/install - deploy: - - command: | - ./scripts/copy_to_s3.sh \ No newline at end of file + command: | + ./scripts/copy_to_s3.sh From 4eacfca187da2b75ed04ff66420e809b4aa152ee Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 12:14:11 -0700 Subject: [PATCH 017/936] Circle CI fix --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index a5a287f4..ef244bd3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,6 +3,8 @@ version: 2.1 orbs: aws-cli: circleci/aws-cli@latest jobs: + docker: + - image: "circleci/python:2.7" copy2s3: steps: - checkout From d4c220a9723cfcbb8de7c2fd0d736768ce00498a Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 12:20:57 -0700 Subject: [PATCH 018/936] Circle CI fix --- .circleci/config.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ef244bd3..f738b7d4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,11 +1,12 @@ version: 2.1 orbs: - aws-cli: circleci/aws-cli@latest + aws-cli: circleci/aws-cli@0.1.16 + jobs: - docker: - - image: "circleci/python:2.7" - copy2s3: + build: + docker: + - image: ubuntu-1604:201903-01 steps: - checkout - aws-cli/install From 6be705bbc711f1fe2dbdc443a59de9a992348f7e Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 12:22:13 -0700 Subject: [PATCH 019/936] CircleCI fix --- .circleci/config.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f738b7d4..3e7def18 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,8 +5,9 @@ orbs: jobs: build: - docker: - - image: ubuntu-1604:201903-01 + machine: + image: ubuntu-1604:201903-01 + docker_layer_caching: true steps: - checkout - aws-cli/install From 96d29d7a24b85fbdc28f5a964d1c20aa4618cf34 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 12:25:04 -0700 Subject: [PATCH 020/936] Circle CI fix --- .circleci/config.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3e7def18..9846cf96 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,9 +5,8 @@ orbs: jobs: build: - machine: - image: ubuntu-1604:201903-01 - docker_layer_caching: true + docker: + - image: circleci/golang:latest steps: - checkout - aws-cli/install From 539f2fad328d3c2d9332c43e8a8a970a93b71da6 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 13:02:22 -0700 Subject: [PATCH 021/936] Write `latest` sha to S3 --- .circleci/config.yml | 3 +-- scripts/copy_to_s3.sh | 4 +++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9846cf96..e32a7ee6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,5 +11,4 @@ jobs: - checkout - aws-cli/install - deploy: - command: | - ./scripts/copy_to_s3.sh + command: ./scripts/copy_to_s3.sh diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index cbfcfd6d..7b982a28 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -1,2 +1,4 @@ +echo $CIRCLE_SHA1 > latest aws s3 rm --recursive s3://launchdarkly-integrations-dev/integrations -aws s3 cp --recursive integrations s3://launchdarkly-integrations-dev/integrations \ No newline at end of file +aws s3 cp --recursive integrations s3://launchdarkly-integrations-dev/integrations +aws s3 cp latest s3://launchdarkly-integrations-dev/integrations \ No newline at end of file From 0974c82177c060c300bb7e52e6d0be5942563502 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 13:07:26 -0700 Subject: [PATCH 022/936] Create latest.txt on s3 --- scripts/copy_to_s3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 7b982a28..6eca34ea 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -1,4 +1,4 @@ echo $CIRCLE_SHA1 > latest aws s3 rm --recursive s3://launchdarkly-integrations-dev/integrations aws s3 cp --recursive integrations s3://launchdarkly-integrations-dev/integrations -aws s3 cp latest s3://launchdarkly-integrations-dev/integrations \ No newline at end of file +aws s3 cp latest s3://launchdarkly-integrations-dev/integrations/latest.txt \ No newline at end of file From 7ba89cab7000b103daceae558ad64e68b804fb92 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 16 Oct 2019 13:55:42 -0700 Subject: [PATCH 023/936] Simplified dir structure --- .circleci/config.yml | 2 +- MANIFEST.md | 6 +- _schemas/manifest.schema.json | 432 ---------------------------------- package.json | 2 +- yarn.lock | 375 ++--------------------------- 5 files changed, 23 insertions(+), 794 deletions(-) delete mode 100644 _schemas/manifest.schema.json diff --git a/.circleci/config.yml b/.circleci/config.yml index e32a7ee6..10dcaa9b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,7 +6,7 @@ orbs: jobs: build: docker: - - image: circleci/golang:latest + - image: circleci/node:latest steps: - checkout - aws-cli/install diff --git a/MANIFEST.md b/MANIFEST.md index 895814b7..e317f67b 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -6,9 +6,9 @@ https://launchdarkly.com/schemas/v1.0/integrations Describes the capabilities and intent of a LaunchDarkly integration -| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Defined In | -| ------------------- | ---------- | ------------ | ------------ | ----------------- | --------------------- | -------------------------------------------- | -| Can be instantiated | No | Experimental | No | Forbidden | Forbidden | [manifest.schema.json](manifest.schema.json) | +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Defined In | +| ------------------- | ---------- | ------------ | ------------ | ----------------- | --------------------- | ---------- | +| Can be instantiated | No | Experimental | No | Forbidden | Forbidden | | # LaunchDarkly Integrations Manifest Properties diff --git a/_schemas/manifest.schema.json b/_schemas/manifest.schema.json deleted file mode 100644 index 26bcd991..00000000 --- a/_schemas/manifest.schema.json +++ /dev/null @@ -1,432 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://launchdarkly.com/schemas/v1.0/integrations", - "title": "LaunchDarkly Integrations Manifest", - "description": "Describes the capabilities and intent of a LaunchDarkly integration", - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "$id": "#/properties/name", - "title": "Integration name", - "description": "Your integration's name. No spaces", - "minLength": 3, - "maxLength": 50, - "type": "string", - "pattern": "^\\S*$" - }, - "version": { - "$id": "#/properties/version", - "title": "Version", - "description": "A semantic version of the integration. See https://semver.org for more info.", - "examples": ["0.0.1", "1.0.0", "1.0.1-beta"], - "type": "string", - "minLength": 5, - "maxLength": 14, - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" - }, - "overview": { - "$id": "#/properties/overview", - "title": "Short description", - "description": "A short-one liner describing your integration", - "type": "string", - "minLength": 10, - "maxLength": 100, - "pattern": "^(.*)$" - }, - "description": { - "$id": "#/properties/description", - "title": "Long description", - "description": "A longer description of your integration", - "type": "string", - "minLength": 50, - "maxLength": 2048, - "pattern": "^(.*)$" - }, - "author": { - "$id": "#/properties/author", - "title": "Author", - "description": "Name of the author or organization responsible for the integration", - "type": "string", - "minLength": 3, - "maxLength": 100, - "pattern": "^(.*)$" - }, - "links": { - "$id": "#/properties/links", - "title": "Links", - "description": "A set of reference links supporting your integration", - "type": "object", - "properties": { - "site": { - "$id": "#/properties/links/site", - "title": "Website", - "description": "URL to your website", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - }, - "privacyPolicy": { - "$id": "#/properties/links/privacy-policy", - "title": "Privacy Policy", - "description": "URL to your organization's privacy policy", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - }, - "supportEmail": { - "$id": "#/properties/links/support-email", - "title": "Support Email", - "description": "Email address for your integration's support", - "type": "string", - "format": "email" - }, - "supportWebsite": { - "$id": "#/properties/links/support-website", - "title": "Support Website", - "description": "URL to your integration's support website", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - } - }, - "required": ["site", "privacyPolicy", "supportEmail"] - }, - "categories": { - "$id": "#/properties/categories", - "title": "Categories", - "description": "Categories that describe your integration", - "type": "array", - "uniqueItems": true, - "minItems": 1, - "maxItems": 3, - "items": { - "type": "string", - "enum": [ - "alerts", - "analytics-and-reporting", - "apm", - "automation", - "communication-and-collaboration", - "config-and-deployment", - "exceptions", - "experimentation", - "hr-and-operations", - "issue-tracking", - "it-and-project-management", - "marketing-and-social-media", - "monitoring", - "orchestration", - "product-and-design", - "provisioning", - "security", - "source-control" - ] - } - }, - "icons": { - "$id": "#/properties/icons", - "title": "Icons", - "description": "Logos describing your integration in SVG format", - "type": "object", - "properties": { - "square": { - "$id": "#/properties/icons/square", - "title": "Square logo", - "description": "A square version of your integration's logo in SVG format", - "type": "string", - "pattern": "\\.svg$" - }, - "rectangular": { - "$id": "#/properties/icons/rectangular", - "title": "Rectangular logo", - "description": "A rectangular version of your integration's logo in SVG format", - "type": "string", - "pattern": "\\.svg$" - } - }, - "required": ["square", "rectangular"] - }, - "authentication": { - "$id": "#/properties/authentication", - "title": "Authentication", - "description": "Specify the authentication method required by your integration", - "type": "object", - "properties": { - "type": { - "$id": "#/properties/authentication/type", - "title": "Auth Type", - "description": "Specify the authentication method required by your integration", - "type": "string", - "enum": ["none", "token"] - } - }, - "allOf": [ - { - "if": { - "properties": { - "type": { - "const": "none" - } - } - }, - "then": { - "propertyNames": { - "enum": ["type"] - } - } - }, - { - "if": { - "properties": { - "type": { - "const": "token" - } - } - }, - "then": { - "properties": { - "label": { - "$id": "#/properties/authentication/label", - "title": "Token", - "description": "Label to use in the LaunchDarkly UI describing you token", - "examples": ["API key", "API token"], - "type": "string" - }, - "hint": { - "$id": "#/properties/authentication/hint", - "title": "Hint", - "description": "A placeholder hint used in the LaunchDarkly UI describing your token", - "examples": ["Enter API key from your SpaceXYZ account"], - "type": "string" - }, - "acceptedAs": { - "$id": "#/properties/authentication/acceptedAs", - "title": "Token accepted as...", - "description": "Specify how your token should be provided in the request to your service", - "type": "object", - "properties": { - "type": { - "$id": "#/properties/authentication/acceptedAs/type", - "title": "Type", - "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", - "type": "string", - "enum": ["query-param", "header"] - } - }, - "allOf": [ - { - "if": { - "properties": { - "type": { "const": "query-param" } - } - }, - "then": { - "properties": { - "name": { - "$id": "#/properties/authentication/acceptedAs/type/query-param-name", - "title": "Query parameter name", - "description": "Specify the name of the query parameter you'd like to use", - "type": "string", - "examples": ["token", "key"] - } - }, - "required": ["name"], - "propertyNames": { - "enum": ["type", "name"] - } - } - }, - { - "if": { - "properties": { - "type": { "const": "header" } - } - }, - "then": { - "properties": { - "name": { - "$id": "#/properties/authentication/acceptedAs/type/header-name", - "title": "Header name", - "description": "Specify the name of the header you'd like to use", - "type": "string", - "examples": ["Authorization", "X-SpaceXYZ-Auth"] - }, - "prefix": { - "$id": "#/properties/authentication/acceptedAs/type/header-value-prefix", - "title": "Header value prefix", - "description": "If your token needs to be padded with a prefix, specify it here", - "type": "string", - "examples": ["Bearer "] - } - }, - "required": ["name"], - "propertyNames": { - "enum": ["type", "name", "prefix"] - } - } - } - ] - } - }, - "required": ["type", "label", "hint", "acceptedAs"], - "propertyNames": { - "enum": ["type", "label", "hint", "acceptedAs"] - } - } - } - ], - "required": ["type"] - }, - "capabilities": { - "$id": "#/properties/capabilities", - "title": "Capabilities", - "description": "Specify which capabilities you'd like your integration to have", - "type": "object", - "properties": { - "auditLogEventsHook": { - "$id": "#/properties/capability/audit-log-events-hook", - "title": "Audit Log Events Hook", - "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", - "type": "object", - "propertyNames": { - "enum": [ - "receivingEndpoint", - "method", - "templates", - "defaultPolicy" - ] - }, - "properties": { - "receivingEndpoint": { - "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", - "title": "Endpoint URL", - "description": "URL where you'd like LaunchDarkly to send webhooks to", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - }, - "method": { - "$id": "#/properties/capability/audit-log-events-hook/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": ["post", "put", "patch"] - }, - "templates": { - "$id": "#/properties/capability/audit-log-events-hook/templates", - "title": "Webhook body template", - "description": "Templates to use for body of the webhook request", - "type": "object", - "anyOf": [ - { - "propertyNames": { - "enum": ["flag", "project", "environment", "metric"] - }, - "patternProperties": { - "": { - "type": "string" - } - } - } - ] - }, - "defaultPolicy": { - "$id": "#/properties/capability/audit-log-events-hook/default-policy", - "title": "Default Policy", - "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "array", - "items": { - "$id": "#/properties/capability/audit-log-events-hook/policy", - "title": "Policy", - "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "object", - "propertyNames": { - "enum": [ - "actions", - "effect", - "notActions", - "notResources", - "resources" - ] - }, - "properties": { - "actions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/actions", - "title": "Actions", - "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": ["*"], - "examples": [ - "updateOn", - "createFlag", - "updateRules", - "updateTargets" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "effect": { - "$id": "#/properties/capability/audit-log-events-hook/policy/effect", - "title": "Effect", - "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", - "default": "allow", - "type": "string", - "enum": ["allow", "deny"] - }, - "notActions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", - "title": "Not actions", - "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": ["*"], - "examples": ["createFlag", "deleteFlag", "cloneFlag"], - "type": "array", - "items": { - "type": "string" - } - }, - "notResources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", - "title": "Not resources", - "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": ["*"], - "examples": ["proj/*:env/production:flag/*"], - "type": "array", - "items": { - "type": "string" - } - }, - "resources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/resources", - "title": "Resources", - "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": ["*"], - "examples": ["proj/*:env/production:flag/*"], - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": ["receivingEndpoint", "method"] - } - }, - "minProperties": 1 - } - }, - "required": [ - "name", - "version", - "overview", - "description", - "author", - "links", - "categories", - "icons", - "authentication", - "capabilities" - ] -} diff --git a/package.json b/package.json index 5b2ae4ea..b7f8e450 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", "main": "index.js", "scripts": { - "prepare": "jsonschema2md -d _schemas -o . -n && mv manifest.schema.md MANIFEST.md" + "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md" }, "repository": { "type": "git", diff --git a/yarn.lock b/yarn.lock index c11bce5d..290e1b6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -196,20 +196,6 @@ abbrev@1, abbrev@^1.1.1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -agent-base@4, agent-base@^4.2.0, agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - dependencies: - es6-promisify "^5.0.0" - -agent-base@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== - dependencies: - es6-promisify "^5.0.0" - ajv-cli@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ajv-cli/-/ajv-cli-3.0.0.tgz#5823231f64e2833054130690b18099609e980f29" @@ -230,16 +216,6 @@ ajv-pack@^0.3.0: js-beautify "^1.6.4" require-from-string "^1.2.0" -ajv@6.10.2, ajv@^6.0.0, ajv@^6.10.2: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^5.0.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -250,6 +226,16 @@ ajv@^5.0.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^6.0.0, ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ambi@^2.2.0: version "2.5.0" resolved "https://registry.yarnpkg.com/ambi/-/ambi-2.5.0.tgz#7c8e372be48891157e7cea01cb6f9143d1f74220" @@ -314,11 +300,6 @@ asap@~2.0.3: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -ast-types@0.x.x: - version "0.13.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" - integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== - async@^1.4.0, async@~1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -360,11 +341,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -544,25 +520,13 @@ csextends@^1.0.3: resolved "https://registry.yarnpkg.com/csextends/-/csextends-1.2.0.tgz#6374b210984b54d4495f29c99d3dd069b80543e5" integrity sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg== -data-uri-to-buffer@2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz#d296973d5a4897a5dbe31716d118211921f04770" - integrity sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA== - -debug@*, debug@4, debug@^4.1.1: +debug@*, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -580,11 +544,6 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -592,20 +551,6 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -degenerator@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" - integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU= - dependencies: - ast-types "0.x.x" - escodegen "1.x.x" - esprima "3.x.x" - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - diff@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" @@ -730,55 +675,16 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@1.x.x: - version "1.12.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541" - integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -esprima@3.x.x, esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -805,11 +711,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - extendr@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/extendr/-/extendr-2.1.0.tgz#301aa0bbea565f4d2dc8f570f2a22611a8527b56" @@ -853,11 +754,6 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - ferrum@^1.2.0: version "1.4.1" resolved "https://registry.yarnpkg.com/ferrum/-/ferrum-1.4.1.tgz#234bcfe2b4fda2a0f8a3221c0e103defc7c13681" @@ -872,11 +768,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-uri-to-path@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - for-in@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" @@ -904,14 +795,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -ftp@~0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -929,18 +812,6 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" -get-uri@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.3.tgz#fa13352269781d75162c6fc813c9e905323fbab5" - integrity sha512-x5j6Ks7FOgLD/GlvjKwgu7wdmMR55iuRHhn8hj/+gA+eSbxQvZ+AEomq+3MgVEZj1vpi738QahGbCCSIDtXtkw== - dependencies: - data-uri-to-buffer "2" - debug "4" - extend "~3.0.2" - file-uri-to-path "1" - ftp "~0.3.10" - readable-stream "3" - git-up@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" @@ -1044,33 +915,6 @@ hosted-git-info@^2.7.1: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== -http-errors@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" - integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== - dependencies: - agent-base "4" - debug "3.1.0" - -https-proxy-agent@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz#271ea8e90f836ac9f119daccd39c19ff7dfb0793" - integrity sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg== - dependencies: - agent-base "^4.3.0" - debug "^3.1.0" - i18n@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.8.3.tgz#2d8cf1c24722602c2041d01ba6ae5eaa51388f0e" @@ -1083,7 +927,7 @@ i18n@^0.8.3: mustache "*" sprintf-js ">=1.0.3" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -1126,7 +970,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1160,11 +1004,6 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -1282,11 +1121,6 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -1403,14 +1237,6 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - lie@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" @@ -1468,7 +1294,7 @@ lowercase-keys@^1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.5: +lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -1562,11 +1388,6 @@ mkdirp@^0.5.1, mkdirp@~0.5.1: dependencies: minimist "0.0.8" -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -1601,11 +1422,6 @@ needle@^2.2.4: iconv-lite "^0.4.4" sax "^1.2.4" -netmask@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" - integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -1695,18 +1511,6 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -1745,31 +1549,6 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -pac-proxy-agent@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-3.0.0.tgz#11d578b72a164ad74bf9d5bac9ff462a38282432" - integrity sha512-AOUX9jES/EkQX2zRz0AW7lSx9jD//hQS8wFXBvcnd/J2Py9KaMJMqV/LPqJssj1tgGufotb2mmopGPR15ODv1Q== - dependencies: - agent-base "^4.2.0" - debug "^3.1.0" - get-uri "^2.0.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.1" - pac-resolver "^3.0.0" - raw-body "^2.2.0" - socks-proxy-agent "^4.0.1" - -pac-resolver@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-3.0.0.tgz#6aea30787db0a891704deb7800a722a7615a6f26" - integrity sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA== - dependencies: - co "^4.6.0" - degenerator "^1.0.4" - ip "^1.1.5" - netmask "^1.0.6" - thunkify "^2.1.2" - package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -1843,11 +1622,6 @@ polka@^0.5.2: "@polka/url" "^0.5.0" trouter "^2.0.1" -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -1880,20 +1654,6 @@ protocols@^1.1.0, protocols@^1.4.0: resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32" integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== -proxy-agent@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-3.1.0.tgz#3cf86ee911c94874de4359f37efd9de25157c113" - integrity sha512-IkbZL4ClW3wwBL/ABFD2zJ8iP84CY0uKMvBPk/OceQe/cEjrxzN1pMHsLwhbzUoRhG9QbSxYC+Z7LBkTiBNvrA== - dependencies: - agent-base "^4.2.0" - debug "^3.1.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^2.2.1" - lru-cache "^4.1.2" - pac-proxy-agent "^3.0.0" - proxy-from-env "^1.0.0" - socks-proxy-agent "^4.0.1" - proxy-from-env@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" @@ -1917,16 +1677,6 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -raw-body@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" - rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -1937,25 +1687,6 @@ rc@^1.0.1, rc@^1.1.6: minimist "^1.2.0" strip-json-comments "~2.0.1" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@3: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -2025,7 +1756,7 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@~5.2.0: +safe-buffer@^5.0.1: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -2088,11 +1819,6 @@ set-immediate-shim@~1.0.1: resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - shallow-clone@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" @@ -2125,11 +1851,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -smart-buffer@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.2.tgz#5207858c3815cc69110703c6b94e46c15634395d" - integrity sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw== - snyk-config@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-2.2.3.tgz#8e09bb98602ad044954d30a9fc1695ab5b6042fa" @@ -2368,22 +2089,6 @@ snyk@^1.226.1: uuid "^3.3.2" wrap-ansi "^5.1.0" -socks-proxy-agent@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" - integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== - dependencies: - agent-base "~4.2.1" - socks "~2.3.2" - -socks@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.2.tgz#ade388e9e6d87fdb11649c15746c578922a5883e" - integrity sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ== - dependencies: - ip "^1.1.5" - smart-buffer "4.0.2" - source-map-support@^0.5.11, source-map-support@^0.5.7: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -2392,7 +2097,7 @@ source-map-support@^0.5.11, source-map-support@^0.5.7: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0, source-map@~0.6.1: +source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -2407,11 +2112,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -2454,18 +2154,6 @@ string.prototype.trimright@^2.1.0: define-properties "^1.1.3" function-bind "^1.1.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -2551,11 +2239,6 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -thunkify@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" - integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= - timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -2575,11 +2258,6 @@ tmp@^0.1.0: dependencies: rimraf "^2.6.3" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - toml@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" @@ -2607,13 +2285,6 @@ tslib@^1, tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - typechecker@^2.0.8: version "2.1.0" resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.1.0.tgz#d1c2093a54ff8a19f58cff877eeaa54f2242d383" @@ -2638,11 +2309,6 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" @@ -2678,7 +2344,7 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -2751,11 +2417,6 @@ wordwrap@~0.0.2: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -2824,7 +2485,7 @@ xmldom@^0.1.22: resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= -xregexp@2.0.0, xregexp@^2.0.0: +xregexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= From 829f708699dd98d05654b1f83cdd42b7d213971d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 16 Oct 2019 16:05:03 -0700 Subject: [PATCH 024/936] Migrate to production s3 --- .gitignore | 3 ++- scripts/copy_to_s3.sh | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 5320ff70..b05ff1fd 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ node_modules/ build dist public -.DS_Store \ No newline at end of file +.DS_Store +latest \ No newline at end of file diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 6eca34ea..e1852de0 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -1,4 +1,5 @@ -echo $CIRCLE_SHA1 > latest -aws s3 rm --recursive s3://launchdarkly-integrations-dev/integrations -aws s3 cp --recursive integrations s3://launchdarkly-integrations-dev/integrations -aws s3 cp latest s3://launchdarkly-integrations-dev/integrations/latest.txt \ No newline at end of file +#!/bin/bash +REV=$(git rev-parse HEAD | cut -c1-8) +echo $REV > latest +aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV +aws s3 cp latest s3://$BUCKET_NAME/latest.txt \ No newline at end of file From 765fd0c4f59f100ffbd9ee6efcb98e616c5af20f Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 10:17:11 -0700 Subject: [PATCH 025/936] Added datadog, added contentType to schema, and added test step in CI --- .circleci/config.yml | 5 +- .vscode/settings.json | 2 +- integrations/datadog/LICENSE.md | 13 ++++ integrations/datadog/README.md | 0 .../datadog/assets/images/dd_icon_rgb.svg | 41 ++++++++++++ .../datadog/assets/images/dd_logo_h_rgb.svg | 64 +++++++++++++++++++ integrations/datadog/manifest.json | 46 +++++++++++++ integrations/datadog/templates/template.json | 7 ++ integrations/sample-integration/manifest.json | 1 + manifest.schema.json | 16 ++++- package.json | 3 +- 11 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 integrations/datadog/LICENSE.md create mode 100644 integrations/datadog/README.md create mode 100644 integrations/datadog/assets/images/dd_icon_rgb.svg create mode 100644 integrations/datadog/assets/images/dd_logo_h_rgb.svg create mode 100644 integrations/datadog/manifest.json create mode 100644 integrations/datadog/templates/template.json diff --git a/.circleci/config.yml b/.circleci/config.yml index 10dcaa9b..99fe2339 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,4 +11,7 @@ jobs: - checkout - aws-cli/install - deploy: - command: ./scripts/copy_to_s3.sh + command: | + npm ci && + npm test && + ./scripts/copy_to_s3.sh diff --git a/.vscode/settings.json b/.vscode/settings.json index 0af5d7a6..90b58cad 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,7 +2,7 @@ "json.schemas": [ { "fileMatch": ["manifest.json"], - "url": "./_schemas/manifest.schema.json" + "url": "./manifest.schema.json" } ] } diff --git a/integrations/datadog/LICENSE.md b/integrations/datadog/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/datadog/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/datadog/README.md b/integrations/datadog/README.md new file mode 100644 index 00000000..e69de29b diff --git a/integrations/datadog/assets/images/dd_icon_rgb.svg b/integrations/datadog/assets/images/dd_icon_rgb.svg new file mode 100644 index 00000000..f39a6ac1 --- /dev/null +++ b/integrations/datadog/assets/images/dd_icon_rgb.svg @@ -0,0 +1,41 @@ + + + + + + diff --git a/integrations/datadog/assets/images/dd_logo_h_rgb.svg b/integrations/datadog/assets/images/dd_logo_h_rgb.svg new file mode 100644 index 00000000..f6f77fa2 --- /dev/null +++ b/integrations/datadog/assets/images/dd_logo_h_rgb.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json new file mode 100644 index 00000000..76a6a98d --- /dev/null +++ b/integrations/datadog/manifest.json @@ -0,0 +1,46 @@ +{ + "name": "datadog", + "version": "1.0.0", + "overview": "Send audit log events to your Datadog dashboards", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Datadog. These events can provide context to your Datadog dashboards.", + "author": "LaunchDarkly", + "links": { + "site": "https://docs.launchdarkly.com/docs/datadog", + "privacyPolicy": "https://www.datadoghq.com/legal/privacy/", + "supportEmail": "support@launchdarkly.com" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/dd_icon_rgb.svg", + "rectangular": "assets/images/dd_logo_h_rbg.svg" + }, + "authentication": { + "type": "token", + "label": "API key", + "hint": "Enter API key from your account", + "acceptedAs": { + "type": "query-param", + "name": "api_key" + } + }, + "capabilities": { + "auditLogEventsHook": { + "receivingEndpoint": "https://api.datadoghq.com/api/v1/events", + "method": "post", + "contentType": "application/json", + "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "notResources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/datadog/templates/template.json b/integrations/datadog/templates/template.json new file mode 100644 index 00000000..2d785a1f --- /dev/null +++ b/integrations/datadog/templates/template.json @@ -0,0 +1,7 @@ +{ + "title": "{{summary}}", + "text": "{{memberName}} {{action}} {{resourceName}}", + "date_happened": "{{dateHappened}}", + "tags": ["any", "arbitrary", "tag"], + "source_type_name": "example.com" +} diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 3652021a..0d5565cc 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -27,6 +27,7 @@ "auditLogEventsHook": { "receivingEndpoint": "https://example.com/webhookin", "method": "post", + "contentType": "application/json", "templates": { "flag": "templates/template.json", "project": "templates/template.json", diff --git a/manifest.schema.json b/manifest.schema.json index 9cb6d032..4e33d19b 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -352,6 +352,7 @@ "enum": [ "receivingEndpoint", "method", + "contentType", "templates", "defaultPolicy" ] @@ -375,6 +376,18 @@ "patch" ] }, + "contentType": { + "$id": "#/properties/capability/audit-log-events-hook/content-type", + "title": "Content type", + "description": "The content-type your endpoint expects to receive", + "type": "string", + "default": "application/json", + "minLength": 3, + "examples": [ + "application/json", + "application/xml" + ] + }, "templates": { "$id": "#/properties/capability/audit-log-events-hook/templates", "title": "Webhook body template", @@ -500,7 +513,8 @@ }, "required": [ "receivingEndpoint", - "method" + "method", + "contentType" ] } }, diff --git a/package.json b/package.json index b7f8e450..7e2eaba6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", "main": "index.js", "scripts": { - "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md" + "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md", + "test": "ajv test -s manifest.schema.json -d **/manifest.json --valid --errors=json" }, "repository": { "type": "git", From 506f816f5ae7131fb319c598d6e3bc605912450f Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 10:22:06 -0700 Subject: [PATCH 026/936] Fix for CI --- .circleci/config.yml | 20 ++++++++++++++++---- MANIFEST.md | 41 +++++++++++++++++++++++++++++++++++------ 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 99fe2339..39e3e406 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,8 +10,20 @@ jobs: steps: - checkout - aws-cli/install + - restore_cache: + name: Restore Yarn Package Cache + keys: + - yarn-packages-{{ checksum "yarn.lock" }} + - run: + name: Install Dependencies + command: yarn install --frozen-lockfile + - save_cache: + name: Save Yarn Package Cache + key: yarn-packages-{{ checksum "yarn.lock" }} + paths: + - ~/.cache/yarn + - run: + name: Run tests + command: yarn test - deploy: - command: | - npm ci && - npm test && - ./scripts/copy_to_s3.sh + command: ./scripts/copy_to_s3.sh diff --git a/MANIFEST.md b/MANIFEST.md index e317f67b..c1029c22 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -124,12 +124,41 @@ This capability will enable LaunchDarkly to send audit log event webhooks to you `object` with following properties: -| Property | Type | Required | -| ------------------- | ------ | ------------ | -| `defaultPolicy` | array | Optional | -| `method` | | **Required** | -| `receivingEndpoint` | string | **Required** | -| `templates` | object | Optional | +| Property | Type | Required | Default | +| ------------------- | ------ | ------------ | -------------------- | +| `contentType` | string | **Required** | `"application/json"` | +| `defaultPolicy` | array | Optional | | +| `method` | | **Required** | | +| `receivingEndpoint` | string | **Required** | | +| `templates` | object | Optional | | + +#### contentType + +##### Content type + +The content-type your endpoint expects to receive + +`contentType` + +- is **required** +- type: `string` +- default: `"application/json"` + +##### contentType Type + +`string` + +- minimum length: 3 characters + +##### contentType Examples + +```json +application / json +``` + +```json +application / xml +``` #### defaultPolicy From a8ffcc96475ebd273174f756c6789ab6090c257e Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 10:32:01 -0700 Subject: [PATCH 027/936] Testing to see if install aws-cli is necessary --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 39e3e406..0b2e3ab3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,7 +9,7 @@ jobs: - image: circleci/node:latest steps: - checkout - - aws-cli/install + # - aws-cli/install - restore_cache: name: Restore Yarn Package Cache keys: From e358f2d8cd80914d7e6487f45cc60a5aa9c277ba Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 10:33:30 -0700 Subject: [PATCH 028/936] Yep... aws-cli is necessary --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0b2e3ab3..6321858f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,7 +9,6 @@ jobs: - image: circleci/node:latest steps: - checkout - # - aws-cli/install - restore_cache: name: Restore Yarn Package Cache keys: @@ -25,5 +24,6 @@ jobs: - run: name: Run tests command: yarn test + - aws-cli/install - deploy: command: ./scripts/copy_to_s3.sh From e6dfde428bd497f188fbf3821e19cd257271e938 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 13:01:41 -0700 Subject: [PATCH 029/936] Store listing of all manifests in `latest.json` --- scripts/copy_to_s3.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index e1852de0..89b507ce 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -1,5 +1,4 @@ #!/bin/bash -REV=$(git rev-parse HEAD | cut -c1-8) -echo $REV > latest +REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps(["/" + os.environ["REV"] + "/" + dir for dir in glob.glob("**/*/manifest.json")])' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV -aws s3 cp latest s3://$BUCKET_NAME/latest.txt \ No newline at end of file +aws s3 cp latest s3://$BUCKET_NAME/latest.json \ No newline at end of file From 0d60080e05ed31bced8e2a0cad04eb32999f2c35 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 13:16:32 -0700 Subject: [PATCH 030/936] Write out object instead of array --- scripts/copy_to_s3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 89b507ce..4767c4a9 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -1,4 +1,4 @@ #!/bin/bash -REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps(["/" + os.environ["REV"] + "/" + dir for dir in glob.glob("**/*/manifest.json")])' > latest +REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"manifests": ["/" + os.environ["REV"] + "/" + dir for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV aws s3 cp latest s3://$BUCKET_NAME/latest.json \ No newline at end of file From 732b824852ec342fec9775745345c537cfc47f11 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 13:48:59 -0700 Subject: [PATCH 031/936] Switch to a simple object --- scripts/copy_to_s3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 4767c4a9..49b058d8 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -1,4 +1,4 @@ #!/bin/bash -REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"manifests": ["/" + os.environ["REV"] + "/" + dir for dir in glob.glob("**/*/manifest.json")]})' > latest +REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV aws s3 cp latest s3://$BUCKET_NAME/latest.json \ No newline at end of file From dec3fd2787d76a0f5c5d9dd77474e3d4171ea3c5 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 15:53:26 -0700 Subject: [PATCH 032/936] Fix the build --- scripts/copy_to_s3.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 49b058d8..b7272461 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -1,4 +1,4 @@ -#!/bin/bash -REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest +REV=$(git rev-parse HEAD | cut -c1-8)#!/bin/bash +python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV aws s3 cp latest s3://$BUCKET_NAME/latest.json \ No newline at end of file From 788d7a116b5eabdbce5b39328f64b75439c42e34 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 15:57:11 -0700 Subject: [PATCH 033/936] One more fix --- scripts/copy_to_s3.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index b7272461..850f7327 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -1,4 +1,5 @@ -REV=$(git rev-parse HEAD | cut -c1-8)#!/bin/bash +#!/bin/bash +REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV aws s3 cp latest s3://$BUCKET_NAME/latest.json \ No newline at end of file From ddf9aaf6c130326e2c705e88c810205c6f959fdb Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 16:02:03 -0700 Subject: [PATCH 034/936] Export it --- scripts/copy_to_s3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 850f7327..508b7f81 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -1,5 +1,5 @@ #!/bin/bash -REV=$(git rev-parse HEAD | cut -c1-8) +export REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV aws s3 cp latest s3://$BUCKET_NAME/latest.json \ No newline at end of file From 73977376f94d312a0908585ddbd495b9d3ae95cb Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 16:06:05 -0700 Subject: [PATCH 035/936] Upload latest.json with public acl --- scripts/copy_to_s3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 508b7f81..52356a30 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -2,4 +2,4 @@ export REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV -aws s3 cp latest s3://$BUCKET_NAME/latest.json \ No newline at end of file +aws s3 cp latest s3://$BUCKET_NAME/latest.json --acl public \ No newline at end of file From 9f5200c1ad1aea19b3ba38ca5f69e12b6fbbbf07 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 16:07:26 -0700 Subject: [PATCH 036/936] s/public/public-read --- scripts/copy_to_s3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 52356a30..e2441a5b 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -2,4 +2,4 @@ export REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV -aws s3 cp latest s3://$BUCKET_NAME/latest.json --acl public \ No newline at end of file +aws s3 cp latest s3://$BUCKET_NAME/latest.json --acl public-read \ No newline at end of file From 71c274af94bbd1dcdc5777abb3e98084e3ae1104 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 16:24:16 -0700 Subject: [PATCH 037/936] Copy manifest to S3 --- scripts/copy_to_s3.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index e2441a5b..baee6937 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -2,4 +2,5 @@ export REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV -aws s3 cp latest s3://$BUCKET_NAME/latest.json --acl public-read \ No newline at end of file +aws s3 cp manifest.schema.json s3://$BUCKET_NAME/integrations/$REV +aws s3 cp latest s3://$BUCKET_NAME/latest.json --acl public-read From d6b7f81fa90a5acb906ba581bbf005570f4a05c0 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 16:28:45 -0700 Subject: [PATCH 038/936] Set content type --- scripts/copy_to_s3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index baee6937..ce17ab86 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -3,4 +3,4 @@ export REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV aws s3 cp manifest.schema.json s3://$BUCKET_NAME/integrations/$REV -aws s3 cp latest s3://$BUCKET_NAME/latest.json --acl public-read +aws s3 cp latest s3://$BUCKET_NAME/latest.json --acl public-read --metadata-directive REPLACE --content-type "application/json" From 461d763bf1c14e8a434979d0be768ec16e681749 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 16:34:38 -0700 Subject: [PATCH 039/936] Fix --- scripts/copy_to_s3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index ce17ab86..0f395d73 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -2,5 +2,5 @@ export REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV -aws s3 cp manifest.schema.json s3://$BUCKET_NAME/integrations/$REV +aws s3 cp manifest.schema.json s3://$BUCKET_NAME/integrations/$REV/manifest.schema.json --metadata-directive REPLACE --content-type "application/json" aws s3 cp latest s3://$BUCKET_NAME/latest.json --acl public-read --metadata-directive REPLACE --content-type "application/json" From 22d6290c9eea5c00866757b83d39de339b7d9fdd Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 17 Oct 2019 17:01:50 -0700 Subject: [PATCH 040/936] Updated manifest --- manifest.schema.json | 274 ++++++++++++++++--------------------------- 1 file changed, 101 insertions(+), 173 deletions(-) diff --git a/manifest.schema.json b/manifest.schema.json index 4e33d19b..4fd6befa 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -170,172 +170,92 @@ "description": "Specify the authentication method required by your integration", "type": "string", "enum": [ - "none", "token" ] - } - }, - "allOf": [ - { - "if": { - "properties": { - "type": { - "const": "none" - } - } - }, - "then": { - "propertyNames": { + }, + "label": { + "$id": "#/properties/authentication/label", + "title": "Token", + "description": "Label to use in the LaunchDarkly UI describing you token", + "examples": [ + "API key", + "API token" + ], + "type": "string" + }, + "hint": { + "$id": "#/properties/authentication/hint", + "title": "Hint", + "description": "A placeholder hint used in the LaunchDarkly UI describing your token", + "examples": [ + "Enter API key from your SpaceXYZ account" + ], + "type": "string" + }, + "acceptedAs": { + "$id": "#/properties/authentication/acceptedAs", + "title": "Token accepted as...", + "description": "Specify how your token should be provided in the request to your service", + "type": "object", + "properties": { + "type": { + "$id": "#/properties/authentication/acceptedAs/type", + "title": "Type", + "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", + "type": "string", "enum": [ - "type" + "query-param", + "header" ] - } - } - }, - { - "if": { - "properties": { - "type": { - "const": "token" - } - } - }, - "then": { - "properties": { - "label": { - "$id": "#/properties/authentication/label", - "title": "Token", - "description": "Label to use in the LaunchDarkly UI describing you token", - "examples": [ - "API key", - "API token" - ], - "type": "string" - }, - "hint": { - "$id": "#/properties/authentication/hint", - "title": "Hint", - "description": "A placeholder hint used in the LaunchDarkly UI describing your token", - "examples": [ - "Enter API key from your SpaceXYZ account" - ], - "type": "string" - }, - "acceptedAs": { - "$id": "#/properties/authentication/acceptedAs", - "title": "Token accepted as...", - "description": "Specify how your token should be provided in the request to your service", - "type": "object", - "properties": { - "type": { - "$id": "#/properties/authentication/acceptedAs/type", - "title": "Type", - "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", - "type": "string", - "enum": [ - "query-param", - "header" - ] - } - }, - "allOf": [ - { - "if": { - "properties": { - "type": { - "const": "query-param" - } - } - }, - "then": { - "properties": { - "name": { - "$id": "#/properties/authentication/acceptedAs/type/query-param-name", - "title": "Query parameter name", - "description": "Specify the name of the query parameter you'd like to use", - "type": "string", - "examples": [ - "token", - "key" - ] - } - }, - "required": [ - "name" - ], - "propertyNames": { - "enum": [ - "type", - "name" - ] - } - } - }, - { - "if": { - "properties": { - "type": { - "const": "header" - } - } - }, - "then": { - "properties": { - "name": { - "$id": "#/properties/authentication/acceptedAs/type/header-name", - "title": "Header name", - "description": "Specify the name of the header you'd like to use", - "type": "string", - "examples": [ - "Authorization", - "X-SpaceXYZ-Auth" - ] - }, - "prefix": { - "$id": "#/properties/authentication/acceptedAs/type/header-value-prefix", - "title": "Header value prefix", - "description": "If your token needs to be padded with a prefix, specify it here", - "type": "string", - "examples": [ - "Bearer " - ] - } - }, - "required": [ - "name" - ], - "propertyNames": { - "enum": [ - "type", - "name", - "prefix" - ] - } - } - } - ] - } }, - "required": [ - "type", - "label", - "hint", - "acceptedAs" - ], - "propertyNames": { - "enum": [ - "type", - "label", - "hint", - "acceptedAs" + "name": { + "$id": "#/properties/authentication/acceptedAs/type/param-name", + "title": "Query parameter or header name", + "description": "Specify the name of the query parameter or header you'd like to use", + "type": "string", + "examples": [ + "token", + "key", + "X-App-Token" + ] + }, + "prefix": { + "$id": "#/properties/authentication/acceptedAs/type/header-value-prefix", + "title": "Header value prefix", + "description": "If your token needs to be padded with a prefix, specify it here", + "type": "string", + "examples": [ + "Bearer " ] } + }, + "required": [ + "type", + "name" + ], + "propertyNames": { + "enum": [ + "type", + "name", + "prefix" + ] } } - ], + }, "required": [ - "type" - ] + "type", + "label", + "hint", + "acceptedAs" + ], + "propertyNames": { + "enum": [ + "type", + "label", + "hint", + "acceptedAs" + ] + } }, "capabilities": { "$id": "#/properties/capabilities", @@ -393,23 +313,32 @@ "title": "Webhook body template", "description": "Templates to use for body of the webhook request", "type": "object", - "anyOf": [ - { - "propertyNames": { - "enum": [ - "flag", - "project", - "environment", - "metric" - ] - }, - "patternProperties": { - "": { - "type": "string" - } - } + "properties": { + "flag": { + "$id": "#/properties/capability/audit-log-events-hook/templates/flag", + "title": "Flag template", + "description": "Template to use for flag events", + "type": "string" + }, + "project": { + "$id": "#/properties/capability/audit-log-events-hook/templates/project", + "title": "Project template", + "description": "Template to use for project events", + "type": "string" + }, + "environment": { + "$id": "#/properties/capability/audit-log-events-hook/templates/environment", + "title": "Environment template", + "description": "Template to use for environment events", + "type": "string" + }, + "metric": { + "$id": "#/properties/capability/audit-log-events-hook/templates/metric", + "title": "Metric template", + "description": "Template to use for metric events", + "type": "string" } - ] + } }, "defaultPolicy": { "$id": "#/properties/capability/audit-log-events-hook/default-policy", @@ -530,7 +459,6 @@ "links", "categories", "icons", - "authentication", "capabilities" ] } \ No newline at end of file From 015e83fc76f7e9d175060c65b98cedb3f441c434 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 23 Oct 2019 12:53:21 -0700 Subject: [PATCH 041/936] Adding shell for msteams and made a small modification to the schema --- .vscode/settings.json | 7 +- MANIFEST.md | 220 +++++++++++++++++- integrations/datadog/manifest.json | 2 +- integrations/msteams/LICENSE.md | 13 ++ integrations/msteams/README.md | 0 .../msteams/assets/images/microsoft-teams.svg | 1 + integrations/msteams/manifest.json | 46 ++++ integrations/msteams/templates/template.json | 36 +++ integrations/sample-integration/manifest.json | 2 +- manifest.schema.json | 5 +- 10 files changed, 315 insertions(+), 17 deletions(-) create mode 100644 integrations/msteams/LICENSE.md create mode 100644 integrations/msteams/README.md create mode 100644 integrations/msteams/assets/images/microsoft-teams.svg create mode 100644 integrations/msteams/manifest.json create mode 100644 integrations/msteams/templates/template.json diff --git a/.vscode/settings.json b/.vscode/settings.json index 90b58cad..440de7b6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,10 @@ "fileMatch": ["manifest.json"], "url": "./manifest.schema.json" } - ] + ], + "workbench.colorCustomizations": { + "activityBar.background": "#44175F", + "titleBar.activeBackground": "#602184", + "titleBar.activeForeground": "#FDFBFE" + } } diff --git a/MANIFEST.md b/MANIFEST.md index c1029c22..24450ed1 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -14,7 +14,7 @@ Describes the capabilities and intent of a LaunchDarkly integration | Property | Type | Required | Nullable | Defined by | | --------------------------------- | -------- | ------------ | -------- | ------------------------------------------------ | -| [authentication](#authentication) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [authentication](#authentication) | `object` | Optional | No | LaunchDarkly Integrations Manifest (this schema) | | [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | | [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | | [categories](#categories) | `enum[]` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | @@ -33,7 +33,7 @@ Specify the authentication method required by your integration `authentication` -- is **required** +- is optional - type: `object` - defined in this schema @@ -41,10 +41,151 @@ Specify the authentication method required by your integration `object` with following properties: +| Property | Type | Required | +| ------------ | ------ | ------------ | +| `acceptedAs` | object | **Required** | +| `hint` | string | **Required** | +| `label` | string | **Required** | +| `type` | string | **Required** | + +#### acceptedAs + +##### Token accepted as... + +Specify how your token should be provided in the request to your service + +`acceptedAs` + +- is **required** +- type: `object` + +##### acceptedAs Type + +`object` with following properties: + | Property | Type | Required | | -------- | ------ | ------------ | +| `name` | string | **Required** | +| `prefix` | string | Optional | | `type` | string | **Required** | +#### name + +##### Query parameter or header name + +Specify the name of the query parameter or header you'd like to use + +`name` + +- is **required** +- type: `string` + +##### name Type + +`string` + +##### name Examples + +```json +token +``` + +```json +key +``` + +```json +X - App - Token +``` + +#### prefix + +##### Header value prefix + +If your token needs to be padded with a prefix, specify it here + +`prefix` + +- is optional +- type: `string` + +##### prefix Type + +`string` + +##### prefix Example + +```json +Bearer +``` + +#### type + +##### Type + +Specify the method in which your token is provided in the request. In most cases, tokens are either passed through +query parameter or a header. + +`type` + +- is **required** +- type: `enum` + +The value of this property **must** be equal to one of the [known values below](#authentication-known-values). + +##### type Known Values + +| Value | Description | +| ------------- | ----------- | +| `query-param` | | +| `header` | | + +#### hint + +##### Hint + +A placeholder hint used in the LaunchDarkly UI describing your token + +`hint` + +- is **required** +- type: `string` + +##### hint Type + +`string` + +##### hint Example + +```json +Enter API key from your SpaceXYZ account +``` + +#### label + +##### Token + +Label to use in the LaunchDarkly UI describing you token + +`label` + +- is **required** +- type: `string` + +##### label Type + +`string` + +##### label Examples + +```json +API key +``` + +```json +API token +``` + #### type ##### Auth Type @@ -62,7 +203,6 @@ The value of this property **must** be equal to one of the [known values below]( | Value | Description | | ------- | ----------- | -| `none` | | | `token` | | ## author @@ -387,9 +527,72 @@ Templates to use for body of the webhook request `object` with following properties: -| Property | Type | Required | -| -------- | ---- | -------- | +| Property | Type | Required | +| ------------- | ------ | -------- | +| `environment` | string | Optional | +| `flag` | string | Optional | +| `metric` | string | Optional | +| `project` | string | Optional | + +#### environment +##### Environment template + +Template to use for environment events + +`environment` + +- is optional +- type: `string` + +##### environment Type + +`string` + +#### flag + +##### Flag template + +Template to use for flag events + +`flag` + +- is optional +- type: `string` + +##### flag Type + +`string` + +#### metric + +##### Metric template + +Template to use for metric events + +`metric` + +- is optional +- type: `string` + +##### metric Type + +`string` + +#### project + +##### Project template + +Template to use for project events + +`project` + +- is optional +- type: `string` + +##### project Type + +`string` ## categories @@ -622,12 +825,7 @@ Your integration's name. No spaces `string` - minimum length: 3 characters -- maximum length: 50 characters All instances must conform to this regular expression (test examples - [here](https://regexr.com/?expression=%5E%5CS*%24)): - -```regex -^\S*$ -``` +- maximum length: 100 characters ## overview diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 76a6a98d..88aa3475 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -1,5 +1,5 @@ { - "name": "datadog", + "name": "Datadog", "version": "1.0.0", "overview": "Send audit log events to your Datadog dashboards", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Datadog. These events can provide context to your Datadog dashboards.", diff --git a/integrations/msteams/LICENSE.md b/integrations/msteams/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/msteams/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/msteams/README.md b/integrations/msteams/README.md new file mode 100644 index 00000000..e69de29b diff --git a/integrations/msteams/assets/images/microsoft-teams.svg b/integrations/msteams/assets/images/microsoft-teams.svg new file mode 100644 index 00000000..1e75bf94 --- /dev/null +++ b/integrations/msteams/assets/images/microsoft-teams.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json new file mode 100644 index 00000000..503552e1 --- /dev/null +++ b/integrations/msteams/manifest.json @@ -0,0 +1,46 @@ +{ + "name": "Microsoft Teams", + "version": "1.0.0", + "overview": "Send audit log events to your Datadog dashboards", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Microsoft Teams.", + "author": "LaunchDarkly", + "links": { + "site": "https://docs.launchdarkly.com/docs/msteams", + "privacyPolicy": "https://privacy.microsoft.com/en-us", + "supportEmail": "support@launchdarkly.com" + }, + "categories": ["monitoring", "alerts"], + "icons": { + "square": "assets/images/microsoft-teams.svg", + "rectangular": "assets/images/microsoft-teams.svg" + }, + "authentication": { + "type": "token", + "label": "API key", + "hint": "Enter API key from your account", + "acceptedAs": { + "type": "query-param", + "name": "api_key" + } + }, + "capabilities": { + "auditLogEventsHook": { + "receivingEndpoint": "https://api.microsoft.com/api/v1/events", + "method": "post", + "contentType": "application/json", + "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "notResources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/msteams/templates/template.json b/integrations/msteams/templates/template.json new file mode 100644 index 00000000..67e06ed5 --- /dev/null +++ b/integrations/msteams/templates/template.json @@ -0,0 +1,36 @@ +{ + "@context": "https://schema.org/extensions", + "@type": "MessageCard", + "themeColor": "0072C6", + "title": "Visit the Outlook Dev Portal", + "text": "Click **Learn More** to learn more about Actionable Messages!", + "potentialAction": [ + { + "@type": "ActionCard", + "name": "Send Feedback", + "inputs": [ + { + "@type": "TextInput", + "id": "feedback", + "isMultiline": true, + "title": "Let us know what you think about Actionable Messages" + } + ], + "actions": [ + { + "@type": "HttpPOST", + "name": "Send Feedback", + "isPrimary": true, + "target": "http://..." + } + ] + }, + { + "@type": "OpenUri", + "name": "Learn More", + "targets": [ + { "os": "default", "uri": "https://docs.microsoft.com/outlook/actionable-messages" } + ] + } + ] +} \ No newline at end of file diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 0d5565cc..cb7aabb2 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -1,5 +1,5 @@ { - "name": "sample-integration", + "name": "Sample Integration", "version": "1.0.0", "overview": "Short one-liner describing your integration", "description": "Send flag data to space. Markdown based description.", diff --git a/manifest.schema.json b/manifest.schema.json index 4fd6befa..7cc225e1 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -11,9 +11,8 @@ "title": "Integration name", "description": "Your integration's name. No spaces", "minLength": 3, - "maxLength": 50, - "type": "string", - "pattern": "^\\S*$" + "maxLength": 100, + "type": "string" }, "version": { "$id": "#/properties/version", From e3e50232b6caab7fa14f1d20dd172e9bdde8a6af Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 08:58:02 -0700 Subject: [PATCH 042/936] Moved supportEmail out of links --- .vscode/settings.json | 7 +------ integrations/datadog/manifest.json | 4 ++-- integrations/msteams/manifest.json | 4 ++-- integrations/sample-integration/manifest.json | 4 ++-- manifest.schema.json | 20 +++++++++---------- 5 files changed, 17 insertions(+), 22 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 440de7b6..90b58cad 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,10 +4,5 @@ "fileMatch": ["manifest.json"], "url": "./manifest.schema.json" } - ], - "workbench.colorCustomizations": { - "activityBar.background": "#44175F", - "titleBar.activeBackground": "#602184", - "titleBar.activeForeground": "#FDFBFE" - } + ] } diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 88aa3475..2a728429 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -4,10 +4,10 @@ "overview": "Send audit log events to your Datadog dashboards", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Datadog. These events can provide context to your Datadog dashboards.", "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/datadog", - "privacyPolicy": "https://www.datadoghq.com/legal/privacy/", - "supportEmail": "support@launchdarkly.com" + "privacyPolicy": "https://www.datadoghq.com/legal/privacy/" }, "categories": ["apm", "monitoring", "alerts"], "icons": { diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 503552e1..b158e964 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -4,10 +4,10 @@ "overview": "Send audit log events to your Datadog dashboards", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Microsoft Teams.", "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/msteams", - "privacyPolicy": "https://privacy.microsoft.com/en-us", - "supportEmail": "support@launchdarkly.com" + "privacyPolicy": "https://privacy.microsoft.com/en-us" }, "categories": ["monitoring", "alerts"], "icons": { diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index cb7aabb2..3e43757e 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -4,10 +4,10 @@ "overview": "Short one-liner describing your integration", "description": "Send flag data to space. Markdown based description.", "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", "links": { "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy", - "supportEmail": "support@example.com" + "privacyPolicy": "https://example.com/privacy" }, "categories": ["apm", "monitoring", "alerts"], "icons": { diff --git a/manifest.schema.json b/manifest.schema.json index 7cc225e1..e3dca3e7 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -9,7 +9,7 @@ "name": { "$id": "#/properties/name", "title": "Integration name", - "description": "Your integration's name. No spaces", + "description": "Your integration's name.", "minLength": 3, "maxLength": 100, "type": "string" @@ -55,6 +55,13 @@ "maxLength": 100, "pattern": "^(.*)$" }, + "supportEmail": { + "$id": "#/properties/links/support-email", + "title": "Support Email", + "description": "Email address for your integration's support", + "type": "string", + "format": "email" + }, "links": { "$id": "#/properties/links", "title": "Links", @@ -77,13 +84,6 @@ "maxLength": 2048, "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, - "supportEmail": { - "$id": "#/properties/links/support-email", - "title": "Support Email", - "description": "Email address for your integration's support", - "type": "string", - "format": "email" - }, "supportWebsite": { "$id": "#/properties/links/support-website", "title": "Support Website", @@ -95,8 +95,7 @@ }, "required": [ "site", - "privacyPolicy", - "supportEmail" + "privacyPolicy" ] }, "categories": { @@ -455,6 +454,7 @@ "overview", "description", "author", + "supportEmail", "links", "categories", "icons", From 9f47471f5d59815c96eebd481af3b415c51cf2fc Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 09:17:46 -0700 Subject: [PATCH 043/936] Added CI status badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 18217685..0cbce9ac 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # LaunchDarkly integrations +[![CircleCI](https://circleci.com/gh/launchdarkly/ld-integrations.svg?style=svg&circle-token=c12dfaa51d070b8bbc8dea0c0adf4c402b5b9123)](https://circleci.com/gh/launchdarkly/ld-integrations) + Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains From bb6659748f2980f056e12be85158c392241cbbfe Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 10:38:24 -0700 Subject: [PATCH 044/936] Allow for markdown based string attributes --- integrations/sample-integration/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 3e43757e..b5d3a614 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -17,7 +17,7 @@ "authentication": { "type": "token", "label": "API key", - "hint": "Enter API key from your account", + "hint": "Enter API key from your account at [Sample integration](https://example.com)", "acceptedAs": { "type": "header", "name": "X-Custom-Auth" From fd5b50e927514fd4dda04e525d3b0c9dc09a4491 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 10:42:02 -0700 Subject: [PATCH 045/936] Minor string update --- integrations/sample-integration/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index b5d3a614..051b4ee3 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -17,7 +17,7 @@ "authentication": { "type": "token", "label": "API key", - "hint": "Enter API key from your account at [Sample integration](https://example.com)", + "hint": "Enter your [Sample Integration API key](https://example.com)", "acceptedAs": { "type": "header", "name": "X-Custom-Auth" From 434bb18996c9f46ee705ae548efd28c494902249 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 11:42:47 -0700 Subject: [PATCH 046/936] Update default policy on existing integrations --- integrations/datadog/manifest.json | 2 +- integrations/msteams/manifest.json | 2 +- integrations/sample-integration/manifest.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 2a728429..509ef127 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -37,7 +37,7 @@ "defaultPolicy": [ { "effect": "allow", - "notResources": ["proj/*:env/production:flag/*"], + "resources": ["proj/*:env/production:flag/*"], "actions": ["*"] } ] diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index b158e964..ecb46675 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -37,7 +37,7 @@ "defaultPolicy": [ { "effect": "allow", - "notResources": ["proj/*:env/production:flag/*"], + "resources": ["proj/*:env/production:flag/*"], "actions": ["*"] } ] diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 051b4ee3..b3f3443c 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -37,7 +37,7 @@ "defaultPolicy": [ { "effect": "allow", - "notResources": ["proj/*:env/production:flag/*"], + "resources": ["proj/*:env/production:flag/*"], "actions": ["*"] } ] From 43d5858939e7b50d411ae6e8ef47617d3207a911 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 16:16:33 -0700 Subject: [PATCH 047/936] Added slack, refactored manifest schema Co-authored-by: Henry Barrow <47337653+ldhenry@users.noreply.github.com> --- MANIFEST.md | 297 ++++++++++++------ integrations/datadog/manifest.json | 26 +- integrations/msteams/manifest.json | 26 +- integrations/msteams/templates/template.json | 2 +- integrations/sample-integration/manifest.json | 19 +- integrations/slack/LICENSE.md | 13 + integrations/slack/README.md | 0 .../slack/assets/images/Slack_Mark.svg | 33 ++ .../slack/assets/images/Slack_RGB.svg | 49 +++ integrations/slack/manifest.json | 50 +++ integrations/slack/templates/template.json | 36 +++ manifest.schema.json | 143 +++++++-- 12 files changed, 539 insertions(+), 155 deletions(-) create mode 100644 integrations/slack/LICENSE.md create mode 100644 integrations/slack/README.md create mode 100644 integrations/slack/assets/images/Slack_Mark.svg create mode 100644 integrations/slack/assets/images/Slack_RGB.svg create mode 100644 integrations/slack/manifest.json create mode 100644 integrations/slack/templates/template.json diff --git a/MANIFEST.md b/MANIFEST.md index 24450ed1..348481af 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -12,18 +12,20 @@ Describes the capabilities and intent of a LaunchDarkly integration # LaunchDarkly Integrations Manifest Properties -| Property | Type | Required | Nullable | Defined by | -| --------------------------------- | -------- | ------------ | -------- | ------------------------------------------------ | -| [authentication](#authentication) | `object` | Optional | No | LaunchDarkly Integrations Manifest (this schema) | -| [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [categories](#categories) | `enum[]` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [description](#description) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [icons](#icons) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [links](#links) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [name](#name) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [overview](#overview) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [version](#version) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| Property | Type | Required | Nullable | Defined by | +| --------------------------------- | ---------- | ------------ | -------- | ------------------------------------------------ | +| [authentication](#authentication) | `object` | Optional | No | LaunchDarkly Integrations Manifest (this schema) | +| [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [categories](#categories) | `enum[]` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [description](#description) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [formVariables](#formvariables) | `object[]` | Optional | No | LaunchDarkly Integrations Manifest (this schema) | +| [icons](#icons) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [links](#links) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [name](#name) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [overview](#overview) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [supportEmail](#supportemail) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [version](#version) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | ## authentication @@ -264,41 +266,11 @@ This capability will enable LaunchDarkly to send audit log event webhooks to you `object` with following properties: -| Property | Type | Required | Default | -| ------------------- | ------ | ------------ | -------------------- | -| `contentType` | string | **Required** | `"application/json"` | -| `defaultPolicy` | array | Optional | | -| `method` | | **Required** | | -| `receivingEndpoint` | string | **Required** | | -| `templates` | object | Optional | | - -#### contentType - -##### Content type - -The content-type your endpoint expects to receive - -`contentType` - -- is **required** -- type: `string` -- default: `"application/json"` - -##### contentType Type - -`string` - -- minimum length: 3 characters - -##### contentType Examples - -```json -application / json -``` - -```json -application / xml -``` +| Property | Type | Required | +| --------------- | ------ | ------------ | +| `defaultPolicy` | array | Optional | +| `endpoint` | object | **Required** | +| `templates` | object | Optional | #### defaultPolicy @@ -469,6 +441,52 @@ proj/*:env/production:flag/* A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. +#### endpoint + +##### Endpoint + +Properties that describe the HTTP endpoint LaunchDarkly will send hooks to + +`endpoint` + +- is **required** +- type: `object` + +##### endpoint Type + +`object` with following properties: + +| Property | Type | Required | Default | +| --------- | ------ | -------- | ------------------------------------- | +| `headers` | object | Optional | `{"Content-Type":"application/json"}` | +| `method` | | Optional | `"post"` | + +#### headers + +##### Headers + +Headers to send with the webhook request + +`headers` + +- is optional +- type: `object` +- default: `{"Content-Type":"application/json"}` + +##### headers Type + +`object` with following properties: + +| Property | Type | Required | +| -------- | ---- | -------- | + + +##### headers Example + +```json +[object Object] +``` + #### method ##### HTTP method @@ -477,8 +495,9 @@ HTTP method to use when LaunchDarkly makes the request to your endpoint `method` -- is **required** +- is optional - type: `enum` +- default: `"post"` The value of this property **must** be equal to one of the [known values below](#capabilities-known-values). @@ -490,28 +509,6 @@ The value of this property **must** be equal to one of the [known values below]( | `put` | | | `patch` | | -#### receivingEndpoint - -##### Endpoint URL - -URL where you'd like LaunchDarkly to send webhooks to - -`receivingEndpoint` - -- is **required** -- type: `string` - -##### receivingEndpoint Type - -`string` - -- maximum length: 2048 characters All instances must conform to this regular expression (test examples - [here](https://regexr.com/?expression=%5E%5BHh%5D%5BTt%5D%5BTt%5D%5BPp%5D%5BSs%5D%3F%3A%2F%2F)): - -```regex -^[Hh][Tt][Tt][Pp][Ss]?:// -``` - #### templates ##### Webhook body template @@ -637,6 +634,128 @@ A longer description of your integration ^(.*)$ ``` +## formVariables + +### Form variables + +Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply +when they enable the integration. Examples of a form variable include `apiToken` or `url`. + +`formVariables` + +- is optional +- type: `object[]` +- defined in this schema + +### formVariables Type + +Array type: `object[]` + +All items must be of the type: `object` with following properties: + +| Property | Type | Required | +| ------------- | ------- | ------------ | +| `description` | string | **Required** | +| `isSecret` | boolean | Optional | +| `key` | string | **Required** | +| `name` | string | **Required** | +| `type` | string | **Required** | + +#### description + +##### Description + +Describes the variable in the UI. Markdown links allowed. + +`description` + +- is **required** +- type: `string` + +##### description Type + +`string` + +- maximum length: 250 characters + +#### isSecret + +##### Is this variable a secret + +Secret variables will be masked in the UI + +`isSecret` + +- is optional +- type: `boolean` + +##### isSecret Type + +`boolean` + +#### key + +##### Key + +A key will be used as the token name when the variable is substituted + +`key` + +- is **required** +- type: `string` + +##### key Type + +`string` + +- maximum length: 20 characters All instances must conform to this regular expression (test examples + [here](https://regexr.com/?expression=%5E%5B%5E%5Cs%5D*%24)): + +```regex +^[^\s]*$ +``` + +#### name + +##### Name + +A descriptive name that will be used as the form label on the UI + +`name` + +- is **required** +- type: `string` + +##### name Type + +`string` + +- maximum length: 50 characters + +#### type + +##### Type + +The type of the variable + +`type` + +- is **required** +- type: `enum` + +The value of this property **must** be equal to one of the [known values below](#formvariables-known-values). + +##### type Known Values + +| Value | Description | +| --------- | ----------- | +| `string` | | +| `boolean` | | +| `uri` | | + +A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an +integration. + ## icons ### Icons @@ -722,7 +841,6 @@ A set of reference links supporting your integration | ---------------- | ------ | ------------ | | `privacyPolicy` | string | **Required** | | `site` | string | **Required** | -| `supportEmail` | string | **Required** | | `supportWebsite` | string | Optional | #### privacyPolicy @@ -769,23 +887,6 @@ URL to your website ^[Hh][Tt][Tt][Pp][Ss]?:// ``` -#### supportEmail - -##### Support Email - -Email address for your integration's support - -`supportEmail` - -- is **required** -- type: `string` - -##### supportEmail Type - -`string` - -- format: `email` – email address (according to [RFC 5322, section 3.4.1](https://tools.ietf.org/html/rfc5322)) - #### supportWebsite ##### Support Website @@ -812,7 +913,7 @@ URL to your integration's support website ### Integration name -Your integration's name. No spaces +Your integration's name. `name` @@ -851,6 +952,24 @@ A short-one liner describing your integration ^(.*)$ ``` +## supportEmail + +### Support Email + +Email address for your integration's support + +`supportEmail` + +- is **required** +- type: `string` +- defined in this schema + +### supportEmail Type + +`string` + +- format: `email` – email address (according to [RFC 5322, section 3.4.1](https://tools.ietf.org/html/rfc5322)) + ## version ### Version diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 509ef127..61e99f33 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -14,20 +14,24 @@ "square": "assets/images/dd_icon_rgb.svg", "rectangular": "assets/images/dd_logo_h_rbg.svg" }, - "authentication": { - "type": "token", - "label": "API key", - "hint": "Enter API key from your account", - "acceptedAs": { - "type": "query-param", - "name": "api_key" + "formVariables": [ + { + "key": "apitoken", + "name": "Datadog API Token", + "type": "string", + "description": "Enter an API key from your [Datadog account](https://app.datadoghq.com/account/settings#api).", + "isSecret": true } - }, + ], "capabilities": { "auditLogEventsHook": { - "receivingEndpoint": "https://api.datadoghq.com/api/v1/events", - "method": "post", - "contentType": "application/json", + "endpoint": { + "url": "https://api.datadoghq.com/api/v1/events/?api_key={{apitoken}}", + "method": "post", + "headers": { + "Content-Type": "application/json" + } + }, "templates": { "flag": "templates/template.json", "project": "templates/template.json", diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index ecb46675..0cc5ab84 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -14,20 +14,24 @@ "square": "assets/images/microsoft-teams.svg", "rectangular": "assets/images/microsoft-teams.svg" }, - "authentication": { - "type": "token", - "label": "API key", - "hint": "Enter API key from your account", - "acceptedAs": { - "type": "query-param", - "name": "api_key" + "formVariables": [ + { + "key": "url", + "name": "Incoming Webhook URL", + "type": "uri", + "description": "[Incoming Webhook URL](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using#creating-messages-through-office-365-connectors) from Microsoft Teams", + "isSecret": false } - }, + ], "capabilities": { "auditLogEventsHook": { - "receivingEndpoint": "https://api.microsoft.com/api/v1/events", - "method": "post", - "contentType": "application/json", + "endpoint": { + "url": "{{uri}}", + "method": "post", + "headers": { + "Content-Type": "application/json" + } + }, "templates": { "flag": "templates/template.json", "project": "templates/template.json", diff --git a/integrations/msteams/templates/template.json b/integrations/msteams/templates/template.json index 67e06ed5..444b8747 100644 --- a/integrations/msteams/templates/template.json +++ b/integrations/msteams/templates/template.json @@ -3,7 +3,7 @@ "@type": "MessageCard", "themeColor": "0072C6", "title": "Visit the Outlook Dev Portal", - "text": "Click **Learn More** to learn more about Actionable Messages!", + "text": "{{}}", "potentialAction": [ { "@type": "ActionCard", diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index b3f3443c..4407e595 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -14,20 +14,15 @@ "square": "assets/images/square.svg", "rectangular": "assets/images/rectangular.svg" }, - "authentication": { - "type": "token", - "label": "API key", - "hint": "Enter your [Sample Integration API key](https://example.com)", - "acceptedAs": { - "type": "header", - "name": "X-Custom-Auth" - } - }, "capabilities": { "auditLogEventsHook": { - "receivingEndpoint": "https://example.com/webhookin", - "method": "post", - "contentType": "application/json", + "endpoint": { + "url": "https://example.com/webhookin", + "method": "post", + "headers": { + "Content-Type": "application/json" + } + }, "templates": { "flag": "templates/template.json", "project": "templates/template.json", diff --git a/integrations/slack/LICENSE.md b/integrations/slack/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/slack/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/slack/README.md b/integrations/slack/README.md new file mode 100644 index 00000000..e69de29b diff --git a/integrations/slack/assets/images/Slack_Mark.svg b/integrations/slack/assets/images/Slack_Mark.svg new file mode 100644 index 00000000..c37dc5eb --- /dev/null +++ b/integrations/slack/assets/images/Slack_Mark.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/slack/assets/images/Slack_RGB.svg b/integrations/slack/assets/images/Slack_RGB.svg new file mode 100644 index 00000000..e7433865 --- /dev/null +++ b/integrations/slack/assets/images/Slack_RGB.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/slack/manifest.json b/integrations/slack/manifest.json new file mode 100644 index 00000000..b57a5e47 --- /dev/null +++ b/integrations/slack/manifest.json @@ -0,0 +1,50 @@ +{ + "name": "Microsoft Teams", + "version": "1.0.0", + "overview": "Send audit log events to your Datadog dashboards", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Microsoft Teams.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/msteams", + "privacyPolicy": "https://privacy.microsoft.com/en-us" + }, + "categories": ["monitoring", "alerts"], + "icons": { + "square": "assets/images/Slack_Mark.svg", + "rectangular": "assets/images/Slack_RGB.svg" + }, + "formVariables": [ + { + "key": "url", + "name": "Incoming Webhook URL", + "type": "uri", + "description": "The URL for one of your [Slack incoming webhooks](https://my.slack.com/apps/A0F7XDUAZ-incoming-webhooks)", + "isSecret": false + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{uri}}", + "method": "post", + "headers": { + "Content-Type": "application/json" + } + }, + "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/slack/templates/template.json b/integrations/slack/templates/template.json new file mode 100644 index 00000000..444b8747 --- /dev/null +++ b/integrations/slack/templates/template.json @@ -0,0 +1,36 @@ +{ + "@context": "https://schema.org/extensions", + "@type": "MessageCard", + "themeColor": "0072C6", + "title": "Visit the Outlook Dev Portal", + "text": "{{}}", + "potentialAction": [ + { + "@type": "ActionCard", + "name": "Send Feedback", + "inputs": [ + { + "@type": "TextInput", + "id": "feedback", + "isMultiline": true, + "title": "Let us know what you think about Actionable Messages" + } + ], + "actions": [ + { + "@type": "HttpPOST", + "name": "Send Feedback", + "isPrimary": true, + "target": "http://..." + } + ] + }, + { + "@type": "OpenUri", + "name": "Learn More", + "targets": [ + { "os": "default", "uri": "https://docs.microsoft.com/outlook/actionable-messages" } + ] + } + ] +} \ No newline at end of file diff --git a/manifest.schema.json b/manifest.schema.json index e3dca3e7..b9d8bf61 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -255,6 +255,74 @@ ] } }, + "formVariables": { + "$id": "#/properties/formVariables", + "title": "Form variables", + "description": "Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`.", + "type": "array", + "items": { + "$id": "#/properties/formVariables/variable", + "title": "Form variable", + "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "description", + "isSecret" + ] + }, + "properties": { + "key": { + "$id": "#/properties/formVariables/variable/key", + "title": "Key", + "type": "string", + "description": "A key will be used as the token name when the variable is substituted", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "name": { + "$id": "#/properties/formVariables/variable/name", + "title": "Name", + "type": "string", + "description": "A descriptive name that will be used as the form label on the UI", + "maxLength": 50 + }, + "type": { + "$id": "#/properties/formVariables/variable/type", + "title": "Type", + "type": "string", + "description": "The type of the variable", + "enum": [ + "string", + "boolean", + "uri" + ] + }, + "description": { + "$id": "#/properties/formVariables/variable/description", + "title": "Description", + "type": "string", + "description": "Describes the variable in the UI. Markdown links allowed.", + "maxLength": 250 + }, + "isSecret": { + "$id": "#/properties/formVariables/variable/is-secret", + "title": "Is this variable a secret", + "type": "boolean", + "description": "Secret variables will be masked in the UI" + } + }, + "required": [ + "key", + "name", + "type", + "description" + ] + } + }, "capabilities": { "$id": "#/properties/capabilities", "title": "Capabilities", @@ -268,7 +336,7 @@ "type": "object", "propertyNames": { "enum": [ - "receivingEndpoint", + "endpoint", "method", "contentType", "templates", @@ -276,34 +344,49 @@ ] }, "properties": { - "receivingEndpoint": { + "endpoint": { "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", - "title": "Endpoint URL", - "description": "URL where you'd like LaunchDarkly to send webhooks to", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - }, - "method": { - "$id": "#/properties/capability/audit-log-events-hook/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": [ - "post", - "put", - "patch" - ] - }, - "contentType": { - "$id": "#/properties/capability/audit-log-events-hook/content-type", - "title": "Content type", - "description": "The content-type your endpoint expects to receive", - "type": "string", - "default": "application/json", - "minLength": 3, - "examples": [ - "application/json", - "application/xml" + "title": "Endpoint", + "description": "Properties that describe the HTTP endpoint LaunchDarkly will send hooks to", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "method": { + "$id": "#/properties/capability/audit-log-events-hook/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "post", + "put", + "patch" + ], + "default": "post" + }, + "headers": { + "$id": "#/properties/capability/audit-log-events-hook/headers", + "title": "Headers", + "description": "Headers to send with the webhook request", + "type": "object", + "default": { + "Content-Type": "application/json" + }, + "examples": [ + { + "Content-Type": "application/json", + "Authorization": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url" ] }, "templates": { @@ -439,9 +522,7 @@ } }, "required": [ - "receivingEndpoint", - "method", - "contentType" + "endpoint" ] } }, From b63143759742d972b620ad6518df7553754f3d0a Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 16:33:47 -0700 Subject: [PATCH 048/936] Updated headers in schema --- MANIFEST.md | 273 +++++------------- integrations/datadog/manifest.json | 9 +- integrations/msteams/manifest.json | 9 +- integrations/sample-integration/manifest.json | 9 +- integrations/slack/manifest.json | 9 +- manifest.schema.json | 148 +++------- 6 files changed, 137 insertions(+), 320 deletions(-) diff --git a/MANIFEST.md b/MANIFEST.md index 348481af..8c06b0f0 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -12,200 +12,19 @@ Describes the capabilities and intent of a LaunchDarkly integration # LaunchDarkly Integrations Manifest Properties -| Property | Type | Required | Nullable | Defined by | -| --------------------------------- | ---------- | ------------ | -------- | ------------------------------------------------ | -| [authentication](#authentication) | `object` | Optional | No | LaunchDarkly Integrations Manifest (this schema) | -| [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [categories](#categories) | `enum[]` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [description](#description) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [formVariables](#formvariables) | `object[]` | Optional | No | LaunchDarkly Integrations Manifest (this schema) | -| [icons](#icons) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [links](#links) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [name](#name) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [overview](#overview) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [supportEmail](#supportemail) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [version](#version) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | - -## authentication - -### Authentication - -Specify the authentication method required by your integration - -`authentication` - -- is optional -- type: `object` -- defined in this schema - -### authentication Type - -`object` with following properties: - -| Property | Type | Required | -| ------------ | ------ | ------------ | -| `acceptedAs` | object | **Required** | -| `hint` | string | **Required** | -| `label` | string | **Required** | -| `type` | string | **Required** | - -#### acceptedAs - -##### Token accepted as... - -Specify how your token should be provided in the request to your service - -`acceptedAs` - -- is **required** -- type: `object` - -##### acceptedAs Type - -`object` with following properties: - -| Property | Type | Required | -| -------- | ------ | ------------ | -| `name` | string | **Required** | -| `prefix` | string | Optional | -| `type` | string | **Required** | - -#### name - -##### Query parameter or header name - -Specify the name of the query parameter or header you'd like to use - -`name` - -- is **required** -- type: `string` - -##### name Type - -`string` - -##### name Examples - -```json -token -``` - -```json -key -``` - -```json -X - App - Token -``` - -#### prefix - -##### Header value prefix - -If your token needs to be padded with a prefix, specify it here - -`prefix` - -- is optional -- type: `string` - -##### prefix Type - -`string` - -##### prefix Example - -```json -Bearer -``` - -#### type - -##### Type - -Specify the method in which your token is provided in the request. In most cases, tokens are either passed through -query parameter or a header. - -`type` - -- is **required** -- type: `enum` - -The value of this property **must** be equal to one of the [known values below](#authentication-known-values). - -##### type Known Values - -| Value | Description | -| ------------- | ----------- | -| `query-param` | | -| `header` | | - -#### hint - -##### Hint - -A placeholder hint used in the LaunchDarkly UI describing your token - -`hint` - -- is **required** -- type: `string` - -##### hint Type - -`string` - -##### hint Example - -```json -Enter API key from your SpaceXYZ account -``` - -#### label - -##### Token - -Label to use in the LaunchDarkly UI describing you token - -`label` - -- is **required** -- type: `string` - -##### label Type - -`string` - -##### label Examples - -```json -API key -``` - -```json -API token -``` - -#### type - -##### Auth Type - -Specify the authentication method required by your integration - -`type` - -- is **required** -- type: `enum` - -The value of this property **must** be equal to one of the [known values below](#authentication-known-values). - -##### type Known Values - -| Value | Description | -| ------- | ----------- | -| `token` | | +| Property | Type | Required | Nullable | Defined by | +| ------------------------------- | ---------- | ------------ | -------- | ------------------------------------------------ | +| [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [categories](#categories) | `enum[]` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [description](#description) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [formVariables](#formvariables) | `object[]` | Optional | No | LaunchDarkly Integrations Manifest (this schema) | +| [icons](#icons) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [links](#links) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [name](#name) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [overview](#overview) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [supportEmail](#supportemail) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| [version](#version) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | ## author @@ -456,10 +275,10 @@ Properties that describe the HTTP endpoint LaunchDarkly will send hooks to `object` with following properties: -| Property | Type | Required | Default | -| --------- | ------ | -------- | ------------------------------------- | -| `headers` | object | Optional | `{"Content-Type":"application/json"}` | -| `method` | | Optional | `"post"` | +| Property | Type | Required | Default | +| --------- | ----- | -------- | ------------------------------------------------------ | +| `headers` | array | Optional | `[{"name":"Content-Type","value":"application/json"}]` | +| `method` | | Optional | `"post"` | #### headers @@ -470,18 +289,64 @@ Headers to send with the webhook request `headers` - is optional -- type: `object` -- default: `{"Content-Type":"application/json"}` +- type: `object[]` +- default: `[{"name":"Content-Type","value":"application/json"}]` ##### headers Type -`object` with following properties: +Array type: `object[]` + +All items must be of the type: `object` with following properties: -| Property | Type | Required | -| -------- | ---- | -------- | +| Property | Type | Required | +| -------- | ------ | ------------ | +| `name` | string | **Required** | +| `value` | string | **Required** | + +#### name + +##### Name +Name of the header -##### headers Example +`name` + +- is **required** +- type: `string` + +##### name Type + +`string` + +- maximum length: 50 characters All instances must conform to this regular expression (test examples + [here](https://regexr.com/?expression=%5E%5B%5E%5Cs%5D*%24)): + +```regex +^[^\s]*$ +``` + +#### value + +##### Value + +Value of the header. Form variables can be substituted in using {{variableName}} + +`value` + +- is **required** +- type: `string` + +##### value Type + +`string` + +A name and value pair to send as headers with the hook request + +##### headers Examples + +```json +[object Object] +``` ```json [object Object] diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 61e99f33..4d6898a5 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -28,9 +28,12 @@ "endpoint": { "url": "https://api.datadoghq.com/api/v1/events/?api_key={{apitoken}}", "method": "post", - "headers": { - "Content-Type": "application/json" - } + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] }, "templates": { "flag": "templates/template.json", diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 0cc5ab84..d423b2a4 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -28,9 +28,12 @@ "endpoint": { "url": "{{uri}}", "method": "post", - "headers": { - "Content-Type": "application/json" - } + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] }, "templates": { "flag": "templates/template.json", diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 4407e595..19e3c751 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -19,9 +19,12 @@ "endpoint": { "url": "https://example.com/webhookin", "method": "post", - "headers": { - "Content-Type": "application/json" - } + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] }, "templates": { "flag": "templates/template.json", diff --git a/integrations/slack/manifest.json b/integrations/slack/manifest.json index b57a5e47..2afddab7 100644 --- a/integrations/slack/manifest.json +++ b/integrations/slack/manifest.json @@ -28,9 +28,12 @@ "endpoint": { "url": "{{uri}}", "method": "post", - "headers": { - "Content-Type": "application/json" - } + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] }, "templates": { "flag": "templates/template.json", diff --git a/manifest.schema.json b/manifest.schema.json index b9d8bf61..c386bee2 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -156,105 +156,6 @@ "rectangular" ] }, - "authentication": { - "$id": "#/properties/authentication", - "title": "Authentication", - "description": "Specify the authentication method required by your integration", - "type": "object", - "properties": { - "type": { - "$id": "#/properties/authentication/type", - "title": "Auth Type", - "description": "Specify the authentication method required by your integration", - "type": "string", - "enum": [ - "token" - ] - }, - "label": { - "$id": "#/properties/authentication/label", - "title": "Token", - "description": "Label to use in the LaunchDarkly UI describing you token", - "examples": [ - "API key", - "API token" - ], - "type": "string" - }, - "hint": { - "$id": "#/properties/authentication/hint", - "title": "Hint", - "description": "A placeholder hint used in the LaunchDarkly UI describing your token", - "examples": [ - "Enter API key from your SpaceXYZ account" - ], - "type": "string" - }, - "acceptedAs": { - "$id": "#/properties/authentication/acceptedAs", - "title": "Token accepted as...", - "description": "Specify how your token should be provided in the request to your service", - "type": "object", - "properties": { - "type": { - "$id": "#/properties/authentication/acceptedAs/type", - "title": "Type", - "description": "Specify the method in which your token is provided in the request. In most cases, tokens are either passed through query parameter or a header.", - "type": "string", - "enum": [ - "query-param", - "header" - ] - }, - "name": { - "$id": "#/properties/authentication/acceptedAs/type/param-name", - "title": "Query parameter or header name", - "description": "Specify the name of the query parameter or header you'd like to use", - "type": "string", - "examples": [ - "token", - "key", - "X-App-Token" - ] - }, - "prefix": { - "$id": "#/properties/authentication/acceptedAs/type/header-value-prefix", - "title": "Header value prefix", - "description": "If your token needs to be padded with a prefix, specify it here", - "type": "string", - "examples": [ - "Bearer " - ] - } - }, - "required": [ - "type", - "name" - ], - "propertyNames": { - "enum": [ - "type", - "name", - "prefix" - ] - } - } - }, - "required": [ - "type", - "label", - "hint", - "acceptedAs" - ], - "propertyNames": { - "enum": [ - "type", - "label", - "hint", - "acceptedAs" - ] - } - }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", @@ -372,14 +273,53 @@ "$id": "#/properties/capability/audit-log-events-hook/headers", "title": "Headers", "description": "Headers to send with the webhook request", - "type": "object", - "default": { - "Content-Type": "application/json" + "type": "array", + "items": { + "$id": "#/properties/capability/audit-log-events-hook/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/properties/fcapability/audit-log-events-hook/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/properties/fcapability/audit-log-events-hook/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], "examples": [ { - "Content-Type": "application/json", - "Authorization": "Bearer {{apiToken}}" + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" } ], "minProperties": 1 From e40602d27f3c62c16620c635ca507bc440bbcbdc Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 16:37:54 -0700 Subject: [PATCH 049/936] Add URL to schema --- MANIFEST.md | 24 ++++++++++++++++++++---- manifest.schema.json | 6 ++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/MANIFEST.md b/MANIFEST.md index 8c06b0f0..e2dc5f9e 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -275,10 +275,11 @@ Properties that describe the HTTP endpoint LaunchDarkly will send hooks to `object` with following properties: -| Property | Type | Required | Default | -| --------- | ----- | -------- | ------------------------------------------------------ | -| `headers` | array | Optional | `[{"name":"Content-Type","value":"application/json"}]` | -| `method` | | Optional | `"post"` | +| Property | Type | Required | Default | +| --------- | ------ | ------------ | ------------------------------------------------------ | +| `headers` | array | Optional | `[{"name":"Content-Type","value":"application/json"}]` | +| `method` | | Optional | `"post"` | +| `url` | string | **Required** | | #### headers @@ -374,6 +375,21 @@ The value of this property **must** be equal to one of the [known values below]( | `put` | | | `patch` | | +#### url + +##### URL + +URL to send the request to + +`url` + +- is **required** +- type: `string` + +##### url Type + +`string` + #### templates ##### Webhook body template diff --git a/manifest.schema.json b/manifest.schema.json index c386bee2..27265d00 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -258,6 +258,12 @@ ] }, "properties": { + "url": { + "$id": "#/properties/capability/audit-log-events-hook/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to" + }, "method": { "$id": "#/properties/capability/audit-log-events-hook/method", "title": "HTTP method", From d60b3c09a614f7e3eafd9960f316efa7255dea75 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 16:48:25 -0700 Subject: [PATCH 050/936] Updated logos (#5) --- integrations/msteams/manifest.json | 2 +- .../slack/assets/images/Slack_Mark.svg | 46 +++++--------- .../slack/assets/images/Slack_RGB.svg | 62 +++++-------------- integrations/slack/manifest.json | 6 +- 4 files changed, 33 insertions(+), 83 deletions(-) diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index d423b2a4..fd8e8118 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -1,7 +1,7 @@ { "name": "Microsoft Teams", "version": "1.0.0", - "overview": "Send audit log events to your Datadog dashboards", + "overview": "Send audit log events to Microsoft Teams", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Microsoft Teams.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/slack/assets/images/Slack_Mark.svg b/integrations/slack/assets/images/Slack_Mark.svg index c37dc5eb..06148c7b 100644 --- a/integrations/slack/assets/images/Slack_Mark.svg +++ b/integrations/slack/assets/images/Slack_Mark.svg @@ -1,33 +1,17 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/integrations/slack/assets/images/Slack_RGB.svg b/integrations/slack/assets/images/Slack_RGB.svg index e7433865..3174f50b 100644 --- a/integrations/slack/assets/images/Slack_RGB.svg +++ b/integrations/slack/assets/images/Slack_RGB.svg @@ -1,49 +1,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/integrations/slack/manifest.json b/integrations/slack/manifest.json index 2afddab7..a5c4a99d 100644 --- a/integrations/slack/manifest.json +++ b/integrations/slack/manifest.json @@ -1,8 +1,8 @@ { - "name": "Microsoft Teams", + "name": "Slack", "version": "1.0.0", - "overview": "Send audit log events to your Datadog dashboards", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Microsoft Teams.", + "overview": "Send audit log events to your Slack channels", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Slack.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 954f68093fb5d73eceda477774b01b4787a15732 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 17:22:12 -0700 Subject: [PATCH 051/936] Add placeholder to manifest --- MANIFEST.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/MANIFEST.md b/MANIFEST.md index e2dc5f9e..ebfeb5a4 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -540,6 +540,7 @@ All items must be of the type: `object` with following properties: | `isSecret` | boolean | Optional | | `key` | string | **Required** | | `name` | string | **Required** | +| `placeholder` | string | Optional | | `type` | string | **Required** | #### description @@ -613,6 +614,21 @@ A descriptive name that will be used as the form label on the UI - maximum length: 50 characters +#### placeholder + +##### Description + +Placeholder value to use in the form element if applicable + +`placeholder` + +- is optional +- type: `string` + +##### placeholder Type + +`string` + #### type ##### Type From 38844800d3a7ba27d0444861081f3b2d2026968d Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 25 Oct 2019 17:23:22 -0700 Subject: [PATCH 052/936] Add placeholder to manifest --- manifest.schema.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/manifest.schema.json b/manifest.schema.json index 27265d00..fa1b1c45 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -172,6 +172,7 @@ "name", "type", "description", + "placeholder", "isSecret" ] }, @@ -209,6 +210,12 @@ "description": "Describes the variable in the UI. Markdown links allowed.", "maxLength": 250 }, + "placeholder": { + "$id": "#/properties/formVariables/variable/placeholder", + "title": "Description", + "type": "string", + "description": "Placeholder value to use in the form element if applicable" + }, "isSecret": { "$id": "#/properties/formVariables/variable/is-secret", "title": "Is this variable a secret", From e1b898e2256da6ca6800dc3ba1ca51c628c057f2 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Mon, 28 Oct 2019 11:17:15 -0700 Subject: [PATCH 053/936] Adding Honeycomb (#6) * Adding Honeycomb * Fix manifest --- integrations/honeycomb/LICENSE.md | 13 ++++ integrations/honeycomb/README.md | 0 .../assets/images/honeycomb-rect.svg | 36 ++++++++++ .../assets/images/honeycomb-square.svg | 13 ++++ integrations/honeycomb/manifest.json | 65 +++++++++++++++++++ .../honeycomb/templates/template.json | 7 ++ 6 files changed, 134 insertions(+) create mode 100644 integrations/honeycomb/LICENSE.md create mode 100644 integrations/honeycomb/README.md create mode 100644 integrations/honeycomb/assets/images/honeycomb-rect.svg create mode 100644 integrations/honeycomb/assets/images/honeycomb-square.svg create mode 100644 integrations/honeycomb/manifest.json create mode 100644 integrations/honeycomb/templates/template.json diff --git a/integrations/honeycomb/LICENSE.md b/integrations/honeycomb/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/honeycomb/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/honeycomb/README.md b/integrations/honeycomb/README.md new file mode 100644 index 00000000..e69de29b diff --git a/integrations/honeycomb/assets/images/honeycomb-rect.svg b/integrations/honeycomb/assets/images/honeycomb-rect.svg new file mode 100644 index 00000000..d6702bde --- /dev/null +++ b/integrations/honeycomb/assets/images/honeycomb-rect.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/honeycomb/assets/images/honeycomb-square.svg b/integrations/honeycomb/assets/images/honeycomb-square.svg new file mode 100644 index 00000000..5b576d9f --- /dev/null +++ b/integrations/honeycomb/assets/images/honeycomb-square.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json new file mode 100644 index 00000000..7610c805 --- /dev/null +++ b/integrations/honeycomb/manifest.json @@ -0,0 +1,65 @@ +{ + "name": "Honeycomb", + "version": "1.0.0", + "overview": "Send LaunchDarkly audit events to Honeycomb", + "description": "This integration sends LaunchDarkly audit events to Honeycomb.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://honeycomb.io", + "privacyPolicy": "https://honeycomb.io/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/honeycomb-square.svg", + "rectangular": "assets/images/honeycomb-rect.svg" + }, + "formVariables": [ + { + "key": "url", + "name": "Honeycomb Events URL", + "description": "Enter the events URL following the pattern above specifying your [DATASET_NAME](https://docs.honeycomb.io/api/events/)", + "placeholder": "https://api.honeycomb.io/1/events/", + "type": "uri", + "isSecret": false + }, + { + "key": "apiKey", + "name": "Honeycomb API Key", + "description": "Enter your [Honeycomb API key](https://ui.honeycomb.io/teams) here", + "type": "string", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{url}}", + "method": "post", + "headers": [ + { + "name": "X-Honeycomb-Team", + "value": "{{apiKey}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/honeycomb/templates/template.json b/integrations/honeycomb/templates/template.json new file mode 100644 index 00000000..2d785a1f --- /dev/null +++ b/integrations/honeycomb/templates/template.json @@ -0,0 +1,7 @@ +{ + "title": "{{summary}}", + "text": "{{memberName}} {{action}} {{resourceName}}", + "date_happened": "{{dateHappened}}", + "tags": ["any", "arbitrary", "tag"], + "source_type_name": "example.com" +} From ca3be18e4721c46b92d4db65e5a19bb7b7a0ff79 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Mon, 28 Oct 2019 12:06:32 -0700 Subject: [PATCH 054/936] Honeycomb: change to Markers API --- integrations/honeycomb/manifest.json | 11 ++++------- integrations/honeycomb/templates/flag.json | 6 ++++++ integrations/honeycomb/templates/template.json | 7 ------- 3 files changed, 10 insertions(+), 14 deletions(-) create mode 100644 integrations/honeycomb/templates/flag.json delete mode 100644 integrations/honeycomb/templates/template.json diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 7610c805..cd9c9176 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -17,9 +17,9 @@ "formVariables": [ { "key": "url", - "name": "Honeycomb Events URL", - "description": "Enter the events URL following the pattern above specifying your [DATASET_NAME](https://docs.honeycomb.io/api/events/)", - "placeholder": "https://api.honeycomb.io/1/events/", + "name": "Markers API URL", + "description": "Enter the [Markers API URL](https://docs.honeycomb.io/api/markers/) following the pattern above.", + "placeholder": "https://api.honeycomb.io/1/markers/", "type": "uri", "isSecret": false }, @@ -48,10 +48,7 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "metric": "templates/template.json" + "flag": "templates/flag.json" }, "defaultPolicy": [ { diff --git a/integrations/honeycomb/templates/flag.json b/integrations/honeycomb/templates/flag.json new file mode 100644 index 00000000..670a3fac --- /dev/null +++ b/integrations/honeycomb/templates/flag.json @@ -0,0 +1,6 @@ +{ + "start_time": {{actionDttm}}, + "message": "{{summary}}", + "type": "{{action}}", + "url": "{{url}}" +} \ No newline at end of file diff --git a/integrations/honeycomb/templates/template.json b/integrations/honeycomb/templates/template.json deleted file mode 100644 index 2d785a1f..00000000 --- a/integrations/honeycomb/templates/template.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "title": "{{summary}}", - "text": "{{memberName}} {{action}} {{resourceName}}", - "date_happened": "{{dateHappened}}", - "tags": ["any", "arbitrary", "tag"], - "source_type_name": "example.com" -} From 3faba300bf38758008e68b6806eeff3ca97872ff Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Mon, 28 Oct 2019 13:20:31 -0700 Subject: [PATCH 055/936] Ask for dataset name instead --- integrations/honeycomb/manifest.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index cd9c9176..cf3399e0 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -16,11 +16,10 @@ }, "formVariables": [ { - "key": "url", - "name": "Markers API URL", - "description": "Enter the [Markers API URL](https://docs.honeycomb.io/api/markers/) following the pattern above.", - "placeholder": "https://api.honeycomb.io/1/markers/", - "type": "uri", + "key": "datasetName", + "name": "Honeycomb Dataset Name", + "description": "Enter the Dataset Name that will be used for the request to the [Marker API](https://docs.honeycomb.io/api/markers/).", + "type": "string", "isSecret": false }, { From 0ad7244d1bec6671ac9a9f74028f8600d196cd22 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 30 Oct 2019 11:41:44 -0700 Subject: [PATCH 056/936] Minor updates to schema --- MANIFEST.md | 90 ++++++++++++------ integrations/datadog/manifest.json | 4 +- integrations/honeycomb/manifest.json | 4 +- integrations/msteams/manifest.json | 4 +- .../{rectangular.svg => horizontal.svg} | 0 integrations/sample-integration/manifest.json | 4 +- integrations/slack/manifest.json | 4 +- manifest.schema.json | 91 +++++++++++++++---- 8 files changed, 147 insertions(+), 54 deletions(-) rename integrations/sample-integration/assets/images/{rectangular.svg => horizontal.svg} (100%) diff --git a/MANIFEST.md b/MANIFEST.md index ebfeb5a4..9e2d2846 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -89,7 +89,7 @@ This capability will enable LaunchDarkly to send audit log event webhooks to you | --------------- | ------ | ------------ | | `defaultPolicy` | array | Optional | | `endpoint` | object | **Required** | -| `templates` | object | Optional | +| `templates` | object | **Required** | #### defaultPolicy @@ -278,12 +278,12 @@ Properties that describe the HTTP endpoint LaunchDarkly will send hooks to | Property | Type | Required | Default | | --------- | ------ | ------------ | ------------------------------------------------------ | | `headers` | array | Optional | `[{"name":"Content-Type","value":"application/json"}]` | -| `method` | | Optional | `"post"` | +| `method` | | Optional | `"POST"` | | `url` | string | **Required** | | #### headers -##### Headers +##### HTTP headers Headers to send with the webhook request @@ -363,7 +363,7 @@ HTTP method to use when LaunchDarkly makes the request to your endpoint - is optional - type: `enum` -- default: `"post"` +- default: `"POST"` The value of this property **must** be equal to one of the [known values below](#capabilities-known-values). @@ -371,15 +371,15 @@ The value of this property **must** be equal to one of the [known values below]( | Value | Description | | ------- | ----------- | -| `post` | | -| `put` | | -| `patch` | | +| `POST` | | +| `PUT` | | +| `PATCH` | | #### url ##### URL -URL to send the request to +URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. `url` @@ -390,6 +390,8 @@ URL to send the request to `string` +- minimum length: 3 characters + #### templates ##### Webhook body template @@ -398,7 +400,7 @@ Templates to use for body of the webhook request `templates` -- is optional +- is **required** - type: `object` ##### templates Type @@ -534,14 +536,31 @@ Array type: `object[]` All items must be of the type: `object` with following properties: -| Property | Type | Required | -| ------------- | ------- | ------------ | -| `description` | string | **Required** | -| `isSecret` | boolean | Optional | -| `key` | string | **Required** | -| `name` | string | **Required** | -| `placeholder` | string | Optional | -| `type` | string | **Required** | +| Property | Type | Required | Default | +| -------------- | ------- | ------------ | ------- | +| `defaultValue` | string | Optional | | +| `description` | string | **Required** | | +| `isRequired` | boolean | Optional | `true` | +| `isSecret` | boolean | Optional | `false` | +| `key` | string | **Required** | | +| `name` | string | **Required** | | +| `placeholder` | string | Optional | | +| `type` | string | **Required** | | + +#### defaultValue + +##### Default value + +Default value for variable. Can be overridden by user in the UI + +`defaultValue` + +- is optional +- type: `string` + +##### defaultValue Type + +`string` #### description @@ -560,9 +579,25 @@ Describes the variable in the UI. Markdown links allowed. - maximum length: 250 characters +#### isRequired + +##### Is this variable required? + +Secret variables will be masked in the UI + +`isRequired` + +- is optional +- type: `boolean` +- default: `true` + +##### isRequired Type + +`boolean` + #### isSecret -##### Is this variable a secret +##### Is this variable a secret? Secret variables will be masked in the UI @@ -570,6 +605,7 @@ Secret variables will be masked in the UI - is optional - type: `boolean` +- default: `false` ##### isSecret Type @@ -669,23 +705,23 @@ Logos describing your integration in SVG format `object` with following properties: -| Property | Type | Required | -| ------------- | ------ | ------------ | -| `rectangular` | string | **Required** | -| `square` | string | **Required** | +| Property | Type | Required | +| ------------ | ------ | ------------ | +| `horizontal` | string | **Required** | +| `square` | string | **Required** | -#### rectangular +#### horizontal -##### Rectangular logo +##### Horizontal logo -A rectangular version of your integration's logo in SVG format +A horizontal version of your integration's logo in SVG format -`rectangular` +`horizontal` - is **required** - type: `string` -##### rectangular Type +##### horizontal Type `string` diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 4d6898a5..1a0a3f44 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -12,7 +12,7 @@ "categories": ["apm", "monitoring", "alerts"], "icons": { "square": "assets/images/dd_icon_rgb.svg", - "rectangular": "assets/images/dd_logo_h_rbg.svg" + "horizontal": "assets/images/dd_logo_h_rbg.svg" }, "formVariables": [ { @@ -27,7 +27,7 @@ "auditLogEventsHook": { "endpoint": { "url": "https://api.datadoghq.com/api/v1/events/?api_key={{apitoken}}", - "method": "post", + "method": "POST", "headers": [ { "name": "Content-Type", diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index cf3399e0..2208faa3 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -12,7 +12,7 @@ "categories": ["apm", "monitoring", "alerts"], "icons": { "square": "assets/images/honeycomb-square.svg", - "rectangular": "assets/images/honeycomb-rect.svg" + "horizontal": "assets/images/honeycomb-rect.svg" }, "formVariables": [ { @@ -34,7 +34,7 @@ "auditLogEventsHook": { "endpoint": { "url": "{{url}}", - "method": "post", + "method": "POST", "headers": [ { "name": "X-Honeycomb-Team", diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index fd8e8118..2e158370 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -12,7 +12,7 @@ "categories": ["monitoring", "alerts"], "icons": { "square": "assets/images/microsoft-teams.svg", - "rectangular": "assets/images/microsoft-teams.svg" + "horizontal": "assets/images/microsoft-teams.svg" }, "formVariables": [ { @@ -27,7 +27,7 @@ "auditLogEventsHook": { "endpoint": { "url": "{{uri}}", - "method": "post", + "method": "POST", "headers": [ { "name": "Content-Type", diff --git a/integrations/sample-integration/assets/images/rectangular.svg b/integrations/sample-integration/assets/images/horizontal.svg similarity index 100% rename from integrations/sample-integration/assets/images/rectangular.svg rename to integrations/sample-integration/assets/images/horizontal.svg diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 19e3c751..c6fc1bd3 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -12,13 +12,13 @@ "categories": ["apm", "monitoring", "alerts"], "icons": { "square": "assets/images/square.svg", - "rectangular": "assets/images/rectangular.svg" + "horizontal": "assets/images/horizontal.svg" }, "capabilities": { "auditLogEventsHook": { "endpoint": { "url": "https://example.com/webhookin", - "method": "post", + "method": "POST", "headers": [ { "name": "Content-Type", diff --git a/integrations/slack/manifest.json b/integrations/slack/manifest.json index a5c4a99d..61b1a6c6 100644 --- a/integrations/slack/manifest.json +++ b/integrations/slack/manifest.json @@ -12,7 +12,7 @@ "categories": ["monitoring", "alerts"], "icons": { "square": "assets/images/Slack_Mark.svg", - "rectangular": "assets/images/Slack_RGB.svg" + "horizontal": "assets/images/Slack_RGB.svg" }, "formVariables": [ { @@ -27,7 +27,7 @@ "auditLogEventsHook": { "endpoint": { "url": "{{uri}}", - "method": "post", + "method": "POST", "headers": [ { "name": "Content-Type", diff --git a/manifest.schema.json b/manifest.schema.json index fa1b1c45..a92a0254 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -5,6 +5,21 @@ "description": "Describes the capabilities and intent of a LaunchDarkly integration", "type": "object", "additionalProperties": false, + "propertyNames": { + "enum": [ + "name", + "version", + "overview", + "description", + "author", + "supportEmail", + "links", + "categories", + "icons", + "formVariables", + "capabilities" + ] + }, "properties": { "name": { "$id": "#/properties/name", @@ -67,6 +82,13 @@ "title": "Links", "description": "A set of reference links supporting your integration", "type": "object", + "propertyNames": { + "enum": [ + "site", + "privacyPolicy", + "supportWebsite" + ] + }, "properties": { "site": { "$id": "#/properties/links/site", @@ -135,6 +157,12 @@ "title": "Icons", "description": "Logos describing your integration in SVG format", "type": "object", + "propertyNames": { + "enum": [ + "square", + "horizontal" + ] + }, "properties": { "square": { "$id": "#/properties/icons/square", @@ -143,17 +171,17 @@ "type": "string", "pattern": "\\.svg$" }, - "rectangular": { - "$id": "#/properties/icons/rectangular", - "title": "Rectangular logo", - "description": "A rectangular version of your integration's logo in SVG format", + "horizontal": { + "$id": "#/properties/icons/horizontal", + "title": "Horizontal logo", + "description": "A horizontal version of your integration's logo in SVG format", "type": "string", "pattern": "\\.svg$" } }, "required": [ "square", - "rectangular" + "horizontal" ] }, "formVariables": { @@ -173,7 +201,9 @@ "type", "description", "placeholder", - "isSecret" + "isSecret", + "isRequired", + "defaultValue" ] }, "properties": { @@ -218,9 +248,23 @@ }, "isSecret": { "$id": "#/properties/formVariables/variable/is-secret", - "title": "Is this variable a secret", + "title": "Is this variable a secret?", + "type": "boolean", + "description": "Secret variables will be masked in the UI", + "default": false + }, + "isRequired": { + "$id": "#/properties/formVariables/variable/is-required", + "title": "Is this variable required?", "type": "boolean", - "description": "Secret variables will be masked in the UI" + "description": "Secret variables will be masked in the UI", + "default": true + }, + "defaultValue": { + "$id": "#/properties/formVariables/variable/default-value", + "title": "Default value", + "type": "string", + "description": "Default value for variable. Can be overridden by user in the UI" } }, "required": [ @@ -236,6 +280,11 @@ "title": "Capabilities", "description": "Specify which capabilities you'd like your integration to have", "type": "object", + "propertyNames": { + "enum": [ + "auditLogEventsHook" + ] + }, "properties": { "auditLogEventsHook": { "$id": "#/properties/capability/audit-log-events-hook", @@ -245,8 +294,6 @@ "propertyNames": { "enum": [ "endpoint", - "method", - "contentType", "templates", "defaultPolicy" ] @@ -269,22 +316,23 @@ "$id": "#/properties/capability/audit-log-events-hook/url", "title": "URL", "type": "string", - "description": "URL to send the request to" + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url.", + "minLength": 3 }, "method": { "$id": "#/properties/capability/audit-log-events-hook/method", "title": "HTTP method", "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", "enum": [ - "post", - "put", - "patch" + "POST", + "PUT", + "PATCH" ], - "default": "post" + "default": "POST" }, "headers": { "$id": "#/properties/capability/audit-log-events-hook/headers", - "title": "Headers", + "title": "HTTP headers", "description": "Headers to send with the webhook request", "type": "array", "items": { @@ -347,6 +395,14 @@ "title": "Webhook body template", "description": "Templates to use for body of the webhook request", "type": "object", + "propertyNames": { + "enum": [ + "flag", + "project", + "environment", + "metric" + ] + }, "properties": { "flag": { "$id": "#/properties/capability/audit-log-events-hook/templates/flag", @@ -475,7 +531,8 @@ } }, "required": [ - "endpoint" + "endpoint", + "templates" ] } }, From 6e779d323e5963ed26fd422259760f0f73b8c750 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 31 Oct 2019 13:44:08 -0700 Subject: [PATCH 057/936] Made all formVariables required --- integrations/datadog/manifest.json | 3 ++- integrations/honeycomb/manifest.json | 6 ++++-- integrations/msteams/manifest.json | 3 ++- integrations/slack/manifest.json | 3 ++- manifest.schema.json | 5 +++-- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 1a0a3f44..4dfef4b6 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -20,7 +20,8 @@ "name": "Datadog API Token", "type": "string", "description": "Enter an API key from your [Datadog account](https://app.datadoghq.com/account/settings#api).", - "isSecret": true + "isSecret": true, + "isRequired": true } ], "capabilities": { diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 2208faa3..3202f575 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -20,14 +20,16 @@ "name": "Honeycomb Dataset Name", "description": "Enter the Dataset Name that will be used for the request to the [Marker API](https://docs.honeycomb.io/api/markers/).", "type": "string", - "isSecret": false + "isSecret": false, + "isRequired": true }, { "key": "apiKey", "name": "Honeycomb API Key", "description": "Enter your [Honeycomb API key](https://ui.honeycomb.io/teams) here", "type": "string", - "isSecret": true + "isSecret": true, + "isRequired": true } ], "capabilities": { diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 2e158370..38dcfee6 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -20,7 +20,8 @@ "name": "Incoming Webhook URL", "type": "uri", "description": "[Incoming Webhook URL](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using#creating-messages-through-office-365-connectors) from Microsoft Teams", - "isSecret": false + "isSecret": false, + "isRequired": true } ], "capabilities": { diff --git a/integrations/slack/manifest.json b/integrations/slack/manifest.json index 61b1a6c6..17ef1159 100644 --- a/integrations/slack/manifest.json +++ b/integrations/slack/manifest.json @@ -20,7 +20,8 @@ "name": "Incoming Webhook URL", "type": "uri", "description": "The URL for one of your [Slack incoming webhooks](https://my.slack.com/apps/A0F7XDUAZ-incoming-webhooks)", - "isSecret": false + "isSecret": false, + "isRequired": true } ], "capabilities": { diff --git a/manifest.schema.json b/manifest.schema.json index a92a0254..853a0df7 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -258,7 +258,7 @@ "title": "Is this variable required?", "type": "boolean", "description": "Secret variables will be masked in the UI", - "default": true + "default": false }, "defaultValue": { "$id": "#/properties/formVariables/variable/default-value", @@ -273,7 +273,8 @@ "type", "description" ] - } + }, + "default": [] }, "capabilities": { "$id": "#/properties/capabilities", From dce0b9f22aba955435566736f20fea75223a5f14 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 31 Oct 2019 13:48:20 -0700 Subject: [PATCH 058/936] s/isRequired/isOptional --- MANIFEST.md | 42 +++++++++++++++------------- integrations/datadog/manifest.json | 3 +- integrations/honeycomb/manifest.json | 6 ++-- integrations/msteams/manifest.json | 3 +- integrations/slack/manifest.json | 3 +- manifest.schema.json | 10 +++---- 6 files changed, 32 insertions(+), 35 deletions(-) diff --git a/MANIFEST.md b/MANIFEST.md index 9e2d2846..fb4a9eb7 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -12,19 +12,19 @@ Describes the capabilities and intent of a LaunchDarkly integration # LaunchDarkly Integrations Manifest Properties -| Property | Type | Required | Nullable | Defined by | -| ------------------------------- | ---------- | ------------ | -------- | ------------------------------------------------ | -| [author](#author) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [capabilities](#capabilities) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [categories](#categories) | `enum[]` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [description](#description) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [formVariables](#formvariables) | `object[]` | Optional | No | LaunchDarkly Integrations Manifest (this schema) | -| [icons](#icons) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [links](#links) | `object` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [name](#name) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [overview](#overview) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [supportEmail](#supportemail) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | -| [version](#version) | `string` | **Required** | No | LaunchDarkly Integrations Manifest (this schema) | +| Property | Type | Required | Nullable | Default | Defined by | +| ------------------------------- | ---------- | ------------ | -------- | ------- | ------------------------------------------------ | +| [author](#author) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | +| [capabilities](#capabilities) | `object` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | +| [categories](#categories) | `enum[]` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | +| [description](#description) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | +| [formVariables](#formvariables) | `object[]` | Optional | No | `[]` | LaunchDarkly Integrations Manifest (this schema) | +| [icons](#icons) | `object` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | +| [links](#links) | `object` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | +| [name](#name) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | +| [overview](#overview) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | +| [supportEmail](#supportemail) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | +| [version](#version) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | ## author @@ -528,6 +528,8 @@ when they enable the integration. Examples of a form variable include `apiToken` - is optional - type: `object[]` + +- default: `[]` - defined in this schema ### formVariables Type @@ -540,7 +542,7 @@ All items must be of the type: `object` with following properties: | -------------- | ------- | ------------ | ------- | | `defaultValue` | string | Optional | | | `description` | string | **Required** | | -| `isRequired` | boolean | Optional | `true` | +| `isOptional` | boolean | Optional | `false` | | `isSecret` | boolean | Optional | `false` | | `key` | string | **Required** | | | `name` | string | **Required** | | @@ -579,19 +581,19 @@ Describes the variable in the UI. Markdown links allowed. - maximum length: 250 characters -#### isRequired +#### isOptional -##### Is this variable required? +##### Is this variable optional? -Secret variables will be masked in the UI +Variables marked as optional won't be required on the UI -`isRequired` +`isOptional` - is optional - type: `boolean` -- default: `true` +- default: `false` -##### isRequired Type +##### isOptional Type `boolean` diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 4dfef4b6..1a0a3f44 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -20,8 +20,7 @@ "name": "Datadog API Token", "type": "string", "description": "Enter an API key from your [Datadog account](https://app.datadoghq.com/account/settings#api).", - "isSecret": true, - "isRequired": true + "isSecret": true } ], "capabilities": { diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 3202f575..2208faa3 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -20,16 +20,14 @@ "name": "Honeycomb Dataset Name", "description": "Enter the Dataset Name that will be used for the request to the [Marker API](https://docs.honeycomb.io/api/markers/).", "type": "string", - "isSecret": false, - "isRequired": true + "isSecret": false }, { "key": "apiKey", "name": "Honeycomb API Key", "description": "Enter your [Honeycomb API key](https://ui.honeycomb.io/teams) here", "type": "string", - "isSecret": true, - "isRequired": true + "isSecret": true } ], "capabilities": { diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 38dcfee6..2e158370 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -20,8 +20,7 @@ "name": "Incoming Webhook URL", "type": "uri", "description": "[Incoming Webhook URL](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using#creating-messages-through-office-365-connectors) from Microsoft Teams", - "isSecret": false, - "isRequired": true + "isSecret": false } ], "capabilities": { diff --git a/integrations/slack/manifest.json b/integrations/slack/manifest.json index 17ef1159..61b1a6c6 100644 --- a/integrations/slack/manifest.json +++ b/integrations/slack/manifest.json @@ -20,8 +20,7 @@ "name": "Incoming Webhook URL", "type": "uri", "description": "The URL for one of your [Slack incoming webhooks](https://my.slack.com/apps/A0F7XDUAZ-incoming-webhooks)", - "isSecret": false, - "isRequired": true + "isSecret": false } ], "capabilities": { diff --git a/manifest.schema.json b/manifest.schema.json index 853a0df7..10b0bd43 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -202,7 +202,7 @@ "description", "placeholder", "isSecret", - "isRequired", + "isOptional", "defaultValue" ] }, @@ -253,11 +253,11 @@ "description": "Secret variables will be masked in the UI", "default": false }, - "isRequired": { - "$id": "#/properties/formVariables/variable/is-required", - "title": "Is this variable required?", + "isOptional": { + "$id": "#/properties/formVariables/variable/is-optional", + "title": "Is this variable optional?", "type": "boolean", - "description": "Secret variables will be masked in the UI", + "description": "Variables marked as optional won't be required on the UI", "default": false }, "defaultValue": { From 5922eebd2d153a2a759b082b43d81bb5e795af71 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 31 Oct 2019 13:59:10 -0700 Subject: [PATCH 059/936] Updated sample-integration with different variations of formVariables --- integrations/sample-integration/manifest.json | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index c6fc1bd3..d806e30c 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -14,6 +14,41 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, + "formVariables": [ + { + "key": "optional", + "name": "Optional attribute", + "description": "This is an optional property", + "type": "string", + "isSecret": false, + "isOptional": true + }, + { + "key": "required", + "name": "Required attribute", + "description": "This is a required property", + "type": "string", + "isSecret": false, + "isOptional": false + }, + { + "key": "URI", + "name": "URL", + "description": "This field will be validated as a URL", + "type": "uri", + "isSecret": false, + "isOptional": true + }, + { + "key": "hasPlaceholder", + "name": "Placeholder", + "description": "This field has a placeholder", + "type": "uri", + "isSecret": false, + "isOptional": true, + "placeholder": "I belong here" + } + ], "capabilities": { "auditLogEventsHook": { "endpoint": { From 988bfc8c435d01189e3f990d6994515980f53352 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 1 Nov 2019 08:59:33 -0700 Subject: [PATCH 060/936] Update to manifest --- integrations/sample-integration/manifest.json | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index d806e30c..dae5fc4c 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -32,7 +32,7 @@ "isOptional": false }, { - "key": "URI", + "key": "URL", "name": "URL", "description": "This field will be validated as a URL", "type": "uri", @@ -43,10 +43,28 @@ "key": "hasPlaceholder", "name": "Placeholder", "description": "This field has a placeholder", - "type": "uri", + "type": "string", "isSecret": false, "isOptional": true, - "placeholder": "I belong here" + "placeholder": "I am a placeholder" + }, + { + "key": "hasDefault", + "name": "Default", + "description": "This field has a default value", + "type": "string", + "isSecret": false, + "isOptional": true, + "placeholder": "I'm a placeholder", + "defaultValue": "I'm the default value" + }, + { + "key": "secret", + "name": "Secret", + "description": "I have a secret that I'm hiding", + "type": "string", + "isSecret": true, + "isOptional": false } ], "capabilities": { From c5f289ab0541da7b9adde72f583ff06aef64def6 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 4 Dec 2019 14:41:53 -0800 Subject: [PATCH 061/936] Adding msteams template --- integrations/msteams/templates/template.json | 59 +++++++++----------- 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/integrations/msteams/templates/template.json b/integrations/msteams/templates/template.json index 444b8747..1345cdac 100644 --- a/integrations/msteams/templates/template.json +++ b/integrations/msteams/templates/template.json @@ -1,36 +1,27 @@ { - "@context": "https://schema.org/extensions", - "@type": "MessageCard", - "themeColor": "0072C6", - "title": "Visit the Outlook Dev Portal", - "text": "{{}}", - "potentialAction": [ - { - "@type": "ActionCard", - "name": "Send Feedback", - "inputs": [ - { - "@type": "TextInput", - "id": "feedback", - "isMultiline": true, - "title": "Let us know what you think about Actionable Messages" - } - ], - "actions": [ - { - "@type": "HttpPOST", - "name": "Send Feedback", - "isPrimary": true, - "target": "http://..." - } - ] - }, - { - "@type": "OpenUri", - "name": "Learn More", - "targets": [ - { "os": "default", "uri": "https://docs.microsoft.com/outlook/actionable-messages" } - ] - } - ] + "@type": "MessageCard", + "@context": "https://schema.org/extensions", + "correlationId": "{{reqid}}", + "summary": "{{summary}}", + "themeColor": "{{env.color}}", + "sections": [ + { + "activityTitle": "**{{actor.name}}** {{action.verb}} [{{action.target.name}}]({{action.target.url}})", + {{#if comment}} + "text": "> {{comment}}", + {{/if}} + {{#if updates}} + "facts": [ + {{#each updates.details}} + {{#equal this.type "update"}} + { + "name": "", + "value": "* {{this.verb}} {{#if this.oldValue}}**{{this.oldValue}}** to {{/if}}**{{this.newValue}}**" + }, + {{/equal}} + {{/each}} + ] + {{/if}} + } + ] } \ No newline at end of file From 9610cdbbabf823861f26009e6baa71a96b172fc9 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 6 Dec 2019 11:35:29 -0800 Subject: [PATCH 062/936] s/uri/url --- integrations/msteams/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 2e158370..d73f983b 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -26,7 +26,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "{{uri}}", + "url": "{{url}}", "method": "POST", "headers": [ { From 2d5400fea21b516b8ebdeb82524fcd21c304115e Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Mon, 9 Dec 2019 16:48:04 -0800 Subject: [PATCH 063/936] WIP getting started README --- README.md | 115 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 106 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 0cbce9ac..26ef52e6 100644 --- a/README.md +++ b/README.md @@ -2,24 +2,121 @@ [![CircleCI](https://circleci.com/gh/launchdarkly/ld-integrations.svg?style=svg&circle-token=c12dfaa51d070b8bbc8dea0c0adf4c402b5b9123)](https://circleci.com/gh/launchdarkly/ld-integrations) -Feature flags not only provide you control over your deployment and rollout, but +Feature flags not only provide you control over your deployment and rollout but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations -consume events from LaunchDarkly in order to provide their users more context. +consume events from LaunchDarkly to provide their users with more context. -## Building integrations +## Getting started: Building an integration There are a few steps to creating an integration with LaunchDarkly. 1. Fork this repository. -2. Create a new top level directory named after your organization or - integration's name (e.g., `spacexyz`). -3. Create a `manifest.json` inside your new directory. [Read the `manifest.json` - documentation](./MANIFEST.md) for the details. +2. Create a new directory inside `[integrations](./integrations)` named after + your organization or integration's name (e.g., `spacexyz`). Make sure the + directory has no spaces and uses + [kebab-casing](https://wiki.c2.com/?KebabCase). +3. Create a `manifest.json` inside your new directory. The `manifest.json` file + will describe your integration's details and capabilities. We'll describe how + to fill out this file in the next section. -A LaunchDarkly integration starts with a `manifest.json`. This file describes -the intent and capabilities of your integration. +Aside from the `manifest.json` file, you can create a `README.md` inside your +integration's directory that provides additional information about your +integration. Your directory can also include additional directories and assets +to support your integration -- more on this in the following section. + +LaunchDarkly's integration manifest is described through +[schema](./manifest.schema.json). When you submit a pull-request to LaunchDarkly +with your new `manifest.json`, your manifest will be validated against this +schema. To aid you in writing your schema, you can register the +[schema](./manifest.schema.json) in your IDE. If you use +[VSCode](https://code.visualstudio.com/) to create your manifest, VSCode will +automatically provide you with helpful hints and validate your manifest while +you edit. + +![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) + +### Describing your integration basic information through the Manifest + +A LaunchDarkly integration starts with a `manifest.json` file. This file +describes the intent and capabilities of your integration. It also describes +basic information about your organization: + +``` +{ + "name": "Sample Integration", + "version": "1.0.0", + "overview": "Short one-liner describing your integration", + "description": "Send flag data to space. Markdown based description.", + "author": "Example Dot Com", + "supportEmail": "support@example.com", + "links": { + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + ... +} +``` +The example above describes the basic information about your integration. We +will use most of the information above when rendering your integration +configuration form inside the LaunchDarkly UI. + +The `description` property can contain basic +[markdown](https://daringfireball.net/projects/markdown/) and is used in the +LaunchDarkly UI. The schema will validate the formatting of all properties. + +Notice that the `icons` described above are in SVG format. This is intentional. +Your organization's (or integration's) logo will be used in the LaunchDarkly UI +but also inside a public facing integrations listing on . SVG +files allow your logo to scale nicely on different formats. + +### Collecting integration configuration data from LaunchDarkly users + +Most integrations will need to collect one or more pieces of configuration data +that supports the integration. Some examples are: + +* API token +* Webhook endpoint +* URLs + +To support these configurations, you can describe a set of `formVariables` that +describe these configuration properties. Here's an example: + +``` +{ + ... + "formVariables": [ + { + "key": "endpointUrl", + "name": "Webhook endpoint URL", + "description": "Enter the URL to the webhook endpoint", + "default": "https://example.com/inbound_webhook", + "type": "url", + "isSecret": false + }, + { + "key": "apiKey", + "name": "Honeycomb API Key", + "description": "Enter your [API key](https://example.com/api) here", + "type": "string", + "isSecret": true + } + ], + ... +} +``` + +The `formVariables` entry above will yield the following UI inside of the +[LaunchDarkly Integration +page](https://app.launchdarkly.com/default/integrations): + +![Example configuration form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) ## Submitting your integrations From 8baea65b00dd68386116d4e36eb82a239b8a4501 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Mon, 9 Dec 2019 16:49:51 -0800 Subject: [PATCH 064/936] Minor readme change --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 26ef52e6..d79654b9 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ consume events from LaunchDarkly to provide their users with more context. There are a few steps to creating an integration with LaunchDarkly. 1. Fork this repository. -2. Create a new directory inside `[integrations](./integrations)` named after +2. Create a new directory inside [integrations](./integrations) named after your organization or integration's name (e.g., `spacexyz`). Make sure the directory has no spaces and uses [kebab-casing](https://wiki.c2.com/?KebabCase). From 69f35ca6bd1af782c021fca8db15ed1ddb53bebc Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Mon, 9 Dec 2019 16:52:27 -0800 Subject: [PATCH 065/936] Minor change --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d79654b9..8df73366 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,9 @@ consume events from LaunchDarkly to provide their users with more context. There are a few steps to creating an integration with LaunchDarkly. 1. Fork this repository. -2. Create a new directory inside [integrations](./integrations) named after - your organization or integration's name (e.g., `spacexyz`). Make sure the - directory has no spaces and uses +2. Create a new directory inside the [integrations](./integrations) directory + named after your organization or integration's name (e.g., `spacexyz`). Make + sure the directory has no spaces and uses [kebab-casing](https://wiki.c2.com/?KebabCase). 3. Create a `manifest.json` inside your new directory. The `manifest.json` file will describe your integration's details and capabilities. We'll describe how @@ -116,7 +116,8 @@ The `formVariables` entry above will yield the following UI inside of the [LaunchDarkly Integration page](https://app.launchdarkly.com/default/integrations): -![Example configuration form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) +![Example configuration +form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) ## Submitting your integrations From f7fc991696e800072c4548d64dd259b8fbeef569 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Mon, 9 Dec 2019 16:53:57 -0800 Subject: [PATCH 066/936] Minor changes --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8df73366..596c108a 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,10 @@ integration's directory that provides additional information about your integration. Your directory can also include additional directories and assets to support your integration -- more on this in the following section. -LaunchDarkly's integration manifest is described through +LaunchDarkly's integration manifest is described through a [schema](./manifest.schema.json). When you submit a pull-request to LaunchDarkly with your new `manifest.json`, your manifest will be validated against this -schema. To aid you in writing your schema, you can register the +schema. To aid you in writing your manifest, you can register the [schema](./manifest.schema.json) in your IDE. If you use [VSCode](https://code.visualstudio.com/) to create your manifest, VSCode will automatically provide you with helpful hints and validate your manifest while From 5a0885867f1e753d959b3e3252058087a6a50aba Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Mon, 9 Dec 2019 16:54:30 -0800 Subject: [PATCH 067/936] Minor change --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 596c108a..ede2e228 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ you edit. ![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) -### Describing your integration basic information through the Manifest +### Describing your integration's basic information through the Manifest A LaunchDarkly integration starts with a `manifest.json` file. This file describes the intent and capabilities of your integration. It also describes From 77231e3c94df4d7f59e3cd579ee807dcc4c10906 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Tue, 10 Dec 2019 11:22:20 -0800 Subject: [PATCH 068/936] Updated README --- README.md | 307 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 256 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index ede2e228..0f2464ad 100644 --- a/README.md +++ b/README.md @@ -8,41 +8,49 @@ into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly to provide their users with more context. -## Getting started: Building an integration - -There are a few steps to creating an integration with LaunchDarkly. - -1. Fork this repository. -2. Create a new directory inside the [integrations](./integrations) directory - named after your organization or integration's name (e.g., `spacexyz`). Make - sure the directory has no spaces and uses - [kebab-casing](https://wiki.c2.com/?KebabCase). -3. Create a `manifest.json` inside your new directory. The `manifest.json` file - will describe your integration's details and capabilities. We'll describe how - to fill out this file in the next section. - -Aside from the `manifest.json` file, you can create a `README.md` inside your -integration's directory that provides additional information about your -integration. Your directory can also include additional directories and assets -to support your integration -- more on this in the following section. - -LaunchDarkly's integration manifest is described through a -[schema](./manifest.schema.json). When you submit a pull-request to LaunchDarkly -with your new `manifest.json`, your manifest will be validated against this -schema. To aid you in writing your manifest, you can register the -[schema](./manifest.schema.json) in your IDE. If you use -[VSCode](https://code.visualstudio.com/) to create your manifest, VSCode will -automatically provide you with helpful hints and validate your manifest while -you edit. +## Getting started -![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) +There are several steps to creating an integration with LaunchDarkly. + +### Step 1: Fork this Repository + +You will need to fork this repository to your own Github account. When you've +completed your integration, you can submit a pull request to LaunchDarkly for it +to get approved and deployed. + +### Step 2: Create a new directory inside `./integrations` + +Create a new directory inside the [integrations](./integrations) directory named +after your organization or integration's name (e.g., `spacexyz`). Make sure the +directory has no spaces and uses [kebab-casing](https://wiki.c2.com/?KebabCase). -### Describing your integration's basic information through the Manifest +You should only change files and directories inside your new directory. Our +validation process will reject any pull requests that attempt to modify content +outside of your directory. + +### Step 3: Create your integration manifest + +Create an empty +[`manifest.json`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#launchdarkly-integrations-manifest-properties)) +file inside your new directory. The `manifest.json` file will describe your +integration's information and capabilities. + +The properties of LaunchDarkly's integration manifest are defined through a +[JSON schema](./manifest.schema.json) and has a [corresponding schema +documentation](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md). +Many IDEs can provide you inline help and validation while editing your +manifest. To enable this you can register the [JSON +schema](./manifest.schema.json) in your IDE. If you use +[VSCode](https://code.visualstudio.com/), VSCode will detect the settings in +this repository and apply the schema validation without any additional +configuration. + +![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) -A LaunchDarkly integration starts with a `manifest.json` file. This file -describes the intent and capabilities of your integration. It also describes -basic information about your organization: +### Step 4: Describe your integration's basic information through the Manifest +The first part of the manifest describes your organization, contacts, URLs, and +a few things we need to list your integration properly: ``` { "name": "Sample Integration", @@ -67,26 +75,40 @@ The example above describes the basic information about your integration. We will use most of the information above when rendering your integration configuration form inside the LaunchDarkly UI. -The `description` property can contain basic -[markdown](https://daringfireball.net/projects/markdown/) and is used in the -LaunchDarkly UI. The schema will validate the formatting of all properties. +There are a few properties in the manifest that can accept simple +[markdown](https://daringfireball.net/projects/markdown/). One of them is the +[`description`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#description). +This markdown format will get converted to HTML in LaunchDarkly's UI. Only use +simple markdown structures like links and basic text formatting. -Notice that the `icons` described above are in SVG format. This is intentional. -Your organization's (or integration's) logo will be used in the LaunchDarkly UI -but also inside a public facing integrations listing on . SVG -files allow your logo to scale nicely on different formats. -### Collecting integration configuration data from LaunchDarkly users +Notice that the +[`icons`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#icons) +described above are in SVG format. This is intentional. Your organization's (or +integration's) logo will be used in the LaunchDarkly UI but also inside a public +facing integrations listing on . SVG files allow your logo to +scale nicely on different formats. We do not accept other formats. + +Also, notice that the `icon.square` and `icon.horizontal` properties point to a +relative path. This path is relative to your integration's directory. You are +free to create any directories and files that support your integration. + +You can also create a `README.md` inside your integration's directory that +provides additional information about your integration. If provided, we may use +your `README.md` as documentation to your integration. + +### Step 5: Collecting integration configuration data from LaunchDarkly users Most integrations will need to collect one or more pieces of configuration data -that supports the integration. Some examples are: +that supports the integration. Some examples include: * API token * Webhook endpoint * URLs -To support these configurations, you can describe a set of `formVariables` that -describe these configuration properties. Here's an example: +To support these configurations, you can describe a set of +[`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) +that define these configuration properties. Here's an example: ``` { @@ -101,8 +123,8 @@ describe these configuration properties. Here's an example: "isSecret": false }, { - "key": "apiKey", - "name": "Honeycomb API Key", + "key": "apiToken", + "name": "API Key", "description": "Enter your [API key](https://example.com/api) here", "type": "string", "isSecret": true @@ -112,19 +134,202 @@ describe these configuration properties. Here's an example: } ``` -The `formVariables` entry above will yield the following UI inside of the -[LaunchDarkly Integration +The +[`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) +entry above will yield the following UI inside of the [LaunchDarkly Integration page](https://app.launchdarkly.com/default/integrations): ![Example configuration form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) -## Submitting your integrations -Once you're done with your integration, send us a pull request. Your branch will -be validated and reviewed by someone on our team. Once everything checks out, -we'll publish your integration. +### Step 6: Define your integration's capabilities + +The third part of defining your LaunchDarkly integration is describing its +[capabilities](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#capabilities). + +As of today, we support only one capability, [Audit Log Event +Hook](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook). +An Audit Log Event Hook is a webhook that's sent by LaunchDarkly whenever an +event happens inside of LaunchDarkly. This capability can be used to trigger an +event in another service. + +Here's an example of an Audit Log Event Hook capability that subscribes to flag +events in a LaunchDarkly account: +``` +{ + ... + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, + "templates": { + "flag": "templates/flag.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } + ... +} +``` +The +[`auditLogEventsHook`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook) +has three properties: + +1. [`endpoint`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#endpoint): + Describes the HTTP handler that will receive the webhook. In the example + above, you'll notice that a few of the properties (`endpoint.url` and + `endpoint.headers[].value`) will accept template variables. These template + variables can reference any `formVariables` you've defined in your manifest. + The templating language we use is based off of + [Handlerbars](https://handlebarsjs.com/) syntax. +2. [`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates): + A map of template paths relative to your integration's directory. These + templates can be any file type. +3. [`defaultPolicy`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#defaultpolicy): + An array of [LaunchDarkly + policies](https://docs.launchdarkly.com/docs/policies-in-custom-roles) that + act as a filter for which events to send to your webhook endpoint. These + policies can be overriden by users subscribing to your integration. + +#### Endpoint template variables + +There are a few properties that allow template variables to be substituted at +runtime. The main ones are the `endpoint.url` and the +`endpoint.headers[].value`. This will allow you to configure a dynamic endpoint +based on the `formVariables` your integration collects from the user. Here are +some examples: +``` +This first example will utilize the `endpointUrl` formVariable as the URL of the endpoint and use the `apiToken` as a `Bearer` token in the `Authorization` header. +... + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, +... + +This next example uses the `apiToken` formVariable as a query parameter on the URL. +... + "endpoint": { + "url": "https://example.com/apiToken?={{apiToken}}", + "method": "POST" + }, +... + +``` + +#### Template files + +Before the `auditLogEventsHook` capability sends the webhook to the endpoint +handling your webhook, you have the option to transform the body of the request +sent to your handler. If you don't provide one or more templates, LaunchDarkly +will send you a default JSON payload that looks like this: +``` +{ + "_links": { + "canonical": { + "href": "/api/v2/flags/always-snippet/example-test", + "type": "application/json" + }, + "parent": { + "href": "/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", + "type": "application/json" + }, + "site": { + "href": "/always-snippet/production/features/example-test", + "type": "text/html" + } + }, + "_id": "5defebd006121dd9f7ea90d0", + "_accountId": "", + "date": 1576004560130, + "kind": "flag", + "name": "Example test", + "description": "", + "shortDescription": "", + "comment": "This is just a test", + "member": { + "_links": { + "parent": { + "href": "/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@example.com", + "firstName": "Henry", + "lastName": "Barrow" + }, + "titleVerb": "", + "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", + "title": "Henrietta Powell turned on the flag Example test in 'Production'", + "target": { + "_links": null, + "name": "" + } +} +``` +However, if you choose to provide one or more +[`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates), +LaunchDarkly will render your template using the context data above. Your +template can be any text based format, but make sure you specify the appropriate +`Content-Type` header in your `endpoint.headers` property to match the content +type of your template body. + +We use basic [Handlerbars](https://handlebarsjs.com/) template syntax to render +your template. Check out [Handlebars' Language +Guide](https://handlebarsjs.com/guide/) for more information on its syntax. In +addition to the basic language syntax, we support the following [built-in +helpers](https://github.com/aymerick/raymond#built-in-helpers): `if`, `unless`, +`each`, `with`, `lookup`, and `equal`. + +To test your templates, you can use the [Handlebars +Sandbox](http://tryhandlebarsjs.com/). + +### Step 7: Submitting your integration + +Once you're done with your integration, [submit a pull request against this +repo](https://github.com/launchdarkly/ld-integrations/pull/new/master). Your +branch will run through some automated validations and reviewed by someone on +our team. Once everything checks out, we'll publish your integration when you +give us the green light. -## Got issues? +## Comments, suggestions, bug reports? Please visit our [support site](https://support.launchdarkly.com/hc/en-us). From 222ebf4930e30ef3d830ae828a0db05993a1d36c Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Tue, 10 Dec 2019 11:28:31 -0800 Subject: [PATCH 069/936] Added link --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0f2464ad..fd90be5c 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,9 @@ There are several steps to creating an integration with LaunchDarkly. ### Step 1: Fork this Repository You will need to fork this repository to your own Github account. When you've -completed your integration, you can submit a pull request to LaunchDarkly for it -to get approved and deployed. +completed your integration, you can [submit a pull request to +LaunchDarkly](#step-7-submitting-your-integration) for it to get approved and +deployed. ### Step 2: Create a new directory inside `./integrations` From 39809c67326e6e5cc736d26dec2837048a7c9347 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Tue, 10 Dec 2019 11:29:58 -0800 Subject: [PATCH 070/936] s/spacexyz/example-dot-com --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fd90be5c..ebf97ad0 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,9 @@ deployed. ### Step 2: Create a new directory inside `./integrations` Create a new directory inside the [integrations](./integrations) directory named -after your organization or integration's name (e.g., `spacexyz`). Make sure the -directory has no spaces and uses [kebab-casing](https://wiki.c2.com/?KebabCase). +after your organization or integration's name (e.g., `example-dot-com`). Make +sure the directory has no spaces and uses +[kebab-casing](https://wiki.c2.com/?KebabCase). You should only change files and directories inside your new directory. Our validation process will reject any pull requests that attempt to modify content From 5d637a0893419e1743b7df0e92235dc1e4de7eab Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Tue, 10 Dec 2019 11:45:22 -0800 Subject: [PATCH 071/936] Adding markdown hints --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ebf97ad0..61eecdd8 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ configuration. ![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) -### Step 4: Describe your integration's basic information through the Manifest +### Step 4: Describe your integration's basic information inside the manifest The first part of the manifest describes your organization, contacts, URLs, and a few things we need to list your integration properly: @@ -144,6 +144,8 @@ page](https://app.launchdarkly.com/default/integrations): ![Example configuration form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) +The `formVariables[].description` will be used as a field label on the UI. You +can use simple markdown to link a word or phrase to an external URL. ### Step 6: Define your integration's capabilities From 47bbc6a00ba6b0036e5be83b694d15ec8e01604d Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Tue, 10 Dec 2019 11:47:14 -0800 Subject: [PATCH 072/936] Fix launchdarkly.com url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61eecdd8..dbfd4005 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Notice that the [`icons`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#icons) described above are in SVG format. This is intentional. Your organization's (or integration's) logo will be used in the LaunchDarkly UI but also inside a public -facing integrations listing on . SVG files allow your logo to +facing integrations listing on launchdarkly.com. SVG files allow your logo to scale nicely on different formats. We do not accept other formats. Also, notice that the `icon.square` and `icon.horizontal` properties point to a From d439a496b3af79ef7431e255b7709c8a116394de Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Tue, 10 Dec 2019 11:48:07 -0800 Subject: [PATCH 073/936] Redo last commit --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dbfd4005..d0efb2bf 100644 --- a/README.md +++ b/README.md @@ -88,8 +88,10 @@ Notice that the [`icons`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#icons) described above are in SVG format. This is intentional. Your organization's (or integration's) logo will be used in the LaunchDarkly UI but also inside a public -facing integrations listing on launchdarkly.com. SVG files allow your logo to -scale nicely on different formats. We do not accept other formats. +facing integrations listing on +[launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG +files allow your logo to scale nicely on different formats. We do not accept +other formats. Also, notice that the `icon.square` and `icon.horizontal` properties point to a relative path. This path is relative to your integration's directory. You are From 266e7f534b9846fef26491ee6884a73a8e212ba2 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Tue, 10 Dec 2019 11:51:18 -0800 Subject: [PATCH 074/936] s/formats/devices --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d0efb2bf..b2b57108 100644 --- a/README.md +++ b/README.md @@ -90,8 +90,8 @@ described above are in SVG format. This is intentional. Your organization's (or integration's) logo will be used in the LaunchDarkly UI but also inside a public facing integrations listing on [launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG -files allow your logo to scale nicely on different formats. We do not accept -other formats. +files allow your logo to scale nicely on different devices. We do not accept +other image formats. Also, notice that the `icon.square` and `icon.horizontal` properties point to a relative path. This path is relative to your integration's directory. You are From 27cebc274e5504b3af5fcef5cc63dc17e3d9822c Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Tue, 10 Dec 2019 11:55:02 -0800 Subject: [PATCH 075/936] Minor changes --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b2b57108..ec584d01 100644 --- a/README.md +++ b/README.md @@ -254,7 +254,7 @@ This next example uses the `apiToken` formVariable as a query parameter on the U #### Template files -Before the `auditLogEventsHook` capability sends the webhook to the endpoint +Before the `auditLogEventsHook` capability sends the request to the endpoint handling your webhook, you have the option to transform the body of the request sent to your handler. If you don't provide one or more templates, LaunchDarkly will send you a default JSON payload that looks like this: @@ -332,9 +332,9 @@ Sandbox](http://tryhandlebarsjs.com/). Once you're done with your integration, [submit a pull request against this repo](https://github.com/launchdarkly/ld-integrations/pull/new/master). Your -branch will run through some automated validations and reviewed by someone on -our team. Once everything checks out, we'll publish your integration when you -give us the green light. +branch will run through some automated validations and will be reviewed by +someone on our team. Once everything checks out, we'll publish your integration +when you give us the green light. ## Comments, suggestions, bug reports? From 997becd7d59969d170565b008b447e773ca02c18 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Tue, 10 Dec 2019 12:08:40 -0800 Subject: [PATCH 076/936] Added slack channel and issues links --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ec584d01..9c580212 100644 --- a/README.md +++ b/README.md @@ -338,4 +338,7 @@ when you give us the green light. ## Comments, suggestions, bug reports? -Please visit our [support site](https://support.launchdarkly.com/hc/en-us). +Visit us in our Slack channel +[#ext-integrations](https://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQhttps://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQ) +or log an issue or request +[here](https://github.com/launchdarkly/ld-integrations/issues). From 8e62c978f973aeef9323c8acf736c11cd8ec3b85 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 11 Dec 2019 13:27:57 -0800 Subject: [PATCH 077/936] [ch58770] Make `capabilities` optional --- MANIFEST.md | 4 ++-- .../learn-more-only-integration/README.md | 1 + .../learn-more-only-integration/manifest.json | 17 +++++++++++++++++ manifest.schema.json | 6 ++---- 4 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 integrations/learn-more-only-integration/README.md create mode 100644 integrations/learn-more-only-integration/manifest.json diff --git a/MANIFEST.md b/MANIFEST.md index fb4a9eb7..cd18c0b7 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -15,7 +15,7 @@ Describes the capabilities and intent of a LaunchDarkly integration | Property | Type | Required | Nullable | Default | Defined by | | ------------------------------- | ---------- | ------------ | -------- | ------- | ------------------------------------------------ | | [author](#author) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | -| [capabilities](#capabilities) | `object` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | +| [capabilities](#capabilities) | `object` | Optional | No | | LaunchDarkly Integrations Manifest (this schema) | | [categories](#categories) | `enum[]` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | | [description](#description) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | | [formVariables](#formvariables) | `object[]` | Optional | No | `[]` | LaunchDarkly Integrations Manifest (this schema) | @@ -58,7 +58,7 @@ Specify which capabilities you'd like your integration to have `capabilities` -- is **required** +- is optional - type: `object` - defined in this schema diff --git a/integrations/learn-more-only-integration/README.md b/integrations/learn-more-only-integration/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/learn-more-only-integration/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/learn-more-only-integration/manifest.json b/integrations/learn-more-only-integration/manifest.json new file mode 100644 index 00000000..0e8d024c --- /dev/null +++ b/integrations/learn-more-only-integration/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Learn More-only Integration", + "version": "1.0.0", + "overview": "Short one-liner describing your integration", + "description": "Send flag data to space. Markdown based description.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/manifest.schema.json b/manifest.schema.json index 10b0bd43..7542cc2a 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -536,8 +536,7 @@ "templates" ] } - }, - "minProperties": 1 + } } }, "required": [ @@ -549,7 +548,6 @@ "supportEmail", "links", "categories", - "icons", - "capabilities" + "icons" ] } \ No newline at end of file From 916f4cf72a4fb18dc8c1172bbad86e5ce64ad234 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 11 Dec 2019 13:28:13 -0800 Subject: [PATCH 078/936] Updating CI job to only deploy on master --- .circleci/config.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6321858f..90fbfcfb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,6 +24,19 @@ jobs: - run: name: Run tests command: yarn test - - aws-cli/install + deploy: + - aws-cli/install + - deploy: + command: ./scripts/copy_to_s3.sh + +workflows: + version: 2.1 + build-and-deploy: + jobs: + - build - deploy: - command: ./scripts/copy_to_s3.sh + requires: + - build + filters: + branches: + only: master \ No newline at end of file From 727ccc1a3c5b0ec76c48043f4f8457d1010b61a2 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 11 Dec 2019 13:34:30 -0800 Subject: [PATCH 079/936] remove extra closing paren --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c580212..7cd92246 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ outside of your directory. ### Step 3: Create your integration manifest Create an empty -[`manifest.json`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#launchdarkly-integrations-manifest-properties)) +[`manifest.json`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#launchdarkly-integrations-manifest-properties) file inside your new directory. The `manifest.json` file will describe your integration's information and capabilities. From d0a61e7ad3ef8d3f33305b78f2d6baf7b4fdef74 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 11 Dec 2019 13:34:38 -0800 Subject: [PATCH 080/936] Updated CI --- .circleci/config.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 90fbfcfb..b7f66249 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,9 +25,13 @@ jobs: name: Run tests command: yarn test deploy: - - aws-cli/install - - deploy: - command: ./scripts/copy_to_s3.sh + machine: + enabled: true + steps: + - checkout + - aws-cli/install + - deploy: + command: ./scripts/copy_to_s3.sh workflows: version: 2.1 From c6e53fc7574ee0a6869bcdc632ab3c29fa15a58a Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 11 Dec 2019 16:20:18 -0800 Subject: [PATCH 081/936] Add msteams template --- integrations/msteams/templates/template.json | 38 +++++++------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/integrations/msteams/templates/template.json b/integrations/msteams/templates/template.json index 1345cdac..7b414454 100644 --- a/integrations/msteams/templates/template.json +++ b/integrations/msteams/templates/template.json @@ -1,27 +1,13 @@ { - "@type": "MessageCard", - "@context": "https://schema.org/extensions", - "correlationId": "{{reqid}}", - "summary": "{{summary}}", - "themeColor": "{{env.color}}", - "sections": [ - { - "activityTitle": "**{{actor.name}}** {{action.verb}} [{{action.target.name}}]({{action.target.url}})", - {{#if comment}} - "text": "> {{comment}}", - {{/if}} - {{#if updates}} - "facts": [ - {{#each updates.details}} - {{#equal this.type "update"}} - { - "name": "", - "value": "* {{this.verb}} {{#if this.oldValue}}**{{this.oldValue}}** to {{/if}}**{{this.newValue}}**" - }, - {{/equal}} - {{/each}} - ] - {{/if}} - } - ] -} \ No newline at end of file + "@type": "MessageCard", + "@context": "http://schema.org/extensions", + "themeColor": "0076D7", + "summary": "{{title}}", + "sections": [ + { + "activityTitle": "{{markdownTitle}}", + "text": "{{#if comment}}> {{comment}}\n{{/if}}{{#if description}}{{description}}{{/if}}", + "markdown": true + } + ] +} From 493544776e2bc03e08c2ed281eae73ad7de1968e Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 12 Dec 2019 10:10:25 -0800 Subject: [PATCH 082/936] Adding image assets for learn more example --- .../learn-more-only-integration/assets/images/horizontal.svg | 5 +++++ .../learn-more-only-integration/assets/images/square.svg | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 integrations/learn-more-only-integration/assets/images/horizontal.svg create mode 100644 integrations/learn-more-only-integration/assets/images/square.svg diff --git a/integrations/learn-more-only-integration/assets/images/horizontal.svg b/integrations/learn-more-only-integration/assets/images/horizontal.svg new file mode 100644 index 00000000..9a3b9639 --- /dev/null +++ b/integrations/learn-more-only-integration/assets/images/horizontal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/learn-more-only-integration/assets/images/square.svg b/integrations/learn-more-only-integration/assets/images/square.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/learn-more-only-integration/assets/images/square.svg @@ -0,0 +1,4 @@ + + + + From 649071d87c3f13ec80ba2bbef32a92f0456552e7 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 12 Dec 2019 13:42:07 -0800 Subject: [PATCH 083/936] jira folder added and jira manifest changed. --- integrations/jira/README.md | 1 + integrations/jira/assets/images/horizontal.svg | 5 +++++ integrations/jira/assets/images/square.svg | 4 ++++ integrations/jira/manifest.json | 17 +++++++++++++++++ 4 files changed, 27 insertions(+) create mode 100644 integrations/jira/README.md create mode 100644 integrations/jira/assets/images/horizontal.svg create mode 100644 integrations/jira/assets/images/square.svg create mode 100644 integrations/jira/manifest.json diff --git a/integrations/jira/README.md b/integrations/jira/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/jira/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/jira/assets/images/horizontal.svg b/integrations/jira/assets/images/horizontal.svg new file mode 100644 index 00000000..9a3b9639 --- /dev/null +++ b/integrations/jira/assets/images/horizontal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/jira/assets/images/square.svg b/integrations/jira/assets/images/square.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/jira/assets/images/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json new file mode 100644 index 00000000..c0d3b017 --- /dev/null +++ b/integrations/jira/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Jira", + "version": "1.0.0", + "overview": "Short one-liner describing your integration", + "description": "Send flag data to space. Markdown based description.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/jira", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} From 38b1688d41954e32de5a1768619588aebfb6460d Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Thu, 12 Dec 2019 13:45:08 -0800 Subject: [PATCH 084/936] initialize prometheus integration --- integrations/prometheus-pushgateway/README.md | 1 + .../assets/images/horizontal.svg | 5 +++++ .../assets/images/square.svg | 4 ++++ .../prometheus-pushgateway/manifest.json | 17 +++++++++++++++++ 4 files changed, 27 insertions(+) create mode 100644 integrations/prometheus-pushgateway/README.md create mode 100644 integrations/prometheus-pushgateway/assets/images/horizontal.svg create mode 100644 integrations/prometheus-pushgateway/assets/images/square.svg create mode 100644 integrations/prometheus-pushgateway/manifest.json diff --git a/integrations/prometheus-pushgateway/README.md b/integrations/prometheus-pushgateway/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/prometheus-pushgateway/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/prometheus-pushgateway/assets/images/horizontal.svg b/integrations/prometheus-pushgateway/assets/images/horizontal.svg new file mode 100644 index 00000000..9a3b9639 --- /dev/null +++ b/integrations/prometheus-pushgateway/assets/images/horizontal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/prometheus-pushgateway/assets/images/square.svg b/integrations/prometheus-pushgateway/assets/images/square.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/prometheus-pushgateway/assets/images/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json new file mode 100644 index 00000000..0e8d024c --- /dev/null +++ b/integrations/prometheus-pushgateway/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Learn More-only Integration", + "version": "1.0.0", + "overview": "Short one-liner describing your integration", + "description": "Send flag data to space. Markdown based description.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} From 298d2347a34586af7b5272b515d40051d11c9ba1 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 12 Dec 2019 13:55:11 -0800 Subject: [PATCH 085/936] added svg --- integrations/jira/assets/images/horizontal.svg | 6 +----- integrations/jira/assets/images/square.svg | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/integrations/jira/assets/images/horizontal.svg b/integrations/jira/assets/images/horizontal.svg index 9a3b9639..f97d510b 100644 --- a/integrations/jira/assets/images/horizontal.svg +++ b/integrations/jira/assets/images/horizontal.svg @@ -1,5 +1 @@ - - - - - +Jira Software-blue \ No newline at end of file diff --git a/integrations/jira/assets/images/square.svg b/integrations/jira/assets/images/square.svg index 799ca37f..e2b9421e 100644 --- a/integrations/jira/assets/images/square.svg +++ b/integrations/jira/assets/images/square.svg @@ -1,4 +1,15 @@ - - - + + + + + + + + + + + + + + From 49127a2202f1432060cf2009d4361b3ad37390f7 Mon Sep 17 00:00:00 2001 From: azimman Date: Thu, 12 Dec 2019 14:15:11 -0800 Subject: [PATCH 086/936] Terraform pointer learn more integration pointer --- integrations/terraform/README.md | 2 ++ .../terraform/assets/images/horizontal.svg | 5 +++++ .../terraform/assets/images/square.svg | 4 ++++ .../assets/images/terraform_horizontal.svg | 1 + .../assets/images/terraform_square.svg | 1 + integrations/terraform/manifest.json | 18 ++++++++++++++++++ 6 files changed, 31 insertions(+) create mode 100644 integrations/terraform/README.md create mode 100644 integrations/terraform/assets/images/horizontal.svg create mode 100644 integrations/terraform/assets/images/square.svg create mode 100644 integrations/terraform/assets/images/terraform_horizontal.svg create mode 100644 integrations/terraform/assets/images/terraform_square.svg create mode 100644 integrations/terraform/manifest.json diff --git a/integrations/terraform/README.md b/integrations/terraform/README.md new file mode 100644 index 00000000..7efd6b3e --- /dev/null +++ b/integrations/terraform/README.md @@ -0,0 +1,2 @@ +Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more. + \ No newline at end of file diff --git a/integrations/terraform/assets/images/horizontal.svg b/integrations/terraform/assets/images/horizontal.svg new file mode 100644 index 00000000..9a3b9639 --- /dev/null +++ b/integrations/terraform/assets/images/horizontal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/terraform/assets/images/square.svg b/integrations/terraform/assets/images/square.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/terraform/assets/images/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/terraform/assets/images/terraform_horizontal.svg b/integrations/terraform/assets/images/terraform_horizontal.svg new file mode 100644 index 00000000..36d1c31a --- /dev/null +++ b/integrations/terraform/assets/images/terraform_horizontal.svg @@ -0,0 +1 @@ +Asset 1 \ No newline at end of file diff --git a/integrations/terraform/assets/images/terraform_square.svg b/integrations/terraform/assets/images/terraform_square.svg new file mode 100644 index 00000000..ae1d4a17 --- /dev/null +++ b/integrations/terraform/assets/images/terraform_square.svg @@ -0,0 +1 @@ +Asset 1 \ No newline at end of file diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json new file mode 100644 index 00000000..590b9dea --- /dev/null +++ b/integrations/terraform/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "LaunchDarkly Terraform Provider", + "version": "1.0.0", + "overview": "Terraform provider for LaunchDarkly", + "description": "Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "LaunchDarkly Docs": "https://docs.launchdarkly.com/docs/terraform", + "Terraform Docs": "https://www.terraform.io/docs/providers/launchdarkly/index.html", + "Launchdarkly Terraform Guide": "https://launchdarkly.com/blog/managing-feature-flags-with-terraform/" + }, + "categories": ["provisioning"], + "icons": { + "square": "assets/images/terraform_square.svg", + "horizontal": "assets/images/terraform_horizontal.svg" + } +} From dfca3be1a7ad60f1c88e2524c546990589872a05 Mon Sep 17 00:00:00 2001 From: azimman Date: Thu, 12 Dec 2019 14:29:18 -0800 Subject: [PATCH 087/936] fixing links in manifest --- integrations/terraform/README.md | 3 +-- integrations/terraform/assets/images/horizontal.svg | 5 ----- integrations/terraform/assets/images/square.svg | 4 ---- integrations/terraform/manifest.json | 6 +++--- 4 files changed, 4 insertions(+), 14 deletions(-) delete mode 100644 integrations/terraform/assets/images/horizontal.svg delete mode 100644 integrations/terraform/assets/images/square.svg diff --git a/integrations/terraform/README.md b/integrations/terraform/README.md index 7efd6b3e..f3af4ae2 100644 --- a/integrations/terraform/README.md +++ b/integrations/terraform/README.md @@ -1,2 +1 @@ -Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more. - \ No newline at end of file +Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more. \ No newline at end of file diff --git a/integrations/terraform/assets/images/horizontal.svg b/integrations/terraform/assets/images/horizontal.svg deleted file mode 100644 index 9a3b9639..00000000 --- a/integrations/terraform/assets/images/horizontal.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/integrations/terraform/assets/images/square.svg b/integrations/terraform/assets/images/square.svg deleted file mode 100644 index 799ca37f..00000000 --- a/integrations/terraform/assets/images/square.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index 590b9dea..56f0b9da 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -6,9 +6,9 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "LaunchDarkly Docs": "https://docs.launchdarkly.com/docs/terraform", - "Terraform Docs": "https://www.terraform.io/docs/providers/launchdarkly/index.html", - "Launchdarkly Terraform Guide": "https://launchdarkly.com/blog/managing-feature-flags-with-terraform/" + "supportWebsite": "https://docs.launchdarkly.com/docs/terraform", + "site": "https://www.terraform.io/docs/providers/launchdarkly/index.html", + "privacyPolicy": "https://app.terraform.io/pages/privacy" }, "categories": ["provisioning"], "icons": { From fbd4835be21869f04d6ee70c7839be4ca10e2531 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 12 Dec 2019 14:48:28 -0800 Subject: [PATCH 088/936] Added a pre-commit hook --- .pre-commit-config.yaml | 18 ++++++++++++++++++ package.json | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..0b1f94ed --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,18 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.4.0 + hooks: + - id: check-merge-conflict + - id: check-json + exclude: "\\.vscode/launch.json" + - id: check-symlinks + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-added-large-files + - repo: local + hooks: + - id: validate-manifests + name: Validate manifests + entry: yarn run test-single + language: system + files: "integrations/.*manifest.json" diff --git a/package.json b/package.json index 7e2eaba6..97036286 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md", - "test": "ajv test -s manifest.schema.json -d **/manifest.json --valid --errors=json" + "test": "ajv test -s manifest.schema.json -d **/manifest.json --valid --errors=json", + "test-single": "ajv test --valid --errors=json -s manifest.schema.json -d" }, "repository": { "type": "git", From a991d1b2127f93bf25776511a31af3507cd8f771 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 12 Dec 2019 14:49:47 -0800 Subject: [PATCH 089/936] Added pre-commit install --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 97036286..c38214c1 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", "main": "index.js", "scripts": { + "preinstall": "pre-commit install", "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md", "test": "ajv test -s manifest.schema.json -d **/manifest.json --valid --errors=json", "test-single": "ajv test --valid --errors=json -s manifest.schema.json -d" From 3337ab021db6a59dff4b4f83474f56a51f466000 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 12 Dec 2019 15:23:23 -0800 Subject: [PATCH 090/936] Added jira description --- integrations/jira/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index c0d3b017..a19c9a49 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -1,8 +1,8 @@ { "name": "Jira", "version": "1.0.0", - "overview": "Short one-liner describing your integration", - "description": "Send flag data to space. Markdown based description.", + "overview": "LaunchDarkly's Jira add-on allows you to link your feature flags with your team's Jira issues.", + "description": "When a feature flag is turned on, off, or has its targeting rules update, its associated Jira issue pages display the flag's current status.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 0636ea592b980df6e423f12aed0b7cda110b26ff Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 15:27:59 -0800 Subject: [PATCH 091/936] adding logdna integration --- integrations/logdna/README.md | 1 + .../logdna/assets/images/horizontal.svg | 5 ++ integrations/logdna/assets/images/square.svg | 4 + integrations/logdna/manifest.json | 73 +++++++++++++++++++ integrations/logdna/templates/template.json | 10 +++ 5 files changed, 93 insertions(+) create mode 100644 integrations/logdna/README.md create mode 100644 integrations/logdna/assets/images/horizontal.svg create mode 100644 integrations/logdna/assets/images/square.svg create mode 100644 integrations/logdna/manifest.json create mode 100644 integrations/logdna/templates/template.json diff --git a/integrations/logdna/README.md b/integrations/logdna/README.md new file mode 100644 index 00000000..985546e6 --- /dev/null +++ b/integrations/logdna/README.md @@ -0,0 +1 @@ +Some LogDNA readme text will go here. \ No newline at end of file diff --git a/integrations/logdna/assets/images/horizontal.svg b/integrations/logdna/assets/images/horizontal.svg new file mode 100644 index 00000000..9a3b9639 --- /dev/null +++ b/integrations/logdna/assets/images/horizontal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/logdna/assets/images/square.svg b/integrations/logdna/assets/images/square.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/logdna/assets/images/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json new file mode 100644 index 00000000..abbbeb12 --- /dev/null +++ b/integrations/logdna/manifest.json @@ -0,0 +1,73 @@ +{ + "name": "LogDNA", + "version": "1.0.0", + "overview": "Send audit log events to LogDNA", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to LogDNA.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["monitoring", "alerts"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "ingestionKey", + "name": "LogDNA ingestion key", + "description": "Enter your [LogDNA ingestion key](https://app.logdna.com/manage/profile) here", + "type": "string", + "isSecret": true + }, + { + "key": "app", + "name": "App", + "description": "Enter the App for which events are being generated. If you have multiple apps using LaunchDarkly, you might want to change this to include your LaunchDarkly project name.", + "type": "string", + "isSecret": false, + "defaultValue": "LaunchDarkly" + }, + { + "key": "hostname", + "name": "Hostname", + "description": "Enter the hostname from which events are being generated. For most customers the default value is correct.", + "type": "string", + "isSecret": false, + "defaultValue": "app.launchdarkly.com" + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "https://logs.logdna.com/logs/ingest?hostname={{hostname}}", + "method": "POST", + "headers": [ + { + "name": "apikey", + "value": "{{ingestionKey}}" + }, + { + "name": "Content-Type", + "value": "application/json; charset=UTF-8" + } + ] + }, + "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json new file mode 100644 index 00000000..618a6794 --- /dev/null +++ b/integrations/logdna/templates/template.json @@ -0,0 +1,10 @@ +{ + "lines": [ + { + "line":"{{title}}", + "app":"test-app", + "level": "INFO", + "env": "production" + } + ] + } \ No newline at end of file From 142993324daf0cdeb9fe44c90e08e7860d8034b1 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 15:38:38 -0800 Subject: [PATCH 092/936] fix logdna escaping issue --- integrations/logdna/templates/template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json index 618a6794..3c2b9385 100644 --- a/integrations/logdna/templates/template.json +++ b/integrations/logdna/templates/template.json @@ -1,7 +1,7 @@ { "lines": [ { - "line":"{{title}}", + "line":"{{{title}}}", "app":"test-app", "level": "INFO", "env": "production" From 1010425385522004b0065489c05090b601da1948 Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Thu, 12 Dec 2019 15:42:34 -0800 Subject: [PATCH 093/936] populate prometheus integration --- .../assets/images/horizontal.svg | 5 -- .../assets/images/prometheus-square.svg | 50 +++++++++++++++++++ .../assets/images/square.svg | 4 -- .../prometheus-pushgateway/manifest.json | 43 ++++++++++++---- .../prometheus-pushgateway/templates/template | 3 ++ 5 files changed, 87 insertions(+), 18 deletions(-) delete mode 100644 integrations/prometheus-pushgateway/assets/images/horizontal.svg create mode 100644 integrations/prometheus-pushgateway/assets/images/prometheus-square.svg delete mode 100644 integrations/prometheus-pushgateway/assets/images/square.svg create mode 100644 integrations/prometheus-pushgateway/templates/template diff --git a/integrations/prometheus-pushgateway/assets/images/horizontal.svg b/integrations/prometheus-pushgateway/assets/images/horizontal.svg deleted file mode 100644 index 9a3b9639..00000000 --- a/integrations/prometheus-pushgateway/assets/images/horizontal.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/integrations/prometheus-pushgateway/assets/images/prometheus-square.svg b/integrations/prometheus-pushgateway/assets/images/prometheus-square.svg new file mode 100644 index 00000000..5c51f66d --- /dev/null +++ b/integrations/prometheus-pushgateway/assets/images/prometheus-square.svg @@ -0,0 +1,50 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/integrations/prometheus-pushgateway/assets/images/square.svg b/integrations/prometheus-pushgateway/assets/images/square.svg deleted file mode 100644 index 799ca37f..00000000 --- a/integrations/prometheus-pushgateway/assets/images/square.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index 0e8d024c..442cbf85 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -1,17 +1,42 @@ { - "name": "Learn More-only Integration", - "version": "1.0.0", - "overview": "Short one-liner describing your integration", - "description": "Send flag data to space. Markdown based description.", + "name": "Prometheus Pushgateway", + "version": "0.0.1", + "overview": "Sends events to a Prometheus Pushgateway", + "description": "Sends events to a Prometheus Pushgateway or other endpoint that speaks the Prometheus line protocol.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" + "site": "https://prometheus.io", + "privacyPolicy": "https://prometheus.io" }, - "categories": ["apm", "monitoring", "alerts"], + "categories": ["monitoring"], "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" + "square": "assets/images/prometheus-square.svg", + "horizontal": "assets/images/prometheus-square.svg" + }, + "formVariables": [ + { + "key": "metricsUrl", + "name": "Metrics URL", + "description": "The URL to which Launch Darkly should POST metrics", + "placeholder": "http://pushgateway.example.org:9091/metrics/job/launch_darkly", + "type": "uri", + "isSecret": false + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [] + }, + "templates": { + "flag": "templates/template", + "project": "templates/template", + "environment": "templates/template", + "metric": "templates/template" + } + } } } diff --git a/integrations/prometheus-pushgateway/templates/template b/integrations/prometheus-pushgateway/templates/template new file mode 100644 index 00000000..18bf1c31 --- /dev/null +++ b/integrations/prometheus-pushgateway/templates/template @@ -0,0 +1,3 @@ +# HELP launchdarkly_object_update_ms Help string goes here +# TYPE launchdarkly_object_update_ms gauge +launchdarkly_object_update_ms{kind="{{ kind }}", name="{{ name }}"} {{ date }} From 63455354134fe9f16b731bcb08344905fdfa6ee7 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 12 Dec 2019 16:08:20 -0800 Subject: [PATCH 094/936] honeycomb edits --- integrations/honeycomb/manifest.json | 2 +- integrations/honeycomb/templates/flag.json | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 2208faa3..8657408b 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -33,7 +33,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "{{url}}", + "url": "https://api.honeycomb.io/1/markers/{{datasetName}}", "method": "POST", "headers": [ { diff --git a/integrations/honeycomb/templates/flag.json b/integrations/honeycomb/templates/flag.json index 670a3fac..d1d9b70f 100644 --- a/integrations/honeycomb/templates/flag.json +++ b/integrations/honeycomb/templates/flag.json @@ -1,6 +1,4 @@ { - "start_time": {{actionDttm}}, - "message": "{{summary}}", - "type": "{{action}}", - "url": "{{url}}" + "message": "{{title}}", + "type": "LaunchDarkly" } \ No newline at end of file From 06f25229d3d547ff0d8862cc39f273ee3121a34f Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Thu, 12 Dec 2019 16:09:17 -0800 Subject: [PATCH 095/936] add empty policy to prometheus integration --- integrations/prometheus-pushgateway/manifest.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index 442cbf85..0e6fbe32 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -36,7 +36,8 @@ "project": "templates/template", "environment": "templates/template", "metric": "templates/template" - } + }, + "defaultPolicy": [] } } } From 45388f06be6f7a6b433bc04976c1e49ec6af3665 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 16:09:31 -0800 Subject: [PATCH 096/936] jira add-on => jira app --- integrations/jira/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index a19c9a49..4d3f4ed2 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -1,7 +1,7 @@ { - "name": "Jira", + "name": "Jira Cloud", "version": "1.0.0", - "overview": "LaunchDarkly's Jira add-on allows you to link your feature flags with your team's Jira issues.", + "overview": "LaunchDarkly's Jira app allows you to link your feature flags with your team's Jira issues.", "description": "When a feature flag is turned on, off, or has its targeting rules update, its associated Jira issue pages display the flag's current status.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", From e842bb81e907059cd5dc862edb04522ca12a26f2 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 16:14:45 -0800 Subject: [PATCH 097/936] terraform rewording --- integrations/terraform/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index 56f0b9da..e75b54a3 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -1,7 +1,7 @@ { - "name": "LaunchDarkly Terraform Provider", + "name": "Terraform Provider", "version": "1.0.0", - "overview": "Terraform provider for LaunchDarkly", + "overview": "Manage your LaunchDarkly resources as Terraform resources.", "description": "Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", From 2f55a1abdeded3b483cd84a2a75ee7189b9b6552 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 12 Dec 2019 16:22:34 -0800 Subject: [PATCH 098/936] added url to flag. Honeycomb --- integrations/honeycomb/templates/flag.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/honeycomb/templates/flag.json b/integrations/honeycomb/templates/flag.json index d1d9b70f..3229167f 100644 --- a/integrations/honeycomb/templates/flag.json +++ b/integrations/honeycomb/templates/flag.json @@ -1,4 +1,5 @@ { "message": "{{title}}", - "type": "LaunchDarkly" + "type": "LaunchDarkly", + "url": "https://ld-stg.launchdarkly.com{{_links.site.href}}" } \ No newline at end of file From f31243bd089032e0751f79ee5a846622c9d76bb1 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 16:26:13 -0800 Subject: [PATCH 099/936] add comment to logdna --- integrations/logdna/templates/template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json index 3c2b9385..40134f15 100644 --- a/integrations/logdna/templates/template.json +++ b/integrations/logdna/templates/template.json @@ -1,7 +1,7 @@ { "lines": [ { - "line":"{{{title}}}", + "line":"{{{title}}}{{/if}}{{#if comment}}, Comment: {{comment}}{{/if}}", "app":"test-app", "level": "INFO", "env": "production" From 3c742f1f6bf2ee3a300a8b0370ea0d0324bdb462 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 12 Dec 2019 16:28:16 -0800 Subject: [PATCH 100/936] tripple bracket to fix html escaping --- integrations/honeycomb/templates/flag.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/honeycomb/templates/flag.json b/integrations/honeycomb/templates/flag.json index 3229167f..1433f02d 100644 --- a/integrations/honeycomb/templates/flag.json +++ b/integrations/honeycomb/templates/flag.json @@ -1,5 +1,5 @@ { - "message": "{{title}}", + "message": "{{{title}}}", "type": "LaunchDarkly", "url": "https://ld-stg.launchdarkly.com{{_links.site.href}}" } \ No newline at end of file From 25e9f6accbe07b2c7772b2ac1475175323728838 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 16:34:42 -0800 Subject: [PATCH 101/936] fix logdna comment inclusion --- integrations/logdna/templates/template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json index 40134f15..d82669b8 100644 --- a/integrations/logdna/templates/template.json +++ b/integrations/logdna/templates/template.json @@ -1,7 +1,7 @@ { "lines": [ { - "line":"{{{title}}}{{/if}}{{#if comment}}, Comment: {{comment}}{{/if}}", + "line":"{{{title}}}{{if}}{{#if comment}}, Comment: {{comment}}{{/if}}", "app":"test-app", "level": "INFO", "env": "production" From 76b8e8bac6044766b6a2d4161d174883a5d6c151 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 16:35:49 -0800 Subject: [PATCH 102/936] fix logdna comment inclusion --- integrations/logdna/templates/template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json index d82669b8..5a115d47 100644 --- a/integrations/logdna/templates/template.json +++ b/integrations/logdna/templates/template.json @@ -1,7 +1,7 @@ { "lines": [ { - "line":"{{{title}}}{{if}}{{#if comment}}, Comment: {{comment}}{{/if}}", + "line":"{{{title}}}{{#if comment}}, Comment: {{comment}}{{/if}}", "app":"test-app", "level": "INFO", "env": "production" From e3719b5c19e749a2d5226452c4f430358668ca64 Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Thu, 12 Dec 2019 16:40:35 -0800 Subject: [PATCH 103/936] fix endpoint url for prometheus --- integrations/prometheus-pushgateway/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index 0e6fbe32..0797c370 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -27,7 +27,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "{{endpointUrl}}", + "url": "{{metricsUrl}}", "method": "POST", "headers": [] }, From c28f544b884a363679b7c3a543b50a58dd8ad48d Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 16:48:26 -0800 Subject: [PATCH 104/936] logdna logos --- integrations/logdna/assets/images/horizontal.svg | 14 ++++++++++---- integrations/logdna/assets/images/square.svg | 5 ++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/integrations/logdna/assets/images/horizontal.svg b/integrations/logdna/assets/images/horizontal.svg index 9a3b9639..bbf43552 100644 --- a/integrations/logdna/assets/images/horizontal.svg +++ b/integrations/logdna/assets/images/horizontal.svg @@ -1,5 +1,11 @@ - - - - + + + + + + + + + + diff --git a/integrations/logdna/assets/images/square.svg b/integrations/logdna/assets/images/square.svg index 799ca37f..9020a91c 100644 --- a/integrations/logdna/assets/images/square.svg +++ b/integrations/logdna/assets/images/square.svg @@ -1,4 +1,3 @@ - - - + + From e56043c2f423eaf422fd171e2afe728a24af4d3c Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 17:10:14 -0800 Subject: [PATCH 105/936] adding punctuation --- integrations/logdna/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index abbbeb12..7c32ff1e 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -18,7 +18,7 @@ { "key": "ingestionKey", "name": "LogDNA ingestion key", - "description": "Enter your [LogDNA ingestion key](https://app.logdna.com/manage/profile) here", + "description": "Enter your [LogDNA ingestion key](https://app.logdna.com/manage/profile) here.", "type": "string", "isSecret": true }, From 01a4b2992865f060c7e3abd0c28608fec1a2c0c2 Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Thu, 12 Dec 2019 17:17:22 -0800 Subject: [PATCH 106/936] prometheus - use instance tag to bucket flags --- integrations/prometheus-pushgateway/manifest.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index 0797c370..4a2d8421 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -19,15 +19,23 @@ "key": "metricsUrl", "name": "Metrics URL", "description": "The URL to which Launch Darkly should POST metrics", - "placeholder": "http://pushgateway.example.org:9091/metrics/job/launch_darkly", + "placeholder": "http://pushgateway.example.org:9091/metrics", "type": "uri", "isSecret": false + }, + { + "key": "jobName", + "name": "Job Name", + "description": "The name of the job label to be applied to exported metrics", + "defaultValue": "launchdarkly", + "type": "string", + "isSecret": false } ], "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "{{metricsUrl}}", + "url": "{{ metricsUrl }}/job/{{ jobName }}/instance/{{ kind }}:{{ name }}", "method": "POST", "headers": [] }, From 0be53ccc23606dbf635f177026b1f74f143c45bb Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 12 Dec 2019 17:41:18 -0800 Subject: [PATCH 107/936] Add dynatrace --- integrations/dynatrace/LICENSE.md | 13 ++++ integrations/dynatrace/README.md | 0 integrations/dynatrace/assets/horizontal.svg | 5 ++ integrations/dynatrace/assets/square.svg | 4 ++ integrations/dynatrace/manifest.json | 62 +++++++++++++++++++ .../dynatrace/templates/template.json | 19 ++++++ 6 files changed, 103 insertions(+) create mode 100644 integrations/dynatrace/LICENSE.md create mode 100644 integrations/dynatrace/README.md create mode 100644 integrations/dynatrace/assets/horizontal.svg create mode 100644 integrations/dynatrace/assets/square.svg create mode 100644 integrations/dynatrace/manifest.json create mode 100644 integrations/dynatrace/templates/template.json diff --git a/integrations/dynatrace/LICENSE.md b/integrations/dynatrace/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/dynatrace/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/dynatrace/README.md b/integrations/dynatrace/README.md new file mode 100644 index 00000000..e69de29b diff --git a/integrations/dynatrace/assets/horizontal.svg b/integrations/dynatrace/assets/horizontal.svg new file mode 100644 index 00000000..9a3b9639 --- /dev/null +++ b/integrations/dynatrace/assets/horizontal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/dynatrace/assets/square.svg b/integrations/dynatrace/assets/square.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/dynatrace/assets/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json new file mode 100644 index 00000000..950b062c --- /dev/null +++ b/integrations/dynatrace/manifest.json @@ -0,0 +1,62 @@ +{ + "name": "Dynatrace", + "version": "1.0.0", + "overview": "Send audit log events to Dynatrace", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Dynatrace.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/msteams", + "privacyPolicy": "https://privacy.microsoft.com/en-us" + }, + "categories": ["monitoring", "alerts", "apm"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + { + "key": "apiToken", + "name": "ApiToken", + "type": "string", + "description": "Your Dynatrace API token. The 'access problem and event feed, metrics, and topology' scope is required", + "isSecret": true + }, + { + "key": "url", + "name": "Dynatrace URL", + "type": "uri", + "description": "Your Dynatrace URL (Managed or SaaS)", + "placeholder": "https://{your-environment-id}.live.dynatrace.com", + "isSecret": false + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{url}}//api/v1/events", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Api-Token {{apiToken}}" + } + ] + }, + "templates": { + "flag": "templates/template.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/dynatrace/templates/template.json b/integrations/dynatrace/templates/template.json new file mode 100644 index 00000000..fdbbc6ae --- /dev/null +++ b/integrations/dynatrace/templates/template.json @@ -0,0 +1,19 @@ +{ + "eventType": "CUSTOM_ANNOTATION", + "attachRules": { + "tagRule": [ + { + "meTypes": ["APPLICATION"], + "tags": [ + { + "context": "CONTEXTLESS", + "key": "LaunchDarkly" + } + ] + } + ] + }, + "source": "LaunchDarkly", + "annotationType": "Feature flag", + "annotationDescription": "{{{title}}}" +} From 89bbfe2075bd968928245ab322c50f206a929cbe Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Thu, 12 Dec 2019 17:46:48 -0800 Subject: [PATCH 108/936] Revert "prometheus - use instance tag to bucket flags" This reverts commit 01a4b2992865f060c7e3abd0c28608fec1a2c0c2. --- integrations/prometheus-pushgateway/manifest.json | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index 4a2d8421..0797c370 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -19,23 +19,15 @@ "key": "metricsUrl", "name": "Metrics URL", "description": "The URL to which Launch Darkly should POST metrics", - "placeholder": "http://pushgateway.example.org:9091/metrics", + "placeholder": "http://pushgateway.example.org:9091/metrics/job/launch_darkly", "type": "uri", "isSecret": false - }, - { - "key": "jobName", - "name": "Job Name", - "description": "The name of the job label to be applied to exported metrics", - "defaultValue": "launchdarkly", - "type": "string", - "isSecret": false } ], "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "{{ metricsUrl }}/job/{{ jobName }}/instance/{{ kind }}:{{ name }}", + "url": "{{metricsUrl}}", "method": "POST", "headers": [] }, From fe164ef1fb0a37368cece62402546cba2c149c76 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 18:15:25 -0800 Subject: [PATCH 109/936] adding signalfx integration --- integrations/signalfx/README.md | 1 + .../signalfx/assets/images/horizontal.svg | 56 ++++++++++++++++ .../signalfx/assets/images/square.svg | 56 ++++++++++++++++ integrations/signalfx/manifest.json | 64 +++++++++++++++++++ integrations/signalfx/templates/template.json | 10 +++ 5 files changed, 187 insertions(+) create mode 100644 integrations/signalfx/README.md create mode 100755 integrations/signalfx/assets/images/horizontal.svg create mode 100755 integrations/signalfx/assets/images/square.svg create mode 100644 integrations/signalfx/manifest.json create mode 100644 integrations/signalfx/templates/template.json diff --git a/integrations/signalfx/README.md b/integrations/signalfx/README.md new file mode 100644 index 00000000..945f67b5 --- /dev/null +++ b/integrations/signalfx/README.md @@ -0,0 +1 @@ +Some SignalFX readme text will go here. \ No newline at end of file diff --git a/integrations/signalfx/assets/images/horizontal.svg b/integrations/signalfx/assets/images/horizontal.svg new file mode 100755 index 00000000..cfd126d7 --- /dev/null +++ b/integrations/signalfx/assets/images/horizontal.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/signalfx/assets/images/square.svg b/integrations/signalfx/assets/images/square.svg new file mode 100755 index 00000000..cfd126d7 --- /dev/null +++ b/integrations/signalfx/assets/images/square.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json new file mode 100644 index 00000000..bb7fd6e8 --- /dev/null +++ b/integrations/signalfx/manifest.json @@ -0,0 +1,64 @@ +{ + "name": "SignalFX", + "version": "1.0.0", + "overview": "Send audit log events to SignalFX", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to SignalFX.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "accessToken", + "name": "SignalFX access token", + "description": "Enter your [SignalFX access token](https://docs.signalfx.com/en/latest/admin-guide/tokens.html#working-with-access-tokens) here", + "type": "string", + "isSecret": true + }, + { + "key": "realm", + "name": "Realm", + "description": "Enter your SignalFX realm as noted on your [profile page](https://app.us1.signalfx.com/#/myprofile).", + "type": "string", + "isSecret": false + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "https://ingest.{{realm}}.signalfx.com/v2/event", + "method": "POST", + "headers": [ + { + "name": "X-SF-Token", + "value": "{{accessToken}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/signalfx/templates/template.json b/integrations/signalfx/templates/template.json new file mode 100644 index 00000000..2e6af7bd --- /dev/null +++ b/integrations/signalfx/templates/template.json @@ -0,0 +1,10 @@ + + [{ + "category": "AUDIT", + "dimensions": { + "environment": "production", + "project": "ben-dev" + }, + "eventType": "{{name}} {{kind}} {{titleVerb}}", + "timestamp": {{date}} +}] \ No newline at end of file From 8628aa4ac79c6935d676fdb83e9119b01d6e364e Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 18:16:43 -0800 Subject: [PATCH 110/936] adding more info to signalfx --- integrations/signalfx/templates/template.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/integrations/signalfx/templates/template.json b/integrations/signalfx/templates/template.json index 2e6af7bd..4a46929c 100644 --- a/integrations/signalfx/templates/template.json +++ b/integrations/signalfx/templates/template.json @@ -3,7 +3,9 @@ "category": "AUDIT", "dimensions": { "environment": "production", - "project": "ben-dev" + "project": "ben-dev", + "event": "{{title}}", + "comment": "{{comment}}" }, "eventType": "{{name}} {{kind}} {{titleVerb}}", "timestamp": {{date}} From f02cd2c6d034c801442ba2c21eb65bba73aea2ee Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 18:22:51 -0800 Subject: [PATCH 111/936] seeing if this fixes the build --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index b7f66249..85ab85d7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,6 +9,9 @@ jobs: - image: circleci/node:latest steps: - checkout + - install_precommit: + name: Installing pre-commit + command: curl https://pre-commit.com/install-local.py | python - - restore_cache: name: Restore Yarn Package Cache keys: From 70ab5f99fdfbf4cf5ca8460b1363fcc4626059a4 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Thu, 12 Dec 2019 18:24:10 -0800 Subject: [PATCH 112/936] temporarily remove pre-commit --- .circleci/config.yml | 3 --- package.json | 1 - 2 files changed, 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 85ab85d7..b7f66249 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,9 +9,6 @@ jobs: - image: circleci/node:latest steps: - checkout - - install_precommit: - name: Installing pre-commit - command: curl https://pre-commit.com/install-local.py | python - - restore_cache: name: Restore Yarn Package Cache keys: diff --git a/package.json b/package.json index c38214c1..97036286 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", "main": "index.js", "scripts": { - "preinstall": "pre-commit install", "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md", "test": "ajv test -s manifest.schema.json -d **/manifest.json --valid --errors=json", "test-single": "ajv test --valid --errors=json -s manifest.schema.json -d" From 36c29a18128908735f6ab028713d26faeb34d129 Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Thu, 12 Dec 2019 18:54:26 -0800 Subject: [PATCH 113/936] add Azure DevOps learn more button (still needs SVGs) --- integrations/azure-devops/manifest.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 integrations/azure-devops/manifest.json diff --git a/integrations/azure-devops/manifest.json b/integrations/azure-devops/manifest.json new file mode 100644 index 00000000..4df94721 --- /dev/null +++ b/integrations/azure-devops/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Azure DevOps", + "version": "1.0.0", + "overview": "Roll out features using Azure DevOps releases", + "description": "The Azure DevOps integration lets you perform controlled rollouts to manage feature releases. With our integration, you can define a percentage rollout for your feature flags as part of a release task.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/visual-studio-team-services-extension", + "privacyPolicy": "https://privacy.microsoft.com/en-US/privacystatement" + }, + "categories": ["automation", "source-control"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} From acf9e33dc95afb331c9f445acb92fbd55ca38e67 Mon Sep 17 00:00:00 2001 From: Zurab Davitiani Date: Fri, 13 Dec 2019 03:42:44 +0000 Subject: [PATCH 114/936] Add initial Splunk integration --- integrations/splunk/LICENSE.md | 13 ++++ integrations/splunk/README.md | 0 .../splunk/assets/images/splunk-icon.svg | 1 + .../splunk/assets/images/splunk-logo.svg | 1 + integrations/splunk/manifest.json | 65 +++++++++++++++++++ integrations/splunk/templates/template.json | 13 ++++ integrations/splunk/templates/template.txt | 1 + package.json | 3 +- 8 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 integrations/splunk/LICENSE.md create mode 100644 integrations/splunk/README.md create mode 100644 integrations/splunk/assets/images/splunk-icon.svg create mode 100644 integrations/splunk/assets/images/splunk-logo.svg create mode 100644 integrations/splunk/manifest.json create mode 100644 integrations/splunk/templates/template.json create mode 100644 integrations/splunk/templates/template.txt diff --git a/integrations/splunk/LICENSE.md b/integrations/splunk/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/splunk/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/splunk/README.md b/integrations/splunk/README.md new file mode 100644 index 00000000..e69de29b diff --git a/integrations/splunk/assets/images/splunk-icon.svg b/integrations/splunk/assets/images/splunk-icon.svg new file mode 100644 index 00000000..dfb56c69 --- /dev/null +++ b/integrations/splunk/assets/images/splunk-icon.svg @@ -0,0 +1 @@ + diff --git a/integrations/splunk/assets/images/splunk-logo.svg b/integrations/splunk/assets/images/splunk-logo.svg new file mode 100644 index 00000000..d7f6e224 --- /dev/null +++ b/integrations/splunk/assets/images/splunk-logo.svg @@ -0,0 +1 @@ + diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json new file mode 100644 index 00000000..68e57f15 --- /dev/null +++ b/integrations/splunk/manifest.json @@ -0,0 +1,65 @@ +{ + "name": "Splunk", + "version": "1.0.0", + "overview": "Send audit log events to Splunk", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Splunk.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/splunk", + "privacyPolicy": "https://www.splunk.com/en_us/legal/splunk-data-security-and-privacy.html" + }, + "categories": ["monitoring", "alerts"], + "icons": { + "square": "assets/images/splunk-icon.svg", + "horizontal": "assets/images/splunk-logo.svg" + }, + "formVariables": [ + { + "key": "base-url", + "name": "HTTP Event Collector base URL", + "type": "string", + "description": "[Splunk HTTP Event Collector base URL](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector)", + "isSecret": false + }, + { + "key": "token", + "name": "Token", + "description": "HTTP Event Collector token value", + "type": "string", + "isSecret": true, + "isOptional": false + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{base-url}}/services/collector/event", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "Splunk {{token}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/splunk/templates/template.json b/integrations/splunk/templates/template.json new file mode 100644 index 00000000..819fc872 --- /dev/null +++ b/integrations/splunk/templates/template.json @@ -0,0 +1,13 @@ +{ + "sourcetype":"launchdarkly", + "time":"{{date}}", + "event": { + "kind":"{{kind}}", + "name":"{{name}}", + "member_email":"{{member.email}}", + "member_name":"{{member.firstName}} {{member.lastName}}", + "verb":"{{titleVerb}}", + "message":"{{title}}", + "comment":"{{{comment}}}" + } +} diff --git a/integrations/splunk/templates/template.txt b/integrations/splunk/templates/template.txt new file mode 100644 index 00000000..97308a19 --- /dev/null +++ b/integrations/splunk/templates/template.txt @@ -0,0 +1 @@ +{"sourcetype":"launchdarkly","time":"{{date}}","event":"kind={{kind}}&name={{name}}&member_email={{member.email}}&verb={{titleVerb}}&message={{title}}&comment={{{comment}}}"} diff --git a/package.json b/package.json index 97036286..0679d8c7 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "homepage": "https://github.com/launchdarkly/ld-integrations#readme", "dependencies": {}, "devDependencies": { - "@adobe/jsonschema2md": "3.3.1", - "ajv-cli": "3.0.0" + "@adobe/jsonschema2md": "3.3.1" } } From 22e074f0ef271bba003c7d9b71f1b9db8d705536 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 12 Dec 2019 20:24:30 -0800 Subject: [PATCH 115/936] Cleaning up some logos --- .../azure-devops/assets/images/horizontal.svg | 16 +++++++++++++++ .../azure-devops/assets/images/square.svg | 5 +++++ integrations/dynatrace/assets/horizontal.svg | 20 +++++++++++++++---- integrations/dynatrace/assets/square.svg | 10 +++++++--- .../learn-more-only-integration/README.md | 1 - .../assets/images/horizontal.svg | 5 ----- .../assets/images/square.svg | 4 ---- .../learn-more-only-integration/manifest.json | 17 ---------------- .../assets/images/terraform_square.svg | 13 +++++++++++- package.json | 3 ++- 10 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 integrations/azure-devops/assets/images/horizontal.svg create mode 100644 integrations/azure-devops/assets/images/square.svg delete mode 100644 integrations/learn-more-only-integration/README.md delete mode 100644 integrations/learn-more-only-integration/assets/images/horizontal.svg delete mode 100644 integrations/learn-more-only-integration/assets/images/square.svg delete mode 100644 integrations/learn-more-only-integration/manifest.json diff --git a/integrations/azure-devops/assets/images/horizontal.svg b/integrations/azure-devops/assets/images/horizontal.svg new file mode 100644 index 00000000..8da0a74a --- /dev/null +++ b/integrations/azure-devops/assets/images/horizontal.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/integrations/azure-devops/assets/images/square.svg b/integrations/azure-devops/assets/images/square.svg new file mode 100644 index 00000000..c501cb97 --- /dev/null +++ b/integrations/azure-devops/assets/images/square.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/dynatrace/assets/horizontal.svg b/integrations/dynatrace/assets/horizontal.svg index 9a3b9639..f36df202 100644 --- a/integrations/dynatrace/assets/horizontal.svg +++ b/integrations/dynatrace/assets/horizontal.svg @@ -1,5 +1,17 @@ - - - - + + + + + + + + + + + + + + + + diff --git a/integrations/dynatrace/assets/square.svg b/integrations/dynatrace/assets/square.svg index 799ca37f..2bacc0b7 100644 --- a/integrations/dynatrace/assets/square.svg +++ b/integrations/dynatrace/assets/square.svg @@ -1,4 +1,8 @@ - - - + + + + + + + diff --git a/integrations/learn-more-only-integration/README.md b/integrations/learn-more-only-integration/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/learn-more-only-integration/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/learn-more-only-integration/assets/images/horizontal.svg b/integrations/learn-more-only-integration/assets/images/horizontal.svg deleted file mode 100644 index 9a3b9639..00000000 --- a/integrations/learn-more-only-integration/assets/images/horizontal.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/integrations/learn-more-only-integration/assets/images/square.svg b/integrations/learn-more-only-integration/assets/images/square.svg deleted file mode 100644 index 799ca37f..00000000 --- a/integrations/learn-more-only-integration/assets/images/square.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/integrations/learn-more-only-integration/manifest.json b/integrations/learn-more-only-integration/manifest.json deleted file mode 100644 index 0e8d024c..00000000 --- a/integrations/learn-more-only-integration/manifest.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "Learn More-only Integration", - "version": "1.0.0", - "overview": "Short one-liner describing your integration", - "description": "Send flag data to space. Markdown based description.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" - }, - "categories": ["apm", "monitoring", "alerts"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - } -} diff --git a/integrations/terraform/assets/images/terraform_square.svg b/integrations/terraform/assets/images/terraform_square.svg index ae1d4a17..ba7c24b8 100644 --- a/integrations/terraform/assets/images/terraform_square.svg +++ b/integrations/terraform/assets/images/terraform_square.svg @@ -1 +1,12 @@ -Asset 1 \ No newline at end of file + + + + + + + + + + + + diff --git a/package.json b/package.json index 0679d8c7..97036286 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "homepage": "https://github.com/launchdarkly/ld-integrations#readme", "dependencies": {}, "devDependencies": { - "@adobe/jsonschema2md": "3.3.1" + "@adobe/jsonschema2md": "3.3.1", + "ajv-cli": "3.0.0" } } From 6c1819971b2963e94334b61845aea3119f9c0dee Mon Sep 17 00:00:00 2001 From: Zurab Davitiani Date: Fri, 13 Dec 2019 05:26:48 +0000 Subject: [PATCH 116/936] Fix ajv-cli dependency --- package.json | 3 ++- yarn.lock | 20 ++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 0679d8c7..97036286 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "homepage": "https://github.com/launchdarkly/ld-integrations#readme", "dependencies": {}, "devDependencies": { - "@adobe/jsonschema2md": "3.3.1" + "@adobe/jsonschema2md": "3.3.1", + "ajv-cli": "3.0.0" } } diff --git a/yarn.lock b/yarn.lock index 290e1b6c..4fada4f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -444,9 +444,9 @@ colorette@^1.1.0: integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg== commander@^2.19.0: - version "2.20.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.1.tgz#3863ce3ca92d0831dcf2a102f5fb4b5926afd0f9" - integrity sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg== + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== concat-map@0.0.1: version "0.0.1" @@ -834,7 +834,19 @@ github-slugger@^1.2.1: dependencies: emoji-regex ">=6.0.0 <=6.1.1" -glob@^7.0.3, glob@^7.1.3: +glob@^7.0.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +glob@^7.1.3: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== From f34c40380a1d16048b8d13dc3078b53590a9701f Mon Sep 17 00:00:00 2001 From: Adam Zimman Date: Fri, 13 Dec 2019 08:31:06 -0800 Subject: [PATCH 117/936] Bitbucket card adding bitbucket card --- integrations/bitbucket/README.md | 6 +++++ .../assets/images/bitbucket_horizontal.svg | 1 + .../assets/images/bitbucket_square.svg | 24 +++++++++++++++++++ integrations/bitbucket/manifest.json | 18 ++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 integrations/bitbucket/README.md create mode 100644 integrations/bitbucket/assets/images/bitbucket_horizontal.svg create mode 100644 integrations/bitbucket/assets/images/bitbucket_square.svg create mode 100644 integrations/bitbucket/manifest.json diff --git a/integrations/bitbucket/README.md b/integrations/bitbucket/README.md new file mode 100644 index 00000000..9fcbeefc --- /dev/null +++ b/integrations/bitbucket/README.md @@ -0,0 +1,6 @@ +The LaunchDarkly integration lets you insert feature flag actions directly into your Pipeline's continuous delivery flow. Bitbucket Pipelines is a continuous delivery platform that lets your team build, test, and deploy from Bitbucket. It exists within Bitbucket, giving you end-to-end visibility from coding to deployment. + +We provide two scripts you can add to your pipelines: + +- Create feature flags in your Pipelines build: This lets you create feature flags within a specified project. The feature flag will be created in all environments for that project. +- Enable a feature flag in your Pipelines build: This lets you turn on a specific feature flag for a specific environment within a project. \ No newline at end of file diff --git a/integrations/bitbucket/assets/images/bitbucket_horizontal.svg b/integrations/bitbucket/assets/images/bitbucket_horizontal.svg new file mode 100644 index 00000000..380939e9 --- /dev/null +++ b/integrations/bitbucket/assets/images/bitbucket_horizontal.svg @@ -0,0 +1 @@ +Bitbucket-blue \ No newline at end of file diff --git a/integrations/bitbucket/assets/images/bitbucket_square.svg b/integrations/bitbucket/assets/images/bitbucket_square.svg new file mode 100644 index 00000000..dd465750 --- /dev/null +++ b/integrations/bitbucket/assets/images/bitbucket_square.svg @@ -0,0 +1,24 @@ + + + + +Bitbucket-blue + + + + + + + + + + + + + diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json new file mode 100644 index 00000000..6c7a5017 --- /dev/null +++ b/integrations/bitbucket/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "Bitbucket Pipelines", + "version": "1.0.0", + "overview": "Create and enable feature flags using Bitbucket Pipelines.", + "description": "The LaunchDarkly integration lets you insert feature flag actions directly into your Pipeline's continuous delivery flow. Bitbucket Pipelines is a continuous delivery platform that lets your team build, test, and deploy from Bitbucket. It exists within Bitbucket, giving you end-to-end visibility from coding to deployment.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "supportWebsite": "https://docs.launchdarkly.com/docs/bitbucket-pipelines", + "site": "https://docs.launchdarkly.com/docs/bitbucket-pipelines", + "privacyPolicy": "https://docs.launchdarkly.com/docs/git-code-references#section-configuring-context-lines" + }, + "categories": ["source-control"], + "icons": { + "square": "assets/images/bitbucket_square.svg", + "horizontal": "assets/images/bitbucket_horizontal.svg" + } +} From 25f11b018795a0fd9e05e60b39245f75630e06b6 Mon Sep 17 00:00:00 2001 From: Adam Zimman Date: Fri, 13 Dec 2019 08:37:02 -0800 Subject: [PATCH 118/936] updating name updating name of integration to distinguish from code ref integration --- integrations/{bitbucket => bitbucket-flags}/README.md | 0 .../assets/images/bitbucket_horizontal.svg | 0 .../assets/images/bitbucket_square.svg | 0 integrations/{bitbucket => bitbucket-flags}/manifest.json | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) rename integrations/{bitbucket => bitbucket-flags}/README.md (100%) rename integrations/{bitbucket => bitbucket-flags}/assets/images/bitbucket_horizontal.svg (100%) rename integrations/{bitbucket => bitbucket-flags}/assets/images/bitbucket_square.svg (100%) rename integrations/{bitbucket => bitbucket-flags}/manifest.json (95%) diff --git a/integrations/bitbucket/README.md b/integrations/bitbucket-flags/README.md similarity index 100% rename from integrations/bitbucket/README.md rename to integrations/bitbucket-flags/README.md diff --git a/integrations/bitbucket/assets/images/bitbucket_horizontal.svg b/integrations/bitbucket-flags/assets/images/bitbucket_horizontal.svg similarity index 100% rename from integrations/bitbucket/assets/images/bitbucket_horizontal.svg rename to integrations/bitbucket-flags/assets/images/bitbucket_horizontal.svg diff --git a/integrations/bitbucket/assets/images/bitbucket_square.svg b/integrations/bitbucket-flags/assets/images/bitbucket_square.svg similarity index 100% rename from integrations/bitbucket/assets/images/bitbucket_square.svg rename to integrations/bitbucket-flags/assets/images/bitbucket_square.svg diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket-flags/manifest.json similarity index 95% rename from integrations/bitbucket/manifest.json rename to integrations/bitbucket-flags/manifest.json index 6c7a5017..aac9d645 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket-flags/manifest.json @@ -1,5 +1,5 @@ { - "name": "Bitbucket Pipelines", + "name": "Bitbucket Pipelines (flags)", "version": "1.0.0", "overview": "Create and enable feature flags using Bitbucket Pipelines.", "description": "The LaunchDarkly integration lets you insert feature flag actions directly into your Pipeline's continuous delivery flow. Bitbucket Pipelines is a continuous delivery platform that lets your team build, test, and deploy from Bitbucket. It exists within Bitbucket, giving you end-to-end visibility from coding to deployment.", From ad9ae5969c7f977e393c0cc85e7fce3bd048eefc Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Fri, 13 Dec 2019 09:11:55 -0800 Subject: [PATCH 119/936] better signalfx info --- .../signalfx/assets/images/square.svg | 62 ++----------------- integrations/signalfx/templates/template.json | 4 +- 2 files changed, 9 insertions(+), 57 deletions(-) mode change 100755 => 100644 integrations/signalfx/assets/images/square.svg diff --git a/integrations/signalfx/assets/images/square.svg b/integrations/signalfx/assets/images/square.svg old mode 100755 new mode 100644 index cfd126d7..2c281a2e --- a/integrations/signalfx/assets/images/square.svg +++ b/integrations/signalfx/assets/images/square.svg @@ -1,56 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + diff --git a/integrations/signalfx/templates/template.json b/integrations/signalfx/templates/template.json index 4a46929c..37cbfb00 100644 --- a/integrations/signalfx/templates/template.json +++ b/integrations/signalfx/templates/template.json @@ -4,9 +4,11 @@ "dimensions": { "environment": "production", "project": "ben-dev", + "flag": "{{name}}", + "kind": "{{kind}}", "event": "{{title}}", "comment": "{{comment}}" }, - "eventType": "{{name}} {{kind}} {{titleVerb}}", + "eventType": "LaunchDarkly flag changed", "timestamp": {{date}} }] \ No newline at end of file From 39416a1d32f90d1e5ccafa1e804949a4f456cc38 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Fri, 13 Dec 2019 09:13:13 -0800 Subject: [PATCH 120/936] logdna debug info --- integrations/logdna/templates/template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json index 5a115d47..f99a8db1 100644 --- a/integrations/logdna/templates/template.json +++ b/integrations/logdna/templates/template.json @@ -1,7 +1,7 @@ { "lines": [ { - "line":"{{{title}}}{{#if comment}}, Comment: {{comment}}{{/if}}", + "line":"{{{title}}}{{#if comment}}, Comment: {{comment}}{{/if}}, Timestamp: {{date}}", "app":"test-app", "level": "INFO", "env": "production" From 3fa61d85b064de5ff48b195b516c3ef8a5c36760 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Fri, 13 Dec 2019 09:27:15 -0800 Subject: [PATCH 121/936] remove logdna debug, fix escaping in signalfx --- integrations/logdna/templates/template.json | 2 +- integrations/signalfx/templates/template.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json index f99a8db1..5a115d47 100644 --- a/integrations/logdna/templates/template.json +++ b/integrations/logdna/templates/template.json @@ -1,7 +1,7 @@ { "lines": [ { - "line":"{{{title}}}{{#if comment}}, Comment: {{comment}}{{/if}}, Timestamp: {{date}}", + "line":"{{{title}}}{{#if comment}}, Comment: {{comment}}{{/if}}", "app":"test-app", "level": "INFO", "env": "production" diff --git a/integrations/signalfx/templates/template.json b/integrations/signalfx/templates/template.json index 37cbfb00..a92dfd0b 100644 --- a/integrations/signalfx/templates/template.json +++ b/integrations/signalfx/templates/template.json @@ -6,9 +6,9 @@ "project": "ben-dev", "flag": "{{name}}", "kind": "{{kind}}", - "event": "{{title}}", + "event": "{{{title}}}", "comment": "{{comment}}" }, - "eventType": "LaunchDarkly flag changed", + "eventType": "LaunchDarkly flag change", "timestamp": {{date}} }] \ No newline at end of file From 064ab25d514e2ace7051caeb4b19b83dc4bda202 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Fri, 13 Dec 2019 09:50:37 -0800 Subject: [PATCH 122/936] templatized kind --- integrations/signalfx/templates/template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/signalfx/templates/template.json b/integrations/signalfx/templates/template.json index a92dfd0b..071d308d 100644 --- a/integrations/signalfx/templates/template.json +++ b/integrations/signalfx/templates/template.json @@ -9,6 +9,6 @@ "event": "{{{title}}}", "comment": "{{comment}}" }, - "eventType": "LaunchDarkly flag change", + "eventType": "LaunchDarkly {{kind}} change", "timestamp": {{date}} }] \ No newline at end of file From cc527dca5f9ad616d1dcc72bfbcc7c58db0299c8 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 13 Dec 2019 10:19:21 -0800 Subject: [PATCH 123/936] fix dynatrace URL typo --- integrations/dynatrace/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 950b062c..0f7a5bdb 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -34,7 +34,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "{{url}}//api/v1/events", + "url": "{{url}}/api/v1/events", "method": "POST", "headers": [ { From 036e2ab0609f1ef1d61fe49f57c42de774c1925e Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Fri, 13 Dec 2019 11:26:00 -0800 Subject: [PATCH 124/936] librato added --- integrations/librato/LICENSE.md | 13 ++++ integrations/librato/README.md | 0 .../librato/assets/images/honeycomb-rect.svg | 36 +++++++++++ .../assets/images/honeycomb-square.svg | 13 ++++ integrations/librato/manifest.json | 64 +++++++++++++++++++ integrations/librato/templates/flag.json | 12 ++++ 6 files changed, 138 insertions(+) create mode 100644 integrations/librato/LICENSE.md create mode 100644 integrations/librato/README.md create mode 100644 integrations/librato/assets/images/honeycomb-rect.svg create mode 100644 integrations/librato/assets/images/honeycomb-square.svg create mode 100644 integrations/librato/manifest.json create mode 100644 integrations/librato/templates/flag.json diff --git a/integrations/librato/LICENSE.md b/integrations/librato/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/librato/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/librato/README.md b/integrations/librato/README.md new file mode 100644 index 00000000..e69de29b diff --git a/integrations/librato/assets/images/honeycomb-rect.svg b/integrations/librato/assets/images/honeycomb-rect.svg new file mode 100644 index 00000000..d6702bde --- /dev/null +++ b/integrations/librato/assets/images/honeycomb-rect.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/librato/assets/images/honeycomb-square.svg b/integrations/librato/assets/images/honeycomb-square.svg new file mode 100644 index 00000000..5b576d9f --- /dev/null +++ b/integrations/librato/assets/images/honeycomb-square.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/integrations/librato/manifest.json b/integrations/librato/manifest.json new file mode 100644 index 00000000..ac7b4bab --- /dev/null +++ b/integrations/librato/manifest.json @@ -0,0 +1,64 @@ +{ + "name": "Librato", + "version": "1.0.0", + "overview": "Send LaunchDarkly audit events to Librato", + "description": "This integration sends LaunchDarkly audit events to Librato.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.librato.com/", + "privacyPolicy": "https://www.solarwinds.com/legal/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/honeycomb-square.svg", + "horizontal": "assets/images/honeycomb-rect.svg" + }, + "formVariables": [ + { + "key": "streamName", + "name": "Librato annotation stream name", + "description": "Enter the Annotation stream Name that will be used for the request to the [Annotation API](http://www.librato.com/docs/api/?python#create-an-annotation).", + "type": "string", + "isSecret": false + }, + { + "key": "username", + "name": "Librato username/email", + "description": "Enter your Librato username/email.", + "type": "string", + "isSecret": false + }, + { + "key": "apiKey", + "name": "Librato API Key", + "description": "Enter your Librato API Key here", + "type": "string", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "https://{{username}}:{{apiKey}}metrics-api.librato.com/v1/annotations/demo-api{{streamName}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "flag": "templates/flag.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/librato/templates/flag.json b/integrations/librato/templates/flag.json new file mode 100644 index 00000000..06b1e454 --- /dev/null +++ b/integrations/librato/templates/flag.json @@ -0,0 +1,12 @@ +{ + "title": "{{{title}}}", + "type": "LaunchDarkly", + "url": "https://ld-stg.launchdarkly.com{{_links.site.href}}", + "links": [ + { + "label": "{{name}}", + "href": "https://ld-stg.launchdarkly.com{{_links.site.href}}", + "rel": "launchdarkly" + } + ] +} \ No newline at end of file From e48bfdcdb6908c2b8f1ddc3b69a33ae3623e565a Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Fri, 13 Dec 2019 11:36:51 -0800 Subject: [PATCH 125/936] added images and fixed url for librato --- .../librato/assets/images/honeycomb-rect.svg | 36 ------------------- .../assets/images/honeycomb-square.svg | 13 ------- .../assets/images/horizontal.svg | 0 .../assets/images/solarwinds-square.svg | 10 ++++++ integrations/librato/manifest.json | 6 ++-- 5 files changed, 13 insertions(+), 52 deletions(-) delete mode 100644 integrations/librato/assets/images/honeycomb-rect.svg delete mode 100644 integrations/librato/assets/images/honeycomb-square.svg rename integrations/{sample-integration => librato}/assets/images/horizontal.svg (100%) create mode 100644 integrations/librato/assets/images/solarwinds-square.svg diff --git a/integrations/librato/assets/images/honeycomb-rect.svg b/integrations/librato/assets/images/honeycomb-rect.svg deleted file mode 100644 index d6702bde..00000000 --- a/integrations/librato/assets/images/honeycomb-rect.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/librato/assets/images/honeycomb-square.svg b/integrations/librato/assets/images/honeycomb-square.svg deleted file mode 100644 index 5b576d9f..00000000 --- a/integrations/librato/assets/images/honeycomb-square.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/integrations/sample-integration/assets/images/horizontal.svg b/integrations/librato/assets/images/horizontal.svg similarity index 100% rename from integrations/sample-integration/assets/images/horizontal.svg rename to integrations/librato/assets/images/horizontal.svg diff --git a/integrations/librato/assets/images/solarwinds-square.svg b/integrations/librato/assets/images/solarwinds-square.svg new file mode 100644 index 00000000..3883a445 --- /dev/null +++ b/integrations/librato/assets/images/solarwinds-square.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/integrations/librato/manifest.json b/integrations/librato/manifest.json index ac7b4bab..c2a1b83e 100644 --- a/integrations/librato/manifest.json +++ b/integrations/librato/manifest.json @@ -11,8 +11,8 @@ }, "categories": ["apm", "monitoring", "alerts"], "icons": { - "square": "assets/images/honeycomb-square.svg", - "horizontal": "assets/images/honeycomb-rect.svg" + "square": "assets/images/solarwinds-square.svg", + "horizontal": "assets/images/horizontal.svg" }, "formVariables": [ { @@ -40,7 +40,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "https://{{username}}:{{apiKey}}metrics-api.librato.com/v1/annotations/demo-api{{streamName}}", + "url": "https://{{username}}:{{apiKey}}metrics-api.librato.com/v1/annotations/{{streamName}}", "method": "POST", "headers": [ { From dabb06a78066a809730eb181a4b208f3fc3b15ab Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Fri, 13 Dec 2019 11:45:28 -0800 Subject: [PATCH 126/936] changed librato url --- integrations/librato/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/librato/manifest.json b/integrations/librato/manifest.json index c2a1b83e..8db04426 100644 --- a/integrations/librato/manifest.json +++ b/integrations/librato/manifest.json @@ -40,7 +40,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "https://{{username}}:{{apiKey}}metrics-api.librato.com/v1/annotations/{{streamName}}", + "url": "https://{{username}}:{{apiKey}}@metrics-api.librato.com/v1/annotations/{{streamName}}", "method": "POST", "headers": [ { From ce03697f708bfe0cfe06764b9bf3f95cd0ab0c68 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Fri, 13 Dec 2019 11:45:43 -0800 Subject: [PATCH 127/936] adding vscode, fixing punctuation in other manifests --- integrations/bitbucket-flags/manifest.json | 2 +- integrations/jira/manifest.json | 2 +- integrations/terraform/manifest.json | 2 +- integrations/vscode/README.md | 1 + .../vscode/assets/images/horizontal.svg | 1 + integrations/vscode/assets/images/square.svg | 1 + integrations/vscode/manifest.json | 17 +++++++++++++++++ 7 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 integrations/vscode/README.md create mode 100644 integrations/vscode/assets/images/horizontal.svg create mode 100644 integrations/vscode/assets/images/square.svg create mode 100644 integrations/vscode/manifest.json diff --git a/integrations/bitbucket-flags/manifest.json b/integrations/bitbucket-flags/manifest.json index aac9d645..34b47af5 100644 --- a/integrations/bitbucket-flags/manifest.json +++ b/integrations/bitbucket-flags/manifest.json @@ -1,7 +1,7 @@ { "name": "Bitbucket Pipelines (flags)", "version": "1.0.0", - "overview": "Create and enable feature flags using Bitbucket Pipelines.", + "overview": "Create and enable feature flags using Bitbucket Pipelines", "description": "The LaunchDarkly integration lets you insert feature flag actions directly into your Pipeline's continuous delivery flow. Bitbucket Pipelines is a continuous delivery platform that lets your team build, test, and deploy from Bitbucket. It exists within Bitbucket, giving you end-to-end visibility from coding to deployment.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 4d3f4ed2..cee04bef 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -1,7 +1,7 @@ { "name": "Jira Cloud", "version": "1.0.0", - "overview": "LaunchDarkly's Jira app allows you to link your feature flags with your team's Jira issues.", + "overview": "Link your feature flags with your team's Jira issues", "description": "When a feature flag is turned on, off, or has its targeting rules update, its associated Jira issue pages display the flag's current status.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index e75b54a3..742cdc40 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -1,7 +1,7 @@ { "name": "Terraform Provider", "version": "1.0.0", - "overview": "Manage your LaunchDarkly resources as Terraform resources.", + "overview": "Manage your LaunchDarkly resources as Terraform resources", "description": "Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/vscode/README.md b/integrations/vscode/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/vscode/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/vscode/assets/images/horizontal.svg b/integrations/vscode/assets/images/horizontal.svg new file mode 100644 index 00000000..a39f0d00 --- /dev/null +++ b/integrations/vscode/assets/images/horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/vscode/assets/images/square.svg b/integrations/vscode/assets/images/square.svg new file mode 100644 index 00000000..67aee172 --- /dev/null +++ b/integrations/vscode/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/vscode/manifest.json b/integrations/vscode/manifest.json new file mode 100644 index 00000000..727976fc --- /dev/null +++ b/integrations/vscode/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Visual Studio Code", + "version": "1.0.0", + "overview": "Interact with feature flags from within VSCode", + "description": "With this extension, you'll be able to view feature flag details when you hover over a feature flag key in your source code, autocomplete feature flag keys, and more -- all within VSCode!", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/visual-studio-code", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["it-and-project-management", "product-and-design"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} From e9be3cb931f8975dc9b8fe6eb85a976c503b3c27 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Fri, 13 Dec 2019 11:47:42 -0800 Subject: [PATCH 128/936] changed librato to appOptics --- .../{librato => appoptics}/LICENSE.md | 0 integrations/{librato => appoptics}/README.md | 0 .../assets/images/horizontal.svg | 0 .../assets/images/solarwinds-square.svg | 0 .../{librato => appoptics}/manifest.json | 22 +++++++++---------- .../templates/flag.json | 0 6 files changed, 11 insertions(+), 11 deletions(-) rename integrations/{librato => appoptics}/LICENSE.md (100%) rename integrations/{librato => appoptics}/README.md (100%) rename integrations/{librato => appoptics}/assets/images/horizontal.svg (100%) rename integrations/{librato => appoptics}/assets/images/solarwinds-square.svg (100%) rename integrations/{librato => appoptics}/manifest.json (66%) rename integrations/{librato => appoptics}/templates/flag.json (100%) diff --git a/integrations/librato/LICENSE.md b/integrations/appoptics/LICENSE.md similarity index 100% rename from integrations/librato/LICENSE.md rename to integrations/appoptics/LICENSE.md diff --git a/integrations/librato/README.md b/integrations/appoptics/README.md similarity index 100% rename from integrations/librato/README.md rename to integrations/appoptics/README.md diff --git a/integrations/librato/assets/images/horizontal.svg b/integrations/appoptics/assets/images/horizontal.svg similarity index 100% rename from integrations/librato/assets/images/horizontal.svg rename to integrations/appoptics/assets/images/horizontal.svg diff --git a/integrations/librato/assets/images/solarwinds-square.svg b/integrations/appoptics/assets/images/solarwinds-square.svg similarity index 100% rename from integrations/librato/assets/images/solarwinds-square.svg rename to integrations/appoptics/assets/images/solarwinds-square.svg diff --git a/integrations/librato/manifest.json b/integrations/appoptics/manifest.json similarity index 66% rename from integrations/librato/manifest.json rename to integrations/appoptics/manifest.json index 8db04426..e931daa4 100644 --- a/integrations/librato/manifest.json +++ b/integrations/appoptics/manifest.json @@ -1,12 +1,12 @@ { - "name": "Librato", + "name": "AppOptics", "version": "1.0.0", - "overview": "Send LaunchDarkly audit events to Librato", - "description": "This integration sends LaunchDarkly audit events to Librato.", + "overview": "Send LaunchDarkly audit events to AppOptics", + "description": "This integration sends LaunchDarkly audit events to AppOptics.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://www.librato.com/", + "site": "https://www.AppOptics.com/", "privacyPolicy": "https://www.solarwinds.com/legal/privacy" }, "categories": ["apm", "monitoring", "alerts"], @@ -17,22 +17,22 @@ "formVariables": [ { "key": "streamName", - "name": "Librato annotation stream name", - "description": "Enter the Annotation stream Name that will be used for the request to the [Annotation API](http://www.librato.com/docs/api/?python#create-an-annotation).", + "name": "AppOptics annotation stream name", + "description": "Enter the Annotation stream Name that will be used for the request to the [Annotation API](http://www.AppOptics.com/docs/api/?python#create-an-annotation).", "type": "string", "isSecret": false }, { "key": "username", - "name": "Librato username/email", - "description": "Enter your Librato username/email.", + "name": "AppOptics username/email", + "description": "Enter your AppOptics username/email.", "type": "string", "isSecret": false }, { "key": "apiKey", - "name": "Librato API Key", - "description": "Enter your Librato API Key here", + "name": "AppOptics API Key", + "description": "Enter your AppOptics API Key here", "type": "string", "isSecret": true } @@ -40,7 +40,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "https://{{username}}:{{apiKey}}@metrics-api.librato.com/v1/annotations/{{streamName}}", + "url": "https://{{username}}:{{apiKey}}@metrics-api.AppOptics.com/v1/annotations/{{streamName}}", "method": "POST", "headers": [ { diff --git a/integrations/librato/templates/flag.json b/integrations/appoptics/templates/flag.json similarity index 100% rename from integrations/librato/templates/flag.json rename to integrations/appoptics/templates/flag.json From 022d11a902509d888c97948068c170ca31a7874b Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Fri, 13 Dec 2019 14:55:37 -0500 Subject: [PATCH 129/936] Adding ansible (#7) --- integrations/ansible/README.md | 1 + integrations/ansible/assets/horizontal.svg | 5 +++++ integrations/ansible/assets/square.svg | 11 +++++++++++ integrations/ansible/manifest.json | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 integrations/ansible/README.md create mode 100644 integrations/ansible/assets/horizontal.svg create mode 100644 integrations/ansible/assets/square.svg create mode 100644 integrations/ansible/manifest.json diff --git a/integrations/ansible/README.md b/integrations/ansible/README.md new file mode 100644 index 00000000..a802ae2d --- /dev/null +++ b/integrations/ansible/README.md @@ -0,0 +1 @@ +Ansible Collection to manage LaunchDarkly resources. This allows you to use Ansible playbooks to configure and control feature flags, environments, projects, and more. diff --git a/integrations/ansible/assets/horizontal.svg b/integrations/ansible/assets/horizontal.svg new file mode 100644 index 00000000..8c80058d --- /dev/null +++ b/integrations/ansible/assets/horizontal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/ansible/assets/square.svg b/integrations/ansible/assets/square.svg new file mode 100644 index 00000000..acb80b80 --- /dev/null +++ b/integrations/ansible/assets/square.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json new file mode 100644 index 00000000..c8ea4a4a --- /dev/null +++ b/integrations/ansible/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "Ansible Collection", + "version": "0.2.0", + "overview": "Manage your LaunchDarkly resources using Ansible.", + "description": "LaunchDarkly Labs project to manage LaunchDarkly resources using Ansible. This allows you to use Ansible to configure and control feature flags, environments, projects, and more.", + "author": "LaunchDarkly Labs", + "supportEmail": "support@launchdarkly.com", + "links": { + "supportWebsite": "https://github.com/launchdarkly-labs/ansible-launchdarkly-collection/issues", + "site": "https://launchdarkly-labs.github.io/ansible-launchdarkly-collection/", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["provisioning", "config-and-deployment", "orchestration"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } + } From 95a00532445217f6d5c59f3f111f1684d7ecd7c9 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Fri, 13 Dec 2019 12:02:18 -0800 Subject: [PATCH 130/936] adding circleci and gitlab --- integrations/circleci-coderefs/README.md | 1 + .../assets/images/horizontal.svg | 1 + .../circleci-coderefs/assets/images/square.svg | 1 + integrations/circleci-coderefs/manifest.json | 17 +++++++++++++++++ integrations/gitlab-coderefs/README.md | 1 + .../assets/images/horizontal.svg | 1 + .../gitlab-coderefs/assets/images/square.svg | 1 + integrations/gitlab-coderefs/manifest.json | 17 +++++++++++++++++ 8 files changed, 40 insertions(+) create mode 100644 integrations/circleci-coderefs/README.md create mode 100644 integrations/circleci-coderefs/assets/images/horizontal.svg create mode 100644 integrations/circleci-coderefs/assets/images/square.svg create mode 100644 integrations/circleci-coderefs/manifest.json create mode 100644 integrations/gitlab-coderefs/README.md create mode 100644 integrations/gitlab-coderefs/assets/images/horizontal.svg create mode 100644 integrations/gitlab-coderefs/assets/images/square.svg create mode 100644 integrations/gitlab-coderefs/manifest.json diff --git a/integrations/circleci-coderefs/README.md b/integrations/circleci-coderefs/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/circleci-coderefs/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/circleci-coderefs/assets/images/horizontal.svg b/integrations/circleci-coderefs/assets/images/horizontal.svg new file mode 100644 index 00000000..8eb6526a --- /dev/null +++ b/integrations/circleci-coderefs/assets/images/horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/circleci-coderefs/assets/images/square.svg b/integrations/circleci-coderefs/assets/images/square.svg new file mode 100644 index 00000000..c4a6bc98 --- /dev/null +++ b/integrations/circleci-coderefs/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json new file mode 100644 index 00000000..0ff174a5 --- /dev/null +++ b/integrations/circleci-coderefs/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "CircleCI", + "version": "1.0.0", + "overview": "Use our open-source utility to track references to flags in your code, using CircleCI.", + "description": "You can use this utility with CircleCI to automatically populate code references in LaunchDarkly.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/circleci-orbs", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["it-and-project-management", "config-and-deployment", "source-control"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/gitlab-coderefs/README.md b/integrations/gitlab-coderefs/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/gitlab-coderefs/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/gitlab-coderefs/assets/images/horizontal.svg b/integrations/gitlab-coderefs/assets/images/horizontal.svg new file mode 100644 index 00000000..b3c048f5 --- /dev/null +++ b/integrations/gitlab-coderefs/assets/images/horizontal.svg @@ -0,0 +1 @@ +wm_no_bg \ No newline at end of file diff --git a/integrations/gitlab-coderefs/assets/images/square.svg b/integrations/gitlab-coderefs/assets/images/square.svg new file mode 100644 index 00000000..ab63afd2 --- /dev/null +++ b/integrations/gitlab-coderefs/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab-coderefs/manifest.json new file mode 100644 index 00000000..7d534dff --- /dev/null +++ b/integrations/gitlab-coderefs/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "GitLab", + "version": "1.0.0", + "overview": "Use our open-source utility to track references to flags in your code, using GitLab CI.", + "description": "You can use this utility with GitLab CI to automatically populate code references in LaunchDarkly.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/gitlab-ci", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["it-and-project-management", "config-and-deployment", "source-control"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} From 7d86c0612f4d68372a75acf740a3780ae24b14b9 Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Fri, 13 Dec 2019 12:06:25 -0800 Subject: [PATCH 131/936] add grafana --- integrations/grafana/manifest.json | 48 ++++++++++++++++++++ integrations/grafana/templates/template.json | 5 ++ 2 files changed, 53 insertions(+) create mode 100644 integrations/grafana/manifest.json create mode 100644 integrations/grafana/templates/template.json diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json new file mode 100644 index 00000000..8e257006 --- /dev/null +++ b/integrations/grafana/manifest.json @@ -0,0 +1,48 @@ +{ + "name": "Grafana", + "version": "0.0.1", + "overview": "Annotate your Grafana dashboards with Launch Darkly events", + "description": "Send flag, environment, and project updates to Grafana to add context to your graphs.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://grafana.com/", + "privacyPolicy": "https://grafana.com/terms/" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "endpointURL", + "name": "API URL", + "description": "The URL of your Grafana instance's API", + "placeholder": "https://grafana.example.org/api", + "type": "uri", + "isSecret": false + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{ endpointUrl }}/annotations", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" + }, + "defaultPolicy": [] + } + } +} diff --git a/integrations/grafana/templates/template.json b/integrations/grafana/templates/template.json new file mode 100644 index 00000000..96ef706d --- /dev/null +++ b/integrations/grafana/templates/template.json @@ -0,0 +1,5 @@ +{ + "time":{{ date }}, + "tags":["{{ kind }}"], + "text":"{{ title }}" +} From 237b82a99b4ad6e129a70a7e90bc2e2bd027edeb Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Fri, 13 Dec 2019 12:06:38 -0800 Subject: [PATCH 132/936] fix punctuation --- integrations/ansible/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json index c8ea4a4a..a62c2309 100644 --- a/integrations/ansible/manifest.json +++ b/integrations/ansible/manifest.json @@ -1,7 +1,7 @@ { "name": "Ansible Collection", "version": "0.2.0", - "overview": "Manage your LaunchDarkly resources using Ansible.", + "overview": "Manage your LaunchDarkly resources using Ansible", "description": "LaunchDarkly Labs project to manage LaunchDarkly resources using Ansible. This allows you to use Ansible to configure and control feature flags, environments, projects, and more.", "author": "LaunchDarkly Labs", "supportEmail": "support@launchdarkly.com", From 06ed9ec3e431810b1004d2e0fc36d66424cf8264 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 13 Dec 2019 12:14:33 -0800 Subject: [PATCH 133/936] Fixing ansible --- integrations/ansible/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json index c8ea4a4a..9e4abe50 100644 --- a/integrations/ansible/manifest.json +++ b/integrations/ansible/manifest.json @@ -12,7 +12,7 @@ }, "categories": ["provisioning", "config-and-deployment", "orchestration"], "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" } } From 774462f9c640f0f94621862a622e7c6ffe890216 Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Fri, 13 Dec 2019 12:28:30 -0800 Subject: [PATCH 134/936] update grafana --- integrations/grafana/manifest.json | 14 ++++++++++++++ integrations/grafana/templates/template.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 8e257006..a9ed5cdb 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -22,6 +22,14 @@ "placeholder": "https://grafana.example.org/api", "type": "uri", "isSecret": false + }, + { + "key": "apiKey", + "name": "API Key", + "description": "An API key with editor privileges to your Grafana instance", + "placeholder": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk=", + "type": "string", + "isSecret": true } ], "capabilities": { @@ -34,6 +42,12 @@ "name": "Content-Type", "value": "application/json" } + ], + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{ apiKey }}" + } ] }, "templates": { diff --git a/integrations/grafana/templates/template.json b/integrations/grafana/templates/template.json index 96ef706d..9e0aebf8 100644 --- a/integrations/grafana/templates/template.json +++ b/integrations/grafana/templates/template.json @@ -1,5 +1,5 @@ { "time":{{ date }}, - "tags":["{{ kind }}"], + "tags":["{{ kind }}","{{ memberName }}", "{{ action }}", "{{ resourceName }}"], "text":"{{ title }}" } From a67576cc6a281f7686e210e1f3a27bcebb743faa Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Fri, 13 Dec 2019 12:35:55 -0800 Subject: [PATCH 135/936] fix grafana endpoint --- integrations/grafana/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index a9ed5cdb..bca73ee5 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -16,7 +16,7 @@ }, "formVariables": [ { - "key": "endpointURL", + "key": "endpointUrl", "name": "API URL", "description": "The URL of your Grafana instance's API", "placeholder": "https://grafana.example.org/api", From 646d977aebced29cc6886b14eff80f6989ab2344 Mon Sep 17 00:00:00 2001 From: Adam Zimman Date: Fri, 13 Dec 2019 12:43:58 -0800 Subject: [PATCH 136/936] Initial pass at AppDynamics Needs validation. had challenges setting up AppD environment --- integrations/appdynamics/README.md | 1 + .../assets/images/appdynamics_horizontal.svg | 26 +++++++ .../assets/images/appdynamics_square.svg | 13 ++++ integrations/appdynamics/manifest.json | 71 +++++++++++++++++++ .../appdynamics/templates/template.json | 9 +++ 5 files changed, 120 insertions(+) create mode 100644 integrations/appdynamics/README.md create mode 100644 integrations/appdynamics/assets/images/appdynamics_horizontal.svg create mode 100644 integrations/appdynamics/assets/images/appdynamics_square.svg create mode 100644 integrations/appdynamics/manifest.json create mode 100644 integrations/appdynamics/templates/template.json diff --git a/integrations/appdynamics/README.md b/integrations/appdynamics/README.md new file mode 100644 index 00000000..483e10bf --- /dev/null +++ b/integrations/appdynamics/README.md @@ -0,0 +1 @@ +Some AppDynamics readme text will go here. \ No newline at end of file diff --git a/integrations/appdynamics/assets/images/appdynamics_horizontal.svg b/integrations/appdynamics/assets/images/appdynamics_horizontal.svg new file mode 100644 index 00000000..acf796b0 --- /dev/null +++ b/integrations/appdynamics/assets/images/appdynamics_horizontal.svg @@ -0,0 +1,26 @@ + + + + + + + + + diff --git a/integrations/appdynamics/assets/images/appdynamics_square.svg b/integrations/appdynamics/assets/images/appdynamics_square.svg new file mode 100644 index 00000000..3c615d94 --- /dev/null +++ b/integrations/appdynamics/assets/images/appdynamics_square.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json new file mode 100644 index 00000000..57cae93a --- /dev/null +++ b/integrations/appdynamics/manifest.json @@ -0,0 +1,71 @@ +{ + "name": "AppDynamics", + "version": "1.0.0", + "overview": "Send audit log events to AppDynamics", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to AppDynamics.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/appdynamics_square.svg", + "horizontal": "assets/images/appdynamics_horizontal.svg" + }, + "formVariables": [ + { + "key": "account", + "name": "Account", + "description": "Enter your AppDynamics Account as noted on your [License Management](https://docs.appdynamics.com/display/PRO45/License+Management) page", + "type": "string", + "isSecret": false + }, + { + "key": "username", + "name": "AppDynamics User", + "description": "Enter your [AppDynamics username](https://docs.appdynamics.com/display/PRO45/API+Clients) here", + "type": "string", + "isSecret": false + }, + { + "key": "password", + "name": "AppDynamics user password", + "description": "Enter your [AppDynamics user password](https://docs.appdynamics.com/display/PRO45/API+Clients) here", + "type": "string", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "http://{{account}}.saas.appdynamics.com/controller/rest/applications/5/events?", + "method": "POST", + "headers": [ + { + "name": "user", + "value": "{{username}}@{{account}}:{{password}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/appdynamics/templates/template.json b/integrations/appdynamics/templates/template.json new file mode 100644 index 00000000..13534c71 --- /dev/null +++ b/integrations/appdynamics/templates/template.json @@ -0,0 +1,9 @@ + + [{ + "application_id": "LaunchDarkly", + "summary": "{{title}}", + "comment": "{{comment}}", + "eventtype": "APPLICATION_DEPLOYMENT", + "severity": "INFO" + } +] \ No newline at end of file From 78eaaf946e1bef27fe542d4b586ac4a165318a5c Mon Sep 17 00:00:00 2001 From: Ezra Stevens Date: Fri, 13 Dec 2019 13:11:36 -0800 Subject: [PATCH 137/936] fix grafana headers/tags and add square svg --- .../grafana/assets/images/grafana.svg | 57 +++++++++++++++++++ integrations/grafana/manifest.json | 8 +-- integrations/grafana/templates/template.json | 2 +- 3 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 integrations/grafana/assets/images/grafana.svg diff --git a/integrations/grafana/assets/images/grafana.svg b/integrations/grafana/assets/images/grafana.svg new file mode 100644 index 00000000..e91f3abd --- /dev/null +++ b/integrations/grafana/assets/images/grafana.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index bca73ee5..fae79c66 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -11,8 +11,8 @@ }, "categories": ["monitoring"], "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" + "square": "assets/images/grafana.svg", + "horizontal": "assets/images/grafana.svg" }, "formVariables": [ { @@ -41,9 +41,7 @@ { "name": "Content-Type", "value": "application/json" - } - ], - "headers": [ + }, { "name": "Authorization", "value": "Bearer {{ apiKey }}" diff --git a/integrations/grafana/templates/template.json b/integrations/grafana/templates/template.json index 9e0aebf8..802be140 100644 --- a/integrations/grafana/templates/template.json +++ b/integrations/grafana/templates/template.json @@ -1,5 +1,5 @@ { "time":{{ date }}, - "tags":["{{ kind }}","{{ memberName }}", "{{ action }}", "{{ resourceName }}"], + "tags":["launchdarkly","{{ kind }}","{{ name }}"], "text":"{{ title }}" } From 169b2f77ebaf69c56fad4b4212ed34cc22dca71f Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Fri, 13 Dec 2019 13:21:08 -0800 Subject: [PATCH 138/936] adding trello --- integrations/trello/README.md | 1 + .../trello/assets/images/horizontal.svg | 32 +++++++++++++++++++ integrations/trello/assets/images/square.svg | 1 + integrations/trello/manifest.json | 17 ++++++++++ 4 files changed, 51 insertions(+) create mode 100644 integrations/trello/README.md create mode 100644 integrations/trello/assets/images/horizontal.svg create mode 100644 integrations/trello/assets/images/square.svg create mode 100644 integrations/trello/manifest.json diff --git a/integrations/trello/README.md b/integrations/trello/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/trello/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/trello/assets/images/horizontal.svg b/integrations/trello/assets/images/horizontal.svg new file mode 100644 index 00000000..3253f4e9 --- /dev/null +++ b/integrations/trello/assets/images/horizontal.svg @@ -0,0 +1,32 @@ + + + + trello-logo-blue-flat + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/integrations/trello/assets/images/square.svg b/integrations/trello/assets/images/square.svg new file mode 100644 index 00000000..f8e2bd47 --- /dev/null +++ b/integrations/trello/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json new file mode 100644 index 00000000..0b378576 --- /dev/null +++ b/integrations/trello/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Trello", + "version": "1.0.0", + "overview": "Dark launch new product features directly from within your Trello cards", + "description": "All from the back of your Trello cards, you can now browse and attach feature flags, enable or disable targetting status, and display the status of feature flags.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://trello.com/power-ups/5d795c43ef5f7d1dc307da46/launchdarkly", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["communication-and-collaboration", "issue-tracking", "it-and-project-management"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} From fbd86dc3bcd1e230eca07e6c7199116a28c94c07 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 13 Dec 2019 13:24:41 -0800 Subject: [PATCH 139/936] Fix AppOptics --- integrations/appoptics/manifest.json | 2 +- integrations/appoptics/templates/flag.json | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index e931daa4..da9c4e13 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -40,7 +40,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "https://{{username}}:{{apiKey}}@metrics-api.AppOptics.com/v1/annotations/{{streamName}}", + "url": "https://{{username}}:{{apiKey}}@metrics-api.librato.com/v1/annotations/{{streamName}}", "method": "POST", "headers": [ { diff --git a/integrations/appoptics/templates/flag.json b/integrations/appoptics/templates/flag.json index 06b1e454..b056fdb1 100644 --- a/integrations/appoptics/templates/flag.json +++ b/integrations/appoptics/templates/flag.json @@ -1,7 +1,6 @@ { "title": "{{{title}}}", - "type": "LaunchDarkly", - "url": "https://ld-stg.launchdarkly.com{{_links.site.href}}", + "source": "LaunchDarkly", "links": [ { "label": "{{name}}", @@ -9,4 +8,4 @@ "rel": "launchdarkly" } ] -} \ No newline at end of file +} From ab0d6a8972f67080cc7779ccdec13ab4fda5a2d3 Mon Sep 17 00:00:00 2001 From: azimman Date: Fri, 13 Dec 2019 13:54:15 -0800 Subject: [PATCH 140/936] Pendo integration --- integrations/pendo/README.md | 1 + .../pendo/assets/images/pendo_horizontal.svg | 17 +++++++++++++++++ .../pendo/assets/images/pendo_square.svg | 11 +++++++++++ integrations/pendo/manifest.json | 18 ++++++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 integrations/pendo/README.md create mode 100644 integrations/pendo/assets/images/pendo_horizontal.svg create mode 100644 integrations/pendo/assets/images/pendo_square.svg create mode 100644 integrations/pendo/manifest.json diff --git a/integrations/pendo/README.md b/integrations/pendo/README.md new file mode 100644 index 00000000..f3af4ae2 --- /dev/null +++ b/integrations/pendo/README.md @@ -0,0 +1 @@ +Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more. \ No newline at end of file diff --git a/integrations/pendo/assets/images/pendo_horizontal.svg b/integrations/pendo/assets/images/pendo_horizontal.svg new file mode 100644 index 00000000..328d1287 --- /dev/null +++ b/integrations/pendo/assets/images/pendo_horizontal.svg @@ -0,0 +1,17 @@ + + + + Group + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/integrations/pendo/assets/images/pendo_square.svg b/integrations/pendo/assets/images/pendo_square.svg new file mode 100644 index 00000000..db19607f --- /dev/null +++ b/integrations/pendo/assets/images/pendo_square.svg @@ -0,0 +1,11 @@ + + + + +Group +Created with Sketch. + + diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json new file mode 100644 index 00000000..742cdc40 --- /dev/null +++ b/integrations/pendo/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "Terraform Provider", + "version": "1.0.0", + "overview": "Manage your LaunchDarkly resources as Terraform resources", + "description": "Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "supportWebsite": "https://docs.launchdarkly.com/docs/terraform", + "site": "https://www.terraform.io/docs/providers/launchdarkly/index.html", + "privacyPolicy": "https://app.terraform.io/pages/privacy" + }, + "categories": ["provisioning"], + "icons": { + "square": "assets/images/terraform_square.svg", + "horizontal": "assets/images/terraform_horizontal.svg" + } +} From 63158f1088d111f360807fd4a4947f385c72364a Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Fri, 13 Dec 2019 16:56:52 -0500 Subject: [PATCH 141/936] change ansible site to point to galaxy --- integrations/ansible/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json index 75cdd5e8..f2928fcd 100644 --- a/integrations/ansible/manifest.json +++ b/integrations/ansible/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "supportWebsite": "https://github.com/launchdarkly-labs/ansible-launchdarkly-collection/issues", - "site": "https://launchdarkly-labs.github.io/ansible-launchdarkly-collection/", + "site": "https://galaxy.ansible.com/launchdarkly_labs/collection", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["provisioning", "config-and-deployment", "orchestration"], From b8c50d61dcab4eb44c22109db770db84512452ff Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Fri, 13 Dec 2019 17:15:43 -0500 Subject: [PATCH 142/936] fix handlebars typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7cd92246..f916fc21 100644 --- a/README.md +++ b/README.md @@ -206,7 +206,7 @@ has three properties: `endpoint.headers[].value`) will accept template variables. These template variables can reference any `formVariables` you've defined in your manifest. The templating language we use is based off of - [Handlerbars](https://handlebarsjs.com/) syntax. + [Handlebars](https://handlebarsjs.com/) syntax. 2. [`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates): A map of template paths relative to your integration's directory. These templates can be any file type. From c2e3f9e4b10d69457141764d979a7862f7bb5e94 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Fri, 13 Dec 2019 14:21:35 -0800 Subject: [PATCH 143/936] adding all of the IdP integrations --- integrations/adfs/README.md | 1 + .../adfs/assets/images/horizontal.svg | 17 +++++++++++ integrations/adfs/assets/images/square.svg | 17 +++++++++++ integrations/adfs/manifest.json | 17 +++++++++++ integrations/azure-sso/README.md | 1 + .../azure-sso/assets/images/horizontal.svg | 1 + .../azure-sso/assets/images/square.svg | 1 + integrations/azure-sso/manifest.json | 17 +++++++++++ integrations/googleapps-sso/README.md | 1 + .../assets/images/horizontal.svg | 1 + .../googleapps-sso/assets/images/square.svg | 1 + integrations/googleapps-sso/manifest.json | 17 +++++++++++ integrations/okta/README.md | 1 + .../okta/assets/images/horizontal.svg | 27 ++++++++++++++++++ integrations/okta/assets/images/square.svg | 27 ++++++++++++++++++ integrations/okta/manifest.json | 17 +++++++++++ integrations/onelogin/README.md | 1 + .../onelogin/assets/images/horizontal.svg | 28 +++++++++++++++++++ .../onelogin/assets/images/square.svg | 1 + integrations/onelogin/manifest.json | 17 +++++++++++ 20 files changed, 211 insertions(+) create mode 100644 integrations/adfs/README.md create mode 100644 integrations/adfs/assets/images/horizontal.svg create mode 100644 integrations/adfs/assets/images/square.svg create mode 100644 integrations/adfs/manifest.json create mode 100644 integrations/azure-sso/README.md create mode 100644 integrations/azure-sso/assets/images/horizontal.svg create mode 100644 integrations/azure-sso/assets/images/square.svg create mode 100644 integrations/azure-sso/manifest.json create mode 100644 integrations/googleapps-sso/README.md create mode 100644 integrations/googleapps-sso/assets/images/horizontal.svg create mode 100644 integrations/googleapps-sso/assets/images/square.svg create mode 100644 integrations/googleapps-sso/manifest.json create mode 100644 integrations/okta/README.md create mode 100644 integrations/okta/assets/images/horizontal.svg create mode 100644 integrations/okta/assets/images/square.svg create mode 100644 integrations/okta/manifest.json create mode 100644 integrations/onelogin/README.md create mode 100755 integrations/onelogin/assets/images/horizontal.svg create mode 100644 integrations/onelogin/assets/images/square.svg create mode 100644 integrations/onelogin/manifest.json diff --git a/integrations/adfs/README.md b/integrations/adfs/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/adfs/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/adfs/assets/images/horizontal.svg b/integrations/adfs/assets/images/horizontal.svg new file mode 100644 index 00000000..b8447fcb --- /dev/null +++ b/integrations/adfs/assets/images/horizontal.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/integrations/adfs/assets/images/square.svg b/integrations/adfs/assets/images/square.svg new file mode 100644 index 00000000..b8447fcb --- /dev/null +++ b/integrations/adfs/assets/images/square.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/integrations/adfs/manifest.json b/integrations/adfs/manifest.json new file mode 100644 index 00000000..1ed3853a --- /dev/null +++ b/integrations/adfs/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Active Directory Federation Services (ADFS)", + "version": "1.0.0", + "overview": "Provision your LaunchDarkly users and manage single sign-on (SSO) with ADFS (Enterprise only)", + "description": "Use your ADFS identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/adfs", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["provisioning", "security"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/azure-sso/README.md b/integrations/azure-sso/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/azure-sso/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/azure-sso/assets/images/horizontal.svg b/integrations/azure-sso/assets/images/horizontal.svg new file mode 100644 index 00000000..82ac4834 --- /dev/null +++ b/integrations/azure-sso/assets/images/horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/azure-sso/assets/images/square.svg b/integrations/azure-sso/assets/images/square.svg new file mode 100644 index 00000000..82ac4834 --- /dev/null +++ b/integrations/azure-sso/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/azure-sso/manifest.json b/integrations/azure-sso/manifest.json new file mode 100644 index 00000000..4fefcd33 --- /dev/null +++ b/integrations/azure-sso/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Azure Active Directory", + "version": "1.0.0", + "overview": "Provision your LaunchDarkly users and manage single sign-on (SSO) with Azure (Enterprise only)", + "description": "Use your Azure identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/azure", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["provisioning", "security"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/googleapps-sso/README.md b/integrations/googleapps-sso/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/googleapps-sso/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/googleapps-sso/assets/images/horizontal.svg b/integrations/googleapps-sso/assets/images/horizontal.svg new file mode 100644 index 00000000..8eb8c827 --- /dev/null +++ b/integrations/googleapps-sso/assets/images/horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/googleapps-sso/assets/images/square.svg b/integrations/googleapps-sso/assets/images/square.svg new file mode 100644 index 00000000..06dc52f0 --- /dev/null +++ b/integrations/googleapps-sso/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/googleapps-sso/manifest.json b/integrations/googleapps-sso/manifest.json new file mode 100644 index 00000000..bebde141 --- /dev/null +++ b/integrations/googleapps-sso/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Google Apps", + "version": "1.0.0", + "overview": "Provision your LaunchDarkly users and manage single sign-on (SSO) with Google Apps (Enterprise only)", + "description": "Use your Google Apps identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/google-apps", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["provisioning", "security"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/okta/README.md b/integrations/okta/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/okta/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/okta/assets/images/horizontal.svg b/integrations/okta/assets/images/horizontal.svg new file mode 100644 index 00000000..9771d9b9 --- /dev/null +++ b/integrations/okta/assets/images/horizontal.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/integrations/okta/assets/images/square.svg b/integrations/okta/assets/images/square.svg new file mode 100644 index 00000000..9771d9b9 --- /dev/null +++ b/integrations/okta/assets/images/square.svg @@ -0,0 +1,27 @@ + + + + + diff --git a/integrations/okta/manifest.json b/integrations/okta/manifest.json new file mode 100644 index 00000000..0db38cbb --- /dev/null +++ b/integrations/okta/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Okta", + "version": "1.0.0", + "overview": "Provision your LaunchDarkly users and manage single sign-on (SSO) with Okta (Enterprise only)", + "description": "Use your Okta identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/okta", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["provisioning", "security"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/onelogin/README.md b/integrations/onelogin/README.md new file mode 100644 index 00000000..03f1dbf1 --- /dev/null +++ b/integrations/onelogin/README.md @@ -0,0 +1 @@ +This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/onelogin/assets/images/horizontal.svg b/integrations/onelogin/assets/images/horizontal.svg new file mode 100755 index 00000000..9877b25c --- /dev/null +++ b/integrations/onelogin/assets/images/horizontal.svg @@ -0,0 +1,28 @@ + + + + + + diff --git a/integrations/onelogin/assets/images/square.svg b/integrations/onelogin/assets/images/square.svg new file mode 100644 index 00000000..24983478 --- /dev/null +++ b/integrations/onelogin/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/onelogin/manifest.json b/integrations/onelogin/manifest.json new file mode 100644 index 00000000..4e6af549 --- /dev/null +++ b/integrations/onelogin/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "OneLogin", + "version": "1.0.0", + "overview": "Provision your LaunchDarkly users and manage single sign-on (SSO) with OneLogin (Enterprise only)", + "description": "Use your OneLogin identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/docs/onelogin", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["provisioning", "security"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} From b74fc6485d5db126764bfe76cae4981bbb44c21c Mon Sep 17 00:00:00 2001 From: azimman Date: Fri, 13 Dec 2019 14:24:41 -0800 Subject: [PATCH 144/936] add Consul, fix pendo --- integrations/consul/README.md | 16 +++++++++ .../assets/images/consul_horizontal.svg | 1 + .../consul/assets/images/consul_square.svg | 34 +++++++++++++++++++ integrations/consul/manifest.json | 18 ++++++++++ integrations/pendo/README.md | 2 +- integrations/pendo/manifest.json | 22 ++++++------ 6 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 integrations/consul/README.md create mode 100644 integrations/consul/assets/images/consul_horizontal.svg create mode 100644 integrations/consul/assets/images/consul_square.svg create mode 100644 integrations/consul/manifest.json diff --git a/integrations/consul/README.md b/integrations/consul/README.md new file mode 100644 index 00000000..159fbcac --- /dev/null +++ b/integrations/consul/README.md @@ -0,0 +1,16 @@ +This integration allows you to use a persistent feature store to keep flag data. + +In their default configuration, LaunchDarkly's server-side SDKs: + +- connect to LaunchDarkly and receive feature flag data +- store the flags in memory +- update the in-memory state if LaunchDarkly sends updates + +Flag evaluations always refer to the last known state in memory. This collection of last known flag data is the "feature store." + +This integration allows you to use Consul for this purpose. + +There are two ways to use it: + +- Exactly like the default configuration, except substituting a database for the in-memory store, or +- Using only the database as a source of flag data, without connecting to LaunchDarkly \ No newline at end of file diff --git a/integrations/consul/assets/images/consul_horizontal.svg b/integrations/consul/assets/images/consul_horizontal.svg new file mode 100644 index 00000000..109f0aa7 --- /dev/null +++ b/integrations/consul/assets/images/consul_horizontal.svg @@ -0,0 +1 @@ +Asset 1 \ No newline at end of file diff --git a/integrations/consul/assets/images/consul_square.svg b/integrations/consul/assets/images/consul_square.svg new file mode 100644 index 00000000..3e019a57 --- /dev/null +++ b/integrations/consul/assets/images/consul_square.svg @@ -0,0 +1,34 @@ + + + + +Asset 1 + + + + diff --git a/integrations/consul/manifest.json b/integrations/consul/manifest.json new file mode 100644 index 00000000..ddec88e7 --- /dev/null +++ b/integrations/consul/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "Consul - Feature store", + "version": "1.0.0", + "overview": "Use Consul as your persistant feature store", + "description": "This integration allows you to use Consul as a persistent feature store to keep flag data.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "supportWebsite": "https://docs.launchdarkly.com/docs/using-a-persistent-feature-store#section-using-consul", + "site": "https://docs.launchdarkly.com/docs/using-a-persistent-feature-store#section-using-consul", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["provisioning"], + "icons": { + "square": "assets/images/consul_square.svg", + "horizontal": "assets/images/consul_horizontal.svg" + } +} diff --git a/integrations/pendo/README.md b/integrations/pendo/README.md index f3af4ae2..626b87c1 100644 --- a/integrations/pendo/README.md +++ b/integrations/pendo/README.md @@ -1 +1 @@ -Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more. \ No newline at end of file +Product teams often want to roll out new features iteratively, measuring adoption and collecting feedback from a subset of users before making the feature generally available. Pendo and LaunchDarkly have partnered to help our joint customers use Pendo to better target and engage users during this process. Pendo data such as product adoption, renewal data, and ARR can help target the rollout of features through LaunchDarkly. \ No newline at end of file diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index 742cdc40..9ff28067 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -1,18 +1,18 @@ { - "name": "Terraform Provider", + "name": "Pendo", "version": "1.0.0", - "overview": "Manage your LaunchDarkly resources as Terraform resources", - "description": "Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", + "overview": "Associate your Pendo audiences with LaunchDarkly targeting rules", + "description": "Product teams often want to roll out new features iteratively, measuring adoption and collecting feedback from a subset of users before making the feature generally available. Pendo and LaunchDarkly have partnered to help our joint customers use Pendo to better target and engage users during this process. Pendo data such as product adoption, renewal data, and ARR can help target the rollout of features through LaunchDarkly.", + "author": "Pendo", + "supportEmail": "support@pendo.com", "links": { - "supportWebsite": "https://docs.launchdarkly.com/docs/terraform", - "site": "https://www.terraform.io/docs/providers/launchdarkly/index.html", - "privacyPolicy": "https://app.terraform.io/pages/privacy" + "supportWebsite": "https://support.pendo.io/hc/en-us/articles/360032592312-LaunchDarkly-Recipe-Automate-the-feature-release-process", + "site": "https://support.pendo.io/hc/en-us/articles/360032592312-LaunchDarkly-Recipe-Automate-the-feature-release-process", + "privacyPolicy": "https://www.pendo.io/legal/privacy-policy/" }, - "categories": ["provisioning"], + "categories": ["automation"], "icons": { - "square": "assets/images/terraform_square.svg", - "horizontal": "assets/images/terraform_horizontal.svg" + "square": "assets/images/pendo_square.svg", + "horizontal": "assets/images/pendo_horizontal.svg" } } From 06c6d15e9ca2b7369e6ebe653c3eba7d4e3979b9 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 13 Dec 2019 14:33:12 -0800 Subject: [PATCH 145/936] Minor cleanup --- integrations/okta/assets/images/square.svg | 28 +--------------------- integrations/terraform/manifest.json | 2 +- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/integrations/okta/assets/images/square.svg b/integrations/okta/assets/images/square.svg index 9771d9b9..b2bb1bc8 100644 --- a/integrations/okta/assets/images/square.svg +++ b/integrations/okta/assets/images/square.svg @@ -1,27 +1 @@ - - - - - + diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index 742cdc40..3ac1fd71 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -1,5 +1,5 @@ { - "name": "Terraform Provider", + "name": "Terraform", "version": "1.0.0", "overview": "Manage your LaunchDarkly resources as Terraform resources", "description": "Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more.", From 6f16c97785b34082ad2b2b89261511efb2459014 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 13 Dec 2019 14:33:20 -0800 Subject: [PATCH 146/936] Another minor commit --- integrations/prometheus-pushgateway/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index 0797c370..7becdee8 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -1,5 +1,5 @@ { - "name": "Prometheus Pushgateway", + "name": "Prometheus", "version": "0.0.1", "overview": "Sends events to a Prometheus Pushgateway", "description": "Sends events to a Prometheus Pushgateway or other endpoint that speaks the Prometheus line protocol.", From 32e2ccd7c7bfd0d95de6137afd4e6df15f2b832a Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 13 Dec 2019 14:34:53 -0800 Subject: [PATCH 147/936] Removing Consul --- integrations/consul/README.md | 16 --------- .../assets/images/consul_horizontal.svg | 1 - .../consul/assets/images/consul_square.svg | 34 ------------------- integrations/consul/manifest.json | 18 ---------- 4 files changed, 69 deletions(-) delete mode 100644 integrations/consul/README.md delete mode 100644 integrations/consul/assets/images/consul_horizontal.svg delete mode 100644 integrations/consul/assets/images/consul_square.svg delete mode 100644 integrations/consul/manifest.json diff --git a/integrations/consul/README.md b/integrations/consul/README.md deleted file mode 100644 index 159fbcac..00000000 --- a/integrations/consul/README.md +++ /dev/null @@ -1,16 +0,0 @@ -This integration allows you to use a persistent feature store to keep flag data. - -In their default configuration, LaunchDarkly's server-side SDKs: - -- connect to LaunchDarkly and receive feature flag data -- store the flags in memory -- update the in-memory state if LaunchDarkly sends updates - -Flag evaluations always refer to the last known state in memory. This collection of last known flag data is the "feature store." - -This integration allows you to use Consul for this purpose. - -There are two ways to use it: - -- Exactly like the default configuration, except substituting a database for the in-memory store, or -- Using only the database as a source of flag data, without connecting to LaunchDarkly \ No newline at end of file diff --git a/integrations/consul/assets/images/consul_horizontal.svg b/integrations/consul/assets/images/consul_horizontal.svg deleted file mode 100644 index 109f0aa7..00000000 --- a/integrations/consul/assets/images/consul_horizontal.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 1 \ No newline at end of file diff --git a/integrations/consul/assets/images/consul_square.svg b/integrations/consul/assets/images/consul_square.svg deleted file mode 100644 index 3e019a57..00000000 --- a/integrations/consul/assets/images/consul_square.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - -Asset 1 - - - - diff --git a/integrations/consul/manifest.json b/integrations/consul/manifest.json deleted file mode 100644 index ddec88e7..00000000 --- a/integrations/consul/manifest.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "Consul - Feature store", - "version": "1.0.0", - "overview": "Use Consul as your persistant feature store", - "description": "This integration allows you to use Consul as a persistent feature store to keep flag data.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "supportWebsite": "https://docs.launchdarkly.com/docs/using-a-persistent-feature-store#section-using-consul", - "site": "https://docs.launchdarkly.com/docs/using-a-persistent-feature-store#section-using-consul", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["provisioning"], - "icons": { - "square": "assets/images/consul_square.svg", - "horizontal": "assets/images/consul_horizontal.svg" - } -} From 1ff50da235a93112169597408e258b8723e9d155 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Fri, 13 Dec 2019 14:41:00 -0800 Subject: [PATCH 148/936] update gapps logo --- integrations/googleapps-sso/assets/images/horizontal.svg | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/googleapps-sso/assets/images/horizontal.svg b/integrations/googleapps-sso/assets/images/horizontal.svg index 8eb8c827..3790851d 100644 --- a/integrations/googleapps-sso/assets/images/horizontal.svg +++ b/integrations/googleapps-sso/assets/images/horizontal.svg @@ -1 +1,2 @@ - \ No newline at end of file + + From 9a404e4013d3f7bc073f42b47e0ab4b21a3e6ae5 Mon Sep 17 00:00:00 2001 From: Brian Chung Date: Fri, 13 Dec 2019 15:03:58 -0800 Subject: [PATCH 149/936] adding heap --- integrations/heap/README.md | 1 + .../heap/assets/images/heapanalytics-rect.svg | 1 + .../assets/images/heapanalytics-square.svg | 1 + integrations/heap/manifest.json | 19 +++++++++++++++++++ 4 files changed, 22 insertions(+) create mode 100644 integrations/heap/README.md create mode 100644 integrations/heap/assets/images/heapanalytics-rect.svg create mode 100644 integrations/heap/assets/images/heapanalytics-square.svg create mode 100644 integrations/heap/manifest.json diff --git a/integrations/heap/README.md b/integrations/heap/README.md new file mode 100644 index 00000000..0a9d57cf --- /dev/null +++ b/integrations/heap/README.md @@ -0,0 +1 @@ +Heap Analytics is a web analytics tool that allows you to capture and measure every user action on your website or mobile app including clicks, taps, swipes, page views, form submissions, and more \ No newline at end of file diff --git a/integrations/heap/assets/images/heapanalytics-rect.svg b/integrations/heap/assets/images/heapanalytics-rect.svg new file mode 100644 index 00000000..815c4e16 --- /dev/null +++ b/integrations/heap/assets/images/heapanalytics-rect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/heap/assets/images/heapanalytics-square.svg b/integrations/heap/assets/images/heapanalytics-square.svg new file mode 100644 index 00000000..7053e681 --- /dev/null +++ b/integrations/heap/assets/images/heapanalytics-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json new file mode 100644 index 00000000..72cf13f3 --- /dev/null +++ b/integrations/heap/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "Heap", + "version": "1.0.0", + "overview": "Heap and LaunchDarkly integration", + "description": "To set this up, attach LaunchDarkly's user key and feature flags as user and event properties in Heap.", + "author": "Pendo", + "supportEmail": "support@heap.io", + "links": { + "supportWebsite": "https://docs.oracle.com/en/cloud/saas/data-cloud/data-cloud-help-center/index.html", + "site": "https://docs.heap.io/docs/additional-sources#section-launch-darkly", + "privacyPolicy": "https://heap.io/privacy" + }, + "categories": ["analytics-and-reporting"], + "icons": { + "square": "assets/images/heapanalytics-square.svg", + "horizontal": "assets/images/heapanalytics-rect.svg" + } + } + \ No newline at end of file From 12e63178e135d402bcaaf722115b7495cf6d03bd Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 13 Dec 2019 15:08:53 -0800 Subject: [PATCH 150/936] Update Readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f916fc21..c14af3f1 100644 --- a/README.md +++ b/README.md @@ -338,7 +338,7 @@ when you give us the green light. ## Comments, suggestions, bug reports? -Visit us in our Slack channel +Visit us in our Slack channel: [#ext-integrations](https://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQhttps://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQ) or log an issue or request [here](https://github.com/launchdarkly/ld-integrations/issues). From 32cd52607afcc17f2762cd86952b33e0ac125665 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 13 Dec 2019 15:12:38 -0800 Subject: [PATCH 151/936] Remove dummy char --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c14af3f1..f916fc21 100644 --- a/README.md +++ b/README.md @@ -338,7 +338,7 @@ when you give us the green light. ## Comments, suggestions, bug reports? -Visit us in our Slack channel: +Visit us in our Slack channel [#ext-integrations](https://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQhttps://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQ) or log an issue or request [here](https://github.com/launchdarkly/ld-integrations/issues). From 3955faaa66884c25cd70c3abf8c830b1c7e10f10 Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Mon, 16 Dec 2019 17:37:39 -0800 Subject: [PATCH 152/936] minor signalfx form fixes --- integrations/signalfx/manifest.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index bb7fd6e8..64759825 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -1,8 +1,8 @@ { - "name": "SignalFX", + "name": "SignalFx", "version": "1.0.0", - "overview": "Send audit log events to SignalFX", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to SignalFX.", + "overview": "Send audit log events to SignalFx", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to SignalFx.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { @@ -17,15 +17,15 @@ "formVariables": [ { "key": "accessToken", - "name": "SignalFX access token", - "description": "Enter your [SignalFX access token](https://docs.signalfx.com/en/latest/admin-guide/tokens.html#working-with-access-tokens) here", + "name": "SignalFx access token", + "description": "Enter your [SignalFx access token](https://docs.signalfx.com/en/latest/admin-guide/tokens.html#working-with-access-tokens) here.", "type": "string", "isSecret": true }, { "key": "realm", - "name": "Realm", - "description": "Enter your SignalFX realm as noted on your [profile page](https://app.us1.signalfx.com/#/myprofile).", + "name": "SignalFx realm", + "description": "Enter your SignalFx realm as noted on your [profile page](https://app.us1.signalfx.com/#/myprofile).", "type": "string", "isSecret": false } From 79789bd6c123655e082e1be635931b744403dffb Mon Sep 17 00:00:00 2001 From: Christopher Tarquini Date: Tue, 17 Dec 2019 13:19:47 -0500 Subject: [PATCH 153/936] Add Sentry.io Integration (#8) * Add Sentry.io Integration Adds support for sending LaunchDarkly events to Sentry.io. Caveats: - Currently, it does not send a timestamp because sentry requires it to be in seconds instead of milliseconds. - The `event_id` is padded with 0's to make it match the 32-character UUID requirement for sentry --- .../sentry/assets/images/sentry-banner.svg | 1 + integrations/sentry/assets/images/sentry.svg | 1 + integrations/sentry/manifest.json | 72 +++++++++++++++++++ integrations/sentry/templates/template.json | 31 ++++++++ 4 files changed, 105 insertions(+) create mode 100644 integrations/sentry/assets/images/sentry-banner.svg create mode 100644 integrations/sentry/assets/images/sentry.svg create mode 100644 integrations/sentry/manifest.json create mode 100644 integrations/sentry/templates/template.json diff --git a/integrations/sentry/assets/images/sentry-banner.svg b/integrations/sentry/assets/images/sentry-banner.svg new file mode 100644 index 00000000..59b79bc5 --- /dev/null +++ b/integrations/sentry/assets/images/sentry-banner.svg @@ -0,0 +1 @@ +sentry-logo-black \ No newline at end of file diff --git a/integrations/sentry/assets/images/sentry.svg b/integrations/sentry/assets/images/sentry.svg new file mode 100644 index 00000000..53b613be --- /dev/null +++ b/integrations/sentry/assets/images/sentry.svg @@ -0,0 +1 @@ +sentry-glyph-black \ No newline at end of file diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json new file mode 100644 index 00000000..bd675cb5 --- /dev/null +++ b/integrations/sentry/manifest.json @@ -0,0 +1,72 @@ +{ + "name": "Sentry", + "version": "0.0.1", + "overview": "Send LaunchDarkly Events to Sentry", + "description": "Send flag, environment, and project updates to Sentry.io", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://sentry.io", + "privacyPolicy": "https://sentry.io/privacy/" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/images/sentry.svg", + "horizontal": "assets/images/sentry-banner.svg" + }, + "formVariables": [ + { + "key": "domain", + "name": "Sentry API Domain", + "description": "The Domain part of your Sentry DSN", + "placeholder": "sentry.io", + "defaultValue": "sentry.io", + "type": "string" + }, + { + "key": "publicKey", + "name": "Sentry Public Key", + "description": "Public key part of your Sentry DSN", + "placeholder": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk=", + "type": "string" + }, + { + "key": "projectId", + "name": "Project ID", + "description": "Sentry Project ID you'd like to assicate with LaunchDarkly events", + "placeholder": "123", + "type": "string" + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "https://{{domain}}/api/{{projectId}}/store/", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "X-Sentry-Auth", + "value": "Sentry sentry_version=7, sentry_key={{ publicKey }}" + } + ] + }, + "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "metric": "templates/template.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/sentry/templates/template.json b/integrations/sentry/templates/template.json new file mode 100644 index 00000000..7bf2d9e4 --- /dev/null +++ b/integrations/sentry/templates/template.json @@ -0,0 +1,31 @@ +{ + "event_id": "{{ _id }}00000000", + "culprit": "https://app.launchdarkly.com{{ _links.site.href }}", + "logger": "launchdarkly.integration", + "platform": "other", + "level": "info", + "transaction": "{{ title }}", + "server_name": "app.launchdarkly.com", + "fingerprint": [ + "{{ _links.site.href }}", + "{{ kind }}", + "{{ name }}", + "{{ title }}" + ], + + "tags": { + "source": "launchdarkly", + "launchdarkly_kind": "{{ kind }}", + "launchdarkly_name": "{{ name }}" + }, + + "message": { + "formatted": "{{ title }}\n{{ description }}\n\n{{ comment }}" + }, + "user": { + "id": "launchdarkly/member/{{ member._id }}", + "email": "{{ member.email }}", + "Member Name": "{{ member.firstName }} {{ member.lastName }}" + } + +} \ No newline at end of file From 4987f34505f98f11f9075abeb325ef411ddf204a Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 17 Dec 2019 11:39:51 -0800 Subject: [PATCH 154/936] Update logdna template to use app formVariable --- integrations/logdna/templates/template.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json index 5a115d47..9770625a 100644 --- a/integrations/logdna/templates/template.json +++ b/integrations/logdna/templates/template.json @@ -1,10 +1,10 @@ -{ - "lines": [ - { - "line":"{{{title}}}{{#if comment}}, Comment: {{comment}}{{/if}}", - "app":"test-app", - "level": "INFO", - "env": "production" - } - ] - } \ No newline at end of file +{ + "lines": [ + { + "line": "{{{title}}}{{#if comment}}, Comment: {{comment}}{{/if}}", + "app": "{{formVariables.app}}", + "level": "INFO", + "env": "production" + } + ] +} From 35d763257c00b6b3848f98a48b3f6d945310f78a Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Wed, 18 Dec 2019 11:17:07 -0800 Subject: [PATCH 155/936] Cleaning up Sentry images --- integrations/sentry/assets/images/sentry-banner.svg | 4 +++- integrations/sentry/assets/images/sentry.svg | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/integrations/sentry/assets/images/sentry-banner.svg b/integrations/sentry/assets/images/sentry-banner.svg index 59b79bc5..984a84eb 100644 --- a/integrations/sentry/assets/images/sentry-banner.svg +++ b/integrations/sentry/assets/images/sentry-banner.svg @@ -1 +1,3 @@ -sentry-logo-black \ No newline at end of file + + + diff --git a/integrations/sentry/assets/images/sentry.svg b/integrations/sentry/assets/images/sentry.svg index 53b613be..d3f083f1 100644 --- a/integrations/sentry/assets/images/sentry.svg +++ b/integrations/sentry/assets/images/sentry.svg @@ -1 +1,3 @@ -sentry-glyph-black \ No newline at end of file + + + From 1bdb2da67c477b44c79c36412c03d3b13b4d2bd6 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 18 Dec 2019 17:30:23 -0800 Subject: [PATCH 156/936] Update circle config to deploy to new environment buckets --- .circleci/config.yml | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b7f66249..a57aebf8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,23 +24,36 @@ jobs: - run: name: Run tests command: yarn test - deploy: + deploy-to-s3: machine: enabled: true steps: - checkout - aws-cli/install - - deploy: + - run: + name: Deploy to production bucket + command: ./scripts/copy_to_s3.sh + environment: + BUCKET_NAME: launchdarkly-integrations + - run: + name: Deploy to staging bucket + command: ./scripts/copy_to_s3.sh + environment: + BUCKET_NAME: launchdarkly-integrations-staging + - run: + name: Deploy to catfood bucket command: ./scripts/copy_to_s3.sh + environment: + BUCKET_NAME: launchdarkly-integrations-catamorphic workflows: version: 2.1 build-and-deploy: jobs: - build - - deploy: + - deploy-to-s3: requires: - build filters: branches: - only: master \ No newline at end of file + only: master From 916edae204ed6888b6b9a10bd05342c48321d2d6 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 19 Dec 2019 13:24:58 -0800 Subject: [PATCH 157/936] Adding CODEOWNERS file --- CODEOWNERS | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..f61386c2 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,7 @@ +# These owners will be the default owners for everything in the repo. +* @launchdarkly/integrations + +integrations/sample-integrations @launchdarkly/integrations + +# Specify the owner of the integrations below. Follow this format: +# integrations/ <@github-username or email> From 1bbe7dca46905f111d379977bebb783004c6404b Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 19 Dec 2019 14:19:38 -0800 Subject: [PATCH 158/936] Add readme to include validation and pre-commit --- README.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f916fc21..438c8df7 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ configuration. The first part of the manifest describes your organization, contacts, URLs, and a few things we need to list your integration properly: + ``` { "name": "Sample Integration", @@ -73,6 +74,7 @@ a few things we need to list your integration properly: ... } ``` + The example above describes the basic information about your integration. We will use most of the information above when rendering your integration configuration form inside the LaunchDarkly UI. @@ -83,7 +85,6 @@ There are a few properties in the manifest that can accept simple This markdown format will get converted to HTML in LaunchDarkly's UI. Only use simple markdown structures like links and basic text formatting. - Notice that the [`icons`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#icons) described above are in SVG format. This is intentional. Your organization's (or @@ -106,9 +107,9 @@ your `README.md` as documentation to your integration. Most integrations will need to collect one or more pieces of configuration data that supports the integration. Some examples include: -* API token -* Webhook endpoint -* URLs +- API token +- Webhook endpoint +- URLs To support these configurations, you can describe a set of [`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) @@ -162,6 +163,7 @@ event in another service. Here's an example of an Audit Log Event Hook capability that subscribes to flag events in a LaunchDarkly account: + ``` { ... @@ -196,6 +198,7 @@ events in a LaunchDarkly account: ... } ``` + The [`auditLogEventsHook`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook) has three properties: @@ -223,6 +226,7 @@ runtime. The main ones are the `endpoint.url` and the `endpoint.headers[].value`. This will allow you to configure a dynamic endpoint based on the `formVariables` your integration collects from the user. Here are some examples: + ``` This first example will utilize the `endpointUrl` formVariable as the URL of the endpoint and use the `apiToken` as a `Bearer` token in the `Authorization` header. ... @@ -258,6 +262,7 @@ Before the `auditLogEventsHook` capability sends the request to the endpoint handling your webhook, you have the option to transform the body of the request sent to your handler. If you don't provide one or more templates, LaunchDarkly will send you a default JSON payload that looks like this: + ``` { "_links": { @@ -311,6 +316,7 @@ will send you a default JSON payload that looks like this: } } ``` + However, if you choose to provide one or more [`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates), LaunchDarkly will render your template using the context data above. Your @@ -328,7 +334,12 @@ helpers](https://github.com/aymerick/raymond#built-in-helpers): `if`, `unless`, To test your templates, you can use the [Handlebars Sandbox](http://tryhandlebarsjs.com/). -### Step 7: Submitting your integration +### Step 7: Validating your integration + +Run `npm install` to install the validation dependencies. Run `npm test` to run the validation suite. In addition, we +recommend install pre-commit hooks with `pre-commit install` to have the validation suite run before every commit. + +### Step 8: Submitting your integration Once you're done with your integration, [submit a pull request against this repo](https://github.com/launchdarkly/ld-integrations/pull/new/master). Your From ba06018348ea04823295da563eac07398b87ff0d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 20 Dec 2019 11:00:54 -0800 Subject: [PATCH 159/936] Change name of production bucket --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a57aebf8..4ce35a4b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -34,7 +34,7 @@ jobs: name: Deploy to production bucket command: ./scripts/copy_to_s3.sh environment: - BUCKET_NAME: launchdarkly-integrations + BUCKET_NAME: launchdarkly-integrations-production - run: name: Deploy to staging bucket command: ./scripts/copy_to_s3.sh From 5355bfde7a4b8d92476c7f29f823ad4e51b86981 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 23 Dec 2019 14:59:08 -0800 Subject: [PATCH 160/936] Update templates to use timestamp.milliseconds instead of date --- .pre-commit-config.yaml | 2 +- integrations/grafana/templates/template.json | 2 +- integrations/signalfx/templates/template.json | 10 +++++----- integrations/splunk/templates/template.json | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0b1f94ed..7785d533 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: hooks: - id: check-merge-conflict - id: check-json - exclude: "\\.vscode/launch.json" + files: "integrations/*/manifest.json" - id: check-symlinks - id: trailing-whitespace - id: end-of-file-fixer diff --git a/integrations/grafana/templates/template.json b/integrations/grafana/templates/template.json index 802be140..8ee04195 100644 --- a/integrations/grafana/templates/template.json +++ b/integrations/grafana/templates/template.json @@ -1,5 +1,5 @@ { - "time":{{ date }}, + "time":{{ timestamp.milliseconds }}, "tags":["launchdarkly","{{ kind }}","{{ name }}"], "text":"{{ title }}" } diff --git a/integrations/signalfx/templates/template.json b/integrations/signalfx/templates/template.json index 071d308d..aa258e7f 100644 --- a/integrations/signalfx/templates/template.json +++ b/integrations/signalfx/templates/template.json @@ -1,8 +1,8 @@ - [{ + [{ "category": "AUDIT", - "dimensions": { - "environment": "production", + "dimensions": { + "environment": "production", "project": "ben-dev", "flag": "{{name}}", "kind": "{{kind}}", @@ -10,5 +10,5 @@ "comment": "{{comment}}" }, "eventType": "LaunchDarkly {{kind}} change", - "timestamp": {{date}} -}] \ No newline at end of file + "timestamp": {{timestamp.milliseconds}} +}] diff --git a/integrations/splunk/templates/template.json b/integrations/splunk/templates/template.json index 819fc872..eb8be071 100644 --- a/integrations/splunk/templates/template.json +++ b/integrations/splunk/templates/template.json @@ -1,6 +1,6 @@ { "sourcetype":"launchdarkly", - "time":"{{date}}", + "time":"{{timestamp.milliseconds}}", "event": { "kind":"{{kind}}", "name":"{{name}}", From 1e192643dc88bd5943f9f0b917cb1b3f50411ff0 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 23 Dec 2019 15:00:32 -0800 Subject: [PATCH 161/936] Update readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 438c8df7..2737701d 100644 --- a/README.md +++ b/README.md @@ -285,7 +285,10 @@ will send you a default JSON payload that looks like this: }, "_id": "5defebd006121dd9f7ea90d0", "_accountId": "", - "date": 1576004560130, + "timestamp": { + "milliseconds": 1576004560130, + "seconds": 1576004560, + }, "kind": "flag", "name": "Example test", "description": "", From c8410dbd6de7002c521d4c6f8600f554dee3fa0b Mon Sep 17 00:00:00 2001 From: Adam Zimman Date: Mon, 30 Dec 2019 16:15:05 -0800 Subject: [PATCH 162/936] adding marketing blurb from Dynatrace --- integrations/dynatrace/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/integrations/dynatrace/README.md b/integrations/dynatrace/README.md index e69de29b..e96a1b21 100644 --- a/integrations/dynatrace/README.md +++ b/integrations/dynatrace/README.md @@ -0,0 +1,3 @@ +Dynatrace is a software-intelligence monitoring platform that simplifies enterprise cloud complexity and accelerates digital transformation. With Davis (the Dynatrace AI causation engine) and complete automation, the Dynatrace all-in-one platform provides answers, not just data, about the performance of your applications, their underlying infrastructure, and the experience of your end users. Dynatrace is used to modernize and automate enterprise cloud operations, release higher-quality software faster, and deliver optimum digital experiences to your organization's customers. + +Dynatrace seamlessly brings infrastructure and cloud, application performance, and digital experience monitoring into an all-in-one, automated solution that's powered by artificial intelligence. Dynatrace assists in driving performance results by providing development, operations, and business teams with a shared platform, metrics. In this way, Dynatrace can serve as your organization's single "source of truth." From bbb7f5cb6a75f9c5e9b40911329918b7d76a66e1 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 3 Jan 2020 14:57:51 -0800 Subject: [PATCH 163/936] [ch52545] Validate and test integration manifests contributed to ld-integrations (#12) --- .nvm | 1 + .pre-commit-config.yaml | 4 +- CODEOWNERS | 5 - __tests__/validate.js | 80 + integrations/datadog/manifest.json | 2 +- .../assets/images/horizontal.svg | 4 + package.json | 14 +- yarn.lock | 3821 ++++++++++++++--- 8 files changed, 3431 insertions(+), 500 deletions(-) create mode 100644 .nvm create mode 100644 __tests__/validate.js create mode 100644 integrations/sample-integration/assets/images/horizontal.svg diff --git a/.nvm b/.nvm new file mode 100644 index 00000000..b1bd38b6 --- /dev/null +++ b/.nvm @@ -0,0 +1 @@ +13 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0b1f94ed..bade57b5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,6 +13,6 @@ repos: hooks: - id: validate-manifests name: Validate manifests - entry: yarn run test-single + entry: yarn test language: system - files: "integrations/.*manifest.json" + pass_filenames: false diff --git a/CODEOWNERS b/CODEOWNERS index f61386c2..af8cb6ae 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,7 +1,2 @@ # These owners will be the default owners for everything in the repo. * @launchdarkly/integrations - -integrations/sample-integrations @launchdarkly/integrations - -# Specify the owner of the integrations below. Follow this format: -# integrations/ <@github-username or email> diff --git a/__tests__/validate.js b/__tests__/validate.js new file mode 100644 index 00000000..a0f66845 --- /dev/null +++ b/__tests__/validate.js @@ -0,0 +1,80 @@ +const { readdirSync, existsSync } = require('fs'); +const Ajv = require('ajv'); +const _ = require('lodash'); + +const schema = require('../manifest.schema.json'); + +const getDirectories = source => + readdirSync(source, { withFileTypes: true }) + .filter(dir => dir.isDirectory()) + .map(dir => dir.name); + +let manifests = []; +const ajv = new Ajv(); +const validate = ajv.compile(schema); + +const integrationDirs = getDirectories('integrations'); +integrationDirs.forEach(dir => { + const manifest = require(`../integrations/${dir}/manifest.json`); + manifests.push([dir, manifest]); +}); + +describe('All integrations', () => { + test.each(manifests)('Validate %s/manifest.json', (key, manifest) => { + const res = validate(manifest); + expect(validate.errors).toBe(null); + expect(res).toBe(true); + }); + + test.each(manifests)('Icons exist for %s', (key, manifest) => { + expect(existsSync(`./integrations/${key}/${manifest.icons.square}`)).toBe( + true + ); + expect( + existsSync(`./integrations/${key}/${manifest.icons.horizontal}`) + ).toBe(true); + }); + + test.each(manifests)('Templates exist for %s', (key, manifest) => { + const flagTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.flag', + null + ); + const projectTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.project', + null + ); + const environmentTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.environment', + null + ); + const metricTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.metric', + null + ); + if (flagTemplatePath) { + expect(existsSync(`./integrations/${key}/${flagTemplatePath}`)).toBe( + true + ); + } + if (projectTemplatePath) { + expect(existsSync(`./integrations/${key}/${projectTemplatePath}`)).toBe( + true + ); + } + if (environmentTemplatePath) { + expect( + existsSync(`./integrations/${key}/${environmentTemplatePath}`) + ).toBe(true); + } + if (metricTemplatePath) { + expect(existsSync(`./integrations/${key}/${metricTemplatePath}`)).toBe( + true + ); + } + }); +}); diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 1a0a3f44..90d6eadf 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -12,7 +12,7 @@ "categories": ["apm", "monitoring", "alerts"], "icons": { "square": "assets/images/dd_icon_rgb.svg", - "horizontal": "assets/images/dd_logo_h_rbg.svg" + "horizontal": "assets/images/dd_logo_h_rgb.svg" }, "formVariables": [ { diff --git a/integrations/sample-integration/assets/images/horizontal.svg b/integrations/sample-integration/assets/images/horizontal.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/sample-integration/assets/images/horizontal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/package.json b/package.json index 97036286..99b8d7d2 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,7 @@ "main": "index.js", "scripts": { "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md", - "test": "ajv test -s manifest.schema.json -d **/manifest.json --valid --errors=json", - "test-single": "ajv test --valid --errors=json -s manifest.schema.json -d" + "test": "jest" }, "repository": { "type": "git", @@ -18,9 +17,16 @@ "url": "https://github.com/launchdarkly/ld-integrations/issues" }, "homepage": "https://github.com/launchdarkly/ld-integrations#readme", - "dependencies": {}, "devDependencies": { "@adobe/jsonschema2md": "3.3.1", - "ajv-cli": "3.0.0" + "ajv": "^6.10.2", + "jest": "24.9.0", + "lodash": "^4.17.15" + }, + "prettier": { + "trailingComma": "es5", + "tabWidth": 2, + "semi": true, + "singleQuote": true } } diff --git a/yarn.lock b/yarn.lock index 4fada4f8..9464e1ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,9 +35,293 @@ valid-url "1.0.9" "@arr/every@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@arr/every/-/every-1.0.0.tgz#314f8168f50ae48a032cfdad5fdb436f464a97ac" - integrity sha1-MU+BaPUK5IoDLP2tX9tDb0ZKl6w= + version "1.0.1" + resolved "https://registry.yarnpkg.com/@arr/every/-/every-1.0.1.tgz#22fe1f8e6355beca6c7c7bde965eb15cf994387b" + integrity sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.1.0": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" + integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.7" + "@babel/helpers" "^7.7.4" + "@babel/parser" "^7.7.7" + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.7.4", "@babel/generator@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" + integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== + dependencies: + "@babel/types" "^7.7.4" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-function-name@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" + integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== + dependencies: + "@babel/helper-get-function-arity" "^7.7.4" + "@babel/template" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/helper-get-function-arity@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" + integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-split-export-declaration@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" + integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== + dependencies: + "@babel/types" "^7.7.4" + +"@babel/helpers@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" + integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== + dependencies: + "@babel/template" "^7.7.4" + "@babel/traverse" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.4", "@babel/parser@^7.7.7": + version "7.7.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" + integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" + integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/template@^7.4.0", "@babel/template@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" + integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" + integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.4" + "@babel/helper-function-name" "^7.7.4" + "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/parser" "^7.7.4" + "@babel/types" "^7.7.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" + integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" "@polka/url@^0.5.0": version "0.5.0" @@ -51,17 +335,24 @@ dependencies: tslib "^1.9.3" -"@snyk/cli-interface@^2.0.3", "@snyk/cli-interface@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.1.0.tgz#2e7ecd9457c91b78ce3e5b91451e823f218a25af" - integrity sha512-b/magC8iNQP9QhSDeV9RQDSaY3sNy57k0UH1Y/sMOSvVLHLsA7dOi/HrPWTiLouyGqcuYzwjkz7bNbu8cwmVDQ== +"@snyk/cli-interface@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.2.0.tgz#5536bc913917c623d16d727f9f3759521a916026" + integrity sha512-sA7V2JhgqJB9z5uYotgQc5iNDv//y+Mdm39rANxmFjtZMSYJZHkP80arzPjw1mB5ni/sWec7ieYUUFeySZBfVg== dependencies: tslib "^1.9.3" -"@snyk/cocoapods-lockfile-parser@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-2.0.4.tgz#296421454ba2ee9248ce1f13da57aa1b10b54de7" - integrity sha512-d57bajPjqCiNXMuyMmt9Zt98zbjABZUFw+91B705flzV6oB7OThgtA40Eoin6iatYoStIx28bC3T6b0mScy/iA== +"@snyk/cli-interface@2.3.0", "@snyk/cli-interface@^2.0.3": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.3.0.tgz#9d38f815a5cf2be266006954c2a058463d531e08" + integrity sha512-ecbylK5Ol2ySb/WbfPj0s0GuLQR+KWKFzUgVaoNHaSoN6371qRWwf2uVr+hPUP4gXqCai21Ug/RDArfOhlPwrQ== + dependencies: + tslib "^1.9.3" + +"@snyk/cocoapods-lockfile-parser@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-3.0.0.tgz#514b744cedd9d3d3efb2a5d06fce1662fec2ff1a" + integrity sha512-AebCc+v9vtOL9tFkU4/tommgVsXxqdx6t45kCkBW+FC4PaYvfYEg9Eg/9GqlY9+nFrLFo/uTr+E/aR0AF/KqYA== dependencies: "@snyk/dep-graph" "^1.11.0" "@snyk/ruby-semver" "^2.0.4" @@ -71,17 +362,17 @@ source-map-support "^0.5.7" tslib "^1.9.3" -"@snyk/composer-lockfile-parser@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@snyk/composer-lockfile-parser/-/composer-lockfile-parser-1.0.3.tgz#4b703883ec36f3cec63c64355031e06698c771f5" - integrity sha512-hb+6E7kMzWlcwfe//ILDoktBPKL2a3+RnJT/CXnzRXaiLQpsdkf5li4q2v0fmvd+4v7L3tTN8KM+//lJyviEkg== +"@snyk/composer-lockfile-parser@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@snyk/composer-lockfile-parser/-/composer-lockfile-parser-1.2.0.tgz#62c6d88c6a39c55dda591854f5380923a993182f" + integrity sha512-kZT+HTqgNcQMeoE5NM9M3jj463M8zI7ZxqZXLw9WoyVs5JTt9g0qFWxIG1cNwZdGVI+y7tzZbNWw9BlMD1vCCQ== dependencies: lodash "^4.17.13" -"@snyk/dep-graph@1.12.0": - version "1.12.0" - resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.12.0.tgz#aa0df8549849a4857bc5510e839da268293e4750" - integrity sha512-n7+PlHn3SqznHgsCpeBRfEvU1oiQydoGkXQlnSB2+tfImiKXvY7YZbrg4wlbvYgylYiTbpCi5CpPNkJG14S+UQ== +"@snyk/dep-graph@1.13.1": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.13.1.tgz#45721f7e21136b62d1cdd99b3319e717d9071dfb" + integrity sha512-Ww2xvm5UQgrq9eV0SdTBCh+w/4oI2rCx5vn1IOSeypaR0CO4p+do1vm3IDZ2ugg4jLSfHP8+LiD6ORESZMkQ2w== dependencies: graphlib "^2.1.5" lodash "^4.7.14" @@ -90,17 +381,17 @@ source-map-support "^0.5.11" tslib "^1.9.3" -"@snyk/dep-graph@1.13.0", "@snyk/dep-graph@^1.11.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.13.0.tgz#855f628da0b833dd16c02c2f977507bbf090b894" - integrity sha512-e0XcLH6Kgs/lunf6iDjbxEnm9+JYFEJn6eo/PlEUW+SMWBZ2uEXHBTDNp9oxjJou48PngzWMveEkniBAN+ulOQ== +"@snyk/dep-graph@^1.11.0", "@snyk/dep-graph@^1.13.1": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.15.0.tgz#67bf790bc9f0eee36ad7dad053465cdd928ce223" + integrity sha512-GdF/dvqfKRVHqQio/tSkR4GRpAqIglLPEDZ+XlV7jT5btq9+Fxq2h25Lmm/a7sw+ODTOOqNhTF9y8ASc9VIhww== dependencies: graphlib "^2.1.5" lodash "^4.7.14" object-hash "^1.3.1" semver "^6.0.0" source-map-support "^0.5.11" - tslib "^1.9.3" + tslib "^1.10.0" "@snyk/gemfile@1.2.0": version "1.2.0" @@ -114,14 +405,14 @@ dependencies: lodash "^4.17.14" -"@snyk/snyk-cocoapods-plugin@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-1.0.3.tgz#eb685590e6a478e1d86f1042c9493426f2f9764a" - integrity sha512-AHAA7z23nPi1eHODsDxeSkl73Ze3yphuqJjMl39ie323EzBDcb9g6uAACrk0Qn2K/K2D8uyxMAf2zDtc+JGQfw== +"@snyk/snyk-cocoapods-plugin@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-2.0.1.tgz#be8660c854d551a56baa9d072bb4ae7f188cc1cd" + integrity sha512-XVkvaMvMzQ3miJi/YZmsRJSAUfDloYhfg6pXPgzAeAugB4p+cNi01Z68pT62ypB8U/Ugh1Xx2pb9aoOFqBbSjA== dependencies: "@snyk/cli-interface" "1.5.0" - "@snyk/cocoapods-lockfile-parser" "2.0.4" - "@snyk/dep-graph" "1.13.0" + "@snyk/cocoapods-lockfile-parser" "3.0.0" + "@snyk/dep-graph" "^1.13.1" source-map-support "^0.5.7" tslib "^1.9.3" @@ -133,6 +424,39 @@ "@types/events" "*" "@types/node" "*" +"@types/babel__core@^7.1.0": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" + integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== + dependencies: + "@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.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" + integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== + dependencies: + "@babel/types" "^7.3.0" + "@types/bunyan@*": version "1.8.6" resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.6.tgz#6527641cca30bedec5feb9ab527b7803b8000582" @@ -150,20 +474,40 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" + integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + "@types/js-yaml@^3.12.1": version "3.12.1" resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656" integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA== "@types/node@*": - version "12.7.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.12.tgz#7c6c571cc2f3f3ac4a59a5f2bd48f5bdbc8653cc" - integrity sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ== + version "13.1.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.2.tgz#fe94285bf5e0782e1a9e5a8c482b1c34465fa385" + integrity sha512-B8emQA1qeKerqd1dmIsQYnXi+mmAzTB7flExjmy5X1aVAKFNNNDubkavwR13kR6JnpeLp3aLoJhwn9trWPAyFQ== "@types/node@^6.14.4": - version "6.14.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.7.tgz#2173f79d7a61d97d3aad2feeaac7ac69a3df39af" - integrity sha512-YbPXbaynBTe0pVExPhL76TsWnxSPeFAvImIsmylpBWn/yfw+lHy+Q68aawvZHsgskT44ZAoeE67GM5f+Brekew== + version "6.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.9.tgz#733583e21ef0eab85a9737dfafbaa66345a92ef0" + integrity sha512-leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w== "@types/restify@^4.3.6": version "4.3.6" @@ -178,6 +522,11 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + "@types/xml2js@0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.3.tgz#2f41bfc74d5a4022511721f872ed395a210ad3b7" @@ -186,47 +535,71 @@ "@types/events" "*" "@types/node" "*" +"@types/yargs-parser@*": + version "13.1.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" + integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== + +"@types/yargs@^13.0.0": + version "13.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.4.tgz#53d231cebe1a540e7e13727fc1f0d13ad4a9ba3b" + integrity sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A== + dependencies: + "@types/yargs-parser" "*" + "@yarnpkg/lockfile@^1.0.2": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + abbrev@1, abbrev@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -ajv-cli@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ajv-cli/-/ajv-cli-3.0.0.tgz#5823231f64e2833054130690b18099609e980f29" - integrity sha1-WCMjH2TigzBUEwaQsYCZYJ6YDyk= - dependencies: - ajv "^6.0.0" - ajv-pack "^0.3.0" - fast-json-patch "^0.5.6" - glob "^7.0.3" - json-schema-migrate "^0.2.0" - minimist "^1.2.0" +acorn-globals@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" -ajv-pack@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/ajv-pack/-/ajv-pack-0.3.1.tgz#b72c4d4219e3928e62842d742ded93bf50796560" - integrity sha1-tyxNQhnjko5ihC10Le2Tv1B5ZWA= +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + +agent-base@4, agent-base@^4.2.0, agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== dependencies: - js-beautify "^1.6.4" - require-from-string "^1.2.0" + es6-promisify "^5.0.0" -ajv@^5.0.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= +agent-base@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" + es6-promisify "^5.0.0" -ajv@^6.0.0, ajv@^6.10.2: +ajv@^6.10.2, ajv@^6.5.5: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -236,14 +609,6 @@ ajv@^6.0.0, ajv@^6.10.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ambi@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/ambi/-/ambi-2.5.0.tgz#7c8e372be48891157e7cea01cb6f9143d1f74220" - integrity sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA= - dependencies: - editions "^1.1.1" - typechecker "^4.3.0" - ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -251,7 +616,7 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-escapes@3.2.0, ansi-escapes@^3.2.0: +ansi-escapes@3.2.0, ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -266,7 +631,7 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.1.0: +ansi-regex@^4.0.0, ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -283,11 +648,32 @@ ansicolors@^0.3.2: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -295,25 +681,174 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -async@^1.4.0, async@~1.5.2: +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types@0.x.x: + version "0.13.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" + integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" + integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88" + integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A== + dependencies: + readable-stream "^3.0.1" + bluebird@^3.5.5: - version "3.7.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.0.tgz#56a6a886e03f6ae577cffedeb524f8f2450293cf" - integrity sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg== + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== boxen@^1.2.1: version "1.3.0" @@ -336,11 +871,71 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + 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" + +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -351,17 +946,34 @@ camelcase@^4.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + capture-stack-trace@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + centra@^2.2.1: version "2.4.0" resolved "https://registry.yarnpkg.com/centra/-/centra-2.4.0.tgz#53846f97db27705e9f90c46e0f824f6eb697e2d1" integrity sha512-AWmF3EHNe/noJHviynZOrdnUuQzT5AMgl9nJPXGvnzGXrI2ZvNDrEcdqskc4EtQwt2Q1IggXb0OXy7zZ1Xvvew== -chalk@^2.0.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -375,11 +987,31 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +chownr@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" + integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -392,6 +1024,11 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" +cli-spinner@0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/cli-spinner/-/cli-spinner-0.2.10.tgz#f7d617a36f5c47a7bc6353c697fc9338ff782a47" + integrity sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q== + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -406,6 +1043,15 @@ cliui@^3.0.3: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + clone-deep@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8" @@ -426,6 +1072,14 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -443,24 +1097,28 @@ colorette@^1.1.0: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7" integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg== -commander@^2.19.0: +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -config-chain@^1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - configstore@^3.0.0, configstore@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" @@ -473,12 +1131,29 @@ configstore@^3.0.0, configstore@^3.1.2: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +convert-source-map@^1.4.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + core-js@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09" - integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw== + version "3.6.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.1.tgz#39d5e2e346258cc01eb7d44345b1c3c014ca3f05" + integrity sha512-186WjSik2iTGfDjfdCZAxv2ormxtKgemjC3SI6PL31qOA0j5LhTDVjHChccoc7brwLvpvLPiMyRlcO88C4l1QQ== -core-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= @@ -515,18 +1190,60 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= -csextends@^1.0.3: +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-uri-to-buffer@1: version "1.2.0" - resolved "https://registry.yarnpkg.com/csextends/-/csextends-1.2.0.tgz#6374b210984b54d4495f29c99d3dd069b80543e5" - integrity sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg== + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835" + integrity sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ== + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" -debug@*, debug@^4.1.1: +debug@*, debug@4, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" +debug@2, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -534,16 +1251,26 @@ debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: dependencies: ms "^2.1.1" -decamelize@^1.1.1: +decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -551,6 +1278,67 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +degenerator@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" + integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU= + dependencies: + ast-types "0.x.x" + escodegen "1.x.x" + esprima "3.x.x" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + diff@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" @@ -563,6 +1351,13 @@ dockerfile-ast@0.0.16: dependencies: vscode-languageserver-types "^3.5.0" +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + dot-prop@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" @@ -570,15 +1365,15 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" -dotnet-deps-parser@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/dotnet-deps-parser/-/dotnet-deps-parser-4.5.0.tgz#53ef53a058dec156fcdf9008b880ecc9675ddde0" - integrity sha512-t6rBxcWVZSDNhhWdsbq9ozaCzfPXV79FiyES1JLNEoA7nYF+zDC2VZvFZSnH8ilU3bghJXxZPH+EcKYvfw8g/g== +dotnet-deps-parser@4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/dotnet-deps-parser/-/dotnet-deps-parser-4.9.0.tgz#d14f9f92ae9a64062cd215c8863d1e77e80236f0" + integrity sha512-V0O+7pI7Ei+iL5Kgy6nYq1UTwzrpqci5K/zf8cXyP5RWBSQBUl/JOE9I67zLUkKiwOdfPhbMQgcRj/yGA+NL1A== dependencies: "@types/xml2js" "0.4.3" lodash "^4.17.11" source-map-support "^0.5.7" - tslib "^1.9.3" + tslib "^1.10.0" xml2js "0.4.19" duplexer3@^0.1.4: @@ -586,40 +1381,18 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -eachr@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/eachr/-/eachr-2.0.4.tgz#466f7caa10708f610509e32c807aafe57fc122bf" - integrity sha1-Rm98qhBwj2EFCeMsgHqv5X/BIr8= - dependencies: - typechecker "^2.0.8" - -editions@^1.1.1, editions@^1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" - integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== - -editions@^2.1.0, editions@^2.1.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/editions/-/editions-2.2.0.tgz#dacd0c2a9441ebef592bba316a6264febb337f35" - integrity sha512-RYg3iEA2BDLCNVe8PUkD+ox5vAKxB9XS/mAhx1bdxGCF0CpX077C0pyTA9t5D6idCYA3avl5/XDHKPsHFrygfw== - dependencies: - errlop "^1.1.2" - semver "^6.3.0" - -editorconfig@^0.15.3: - version "0.15.3" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" - integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: - commander "^2.19.0" - lru-cache "^4.1.5" - semver "^5.6.0" - sigmund "^1.0.1" + jsbn "~0.1.0" + safer-buffer "^2.1.0" ejs@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228" - integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ== + version "2.7.4" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" + integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== email-validator@^2.0.4: version "2.0.4" @@ -636,56 +1409,101 @@ emoji-regex@^7.0.1: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== -end-of-stream@^1.1.0: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -errlop@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/errlop/-/errlop-1.1.2.tgz#a99a48f37aa264d614e342ffdbbaa49eec9220e0" - integrity sha512-djkRp+urJ+SmqDBd7F6LUgm4Be1TTYBxia2bhjNdFBuBDQtJDHExD2VbxR6eyst3h1TZy3qPRCdqb6FBoFttTA== +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: - editions "^2.1.3" + is-arrayish "^0.2.1" -es-abstract@^1.5.1: - version "1.15.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.15.0.tgz#8884928ec7e40a79e3c9bc812d37d10c8b24cc57" - integrity sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ== +es-abstract@^1.17.0-next.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== dependencies: - es-to-primitive "^1.2.0" + es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.0" - is-callable "^1.1.4" - is-regex "^1.0.4" - object-inspect "^1.6.0" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" object-keys "^1.1.1" - string.prototype.trimleft "^2.1.0" - string.prototype.trimright "^2.1.0" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" -es-to-primitive@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" - integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escodegen@1.x.x, escodegen@^1.9.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.1.tgz#08770602a74ac34c7a90ca9229e7d51e379abc76" + integrity sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@3.x.x, esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -execa@^0.7.0: +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= @@ -711,12 +1529,55 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -extendr@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/extendr/-/extendr-2.1.0.tgz#301aa0bbea565f4d2dc8f570f2a22611a8527b56" - integrity sha1-MBqgu+pWX00tyPVw8qImEahSe1Y= +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: - typechecker "~2.0.1" + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.0.3: version "3.1.0" @@ -727,37 +1588,56 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extract-opts@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/extract-opts/-/extract-opts-2.2.0.tgz#1fa28eba7352c6db480f885ceb71a46810be6d7d" - integrity sha1-H6KOunNSxttID4hc63GkaBC+bX0= - dependencies: - typechecker "~2.0.1" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-json-patch@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-0.5.7.tgz#b5a8f49d259624596ef98b872f3fda895b4d8665" - integrity sha1-taj0nSWWJFlu+YuHLz/aiVtNhmU= - fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" ferrum@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/ferrum/-/ferrum-1.4.1.tgz#234bcfe2b4fda2a0f8a3221c0e103defc7c13681" - integrity sha512-LaSFwwkAtRGcgJxAyE7wYTJHQrfKHWpOO0ay1HQD8qRoTLBwE6+vTI4FTUZNf4TGgNPhLALn6Kv3FdYdgoIPUQ== + version "1.5.0" + resolved "https://registry.yarnpkg.com/ferrum/-/ferrum-1.5.0.tgz#e2b6008547813832af77387288a7886e47a60509" + integrity sha512-yTooIyzJOXDRXY/ROvKBw3dgLOBMxJuI2boZvpITdQ7hVB7z89tw+4w66EJjnGpbTDnPanjnYn3aW9E5ZoPmSg== dependencies: lodash.isplainobject "4.0.6" @@ -768,12 +1648,34 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +file-uri-to-path@1, file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + for-in@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= -for-in@^1.0.1: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= @@ -790,16 +1692,84 @@ foreach@^2.0.4: resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@^1.2.7: + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +ftp@~0.3.10: + version "0.3.10" + resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" + integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= + dependencies: + readable-stream "1.1.x" + xregexp "2.0.0" + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -812,6 +1782,30 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-uri@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.4.tgz#d4937ab819e218d4cb5ae18e4f5962bef169cc6a" + integrity sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q== + dependencies: + data-uri-to-buffer "1" + debug "2" + extend "~3.0.2" + file-uri-to-path "1" + ftp "~0.3.10" + readable-stream "2" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + git-up@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" @@ -834,7 +1828,7 @@ github-slugger@^1.2.1: dependencies: emoji-regex ">=6.0.0 <=6.1.1" -glob@^7.0.3: +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -846,29 +1840,6 @@ glob@^7.0.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.3: - version "7.1.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - 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" - -glob@~6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -876,6 +1847,11 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -893,71 +1869,173 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@*, graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" - integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== graphlib@^2.1.1, graphlib@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.7.tgz#b6a69f9f44bd9de3963ce6804a2fc9e73d86aecc" - integrity sha512-TyI9jIy2J4j0qgPmOOrHTCtpPqJGN/aurBwc6ZT+bRii+di1I+Wv3obRhVrmBEXet+qkMaEX67dXrwsd3QQM6w== + version "2.1.8" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" + integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== + dependencies: + lodash "^4.17.15" + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +handlebars@^4.1.2: + version "4.5.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" + integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== dependencies: - lodash "^4.17.5" + ajv "^6.5.5" + har-schema "^2.0.0" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.0: +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" - integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" -has@^1.0.1, has@^1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" -hosted-git-info@^2.7.1: +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: version "2.8.5" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +http-errors@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-proxy-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== + dependencies: + agent-base "4" + debug "3.1.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-proxy-agent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" + integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + i18n@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.8.3.tgz#2d8cf1c24722602c2041d01ba6ae5eaa51388f0e" - integrity sha1-LYzxwkciYCwgQdAbpq5eqlE4jw4= + version "0.8.4" + resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.8.4.tgz#948e1ee7ddefef18b2785969388e097327031bd0" + integrity sha512-PvMcG+yqYWXrwgdmCpL+APCGa8lRY0tdlo2cXp9UeR3u4h1bJGqFsgybfmG/MqtL1iDmdaPPPLJebXGrZ1XoMQ== dependencies: debug "*" - make-plural "^3.0.3" - math-interval-parser "^1.1.0" - messageformat "^0.3.1" + make-plural "^6.0.1" + math-interval-parser "^2.0.1" + messageformat "^2.3.0" mustache "*" - sprintf-js ">=1.0.3" + sprintf-js "^1.1.2" -iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -ignorefs@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ignorefs/-/ignorefs-1.2.0.tgz#da59fb858976e4a5e43702ccd1f282fdbc9e5756" - integrity sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y= +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== dependencies: - editions "^1.3.3" - ignorepatterns "^1.1.0" - -ignorepatterns@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ignorepatterns/-/ignorepatterns-1.1.0.tgz#ac8f436f2239b5dfb66d5f0d3a904a87ac67cc5e" - integrity sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4= + minimatch "^3.0.4" immediate@~3.0.5: version "3.0.6" @@ -969,6 +2047,14 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -982,7 +2068,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1011,20 +2097,51 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +ip@1.1.5, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== is-ci@^1.0.10: version "1.2.1" @@ -1033,16 +2150,62 @@ is-ci@^1.0.10: dependencies: ci-info "^1.5.0" +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== -is-extendable@^0.1.1: +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -1055,6 +2218,11 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -1068,6 +2236,13 @@ is-npm@^1.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -1080,7 +2255,7 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-object@^2.0.1: +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -1097,12 +2272,12 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== dependencies: - has "^1.0.1" + has "^1.0.3" is-retry-allowed@^1.0.0: version "1.2.0" @@ -1122,18 +2297,33 @@ is-stream@^1.0.0, is-stream@^1.1.0: integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== dependencies: - has-symbols "^1.0.0" + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= -isarray@~1.0.0: +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -1143,11 +2333,68 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^3.0.1: +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + dependencies: + handlebars "^4.1.2" + jasmine-reporters@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz#898818ffc234eb8b3f635d693de4586f95548d43" @@ -1163,16 +2410,364 @@ jasmine-xml-reporter@^1.2.1: dependencies: jasmine-reporters "^2.2.0" -js-beautify@^1.6.4: - version "1.10.2" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.2.tgz#88c9099cd6559402b124cfab18754936f8a7b178" - integrity sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ== +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== dependencies: - config-chain "^1.1.12" - editorconfig "^0.15.3" + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" glob "^7.1.3" - mkdirp "~0.5.1" - nopt "~4.0.1" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest@24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.13.1" @@ -1182,6 +2777,53 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + json-pointer@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.0.tgz#8e500550a6aac5464a473377da57aa6cc22828d7" @@ -1189,23 +2831,38 @@ json-pointer@^0.6.0: dependencies: foreach "^2.0.4" -json-schema-migrate@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/json-schema-migrate/-/json-schema-migrate-0.2.0.tgz#ba47a5b0072fc72396460e1bd60b44d52178bbc6" - integrity sha1-ukelsAcvxyOWRg4b1gtE1SF4u8Y= - dependencies: - ajv "^5.0.0" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + jszip@^3.1.5: version "3.2.2" resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.2.tgz#b143816df7e106a9597a94c77493385adca5bd1d" @@ -1223,13 +2880,35 @@ kind-of@^2.0.1: dependencies: is-buffer "^1.0.2" -kind-of@^3.2.2: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0, kind-of@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -1249,6 +2928,24 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + lie@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" @@ -1256,6 +2953,24 @@ lie@~3.3.0: dependencies: immediate "~3.0.5" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -1296,17 +3011,29 @@ lodash.set@^4.3.2: resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@^4.7.14: +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.7.14: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.5: +lru-cache@^4.0.0, lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -1314,6 +3041,13 @@ lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.5: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + macos-release@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" @@ -1326,13 +3060,45 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" -make-plural@^3.0.3, make-plural@~3.0.3: - version "3.0.6" - resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-3.0.6.tgz#2033a03bac290b8f3bb91258f65b9df7e8b01ca7" - integrity sha1-IDOgO6wpC487uRJY9lud9+iwHKc= +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-plural@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735" + integrity sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA== optionalDependencies: minimist "^1.2.0" +make-plural@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-6.0.1.tgz#ed3839fac3f469ebbe505751d48fe3319769edfc" + integrity sha512-h0uBNi4tpDkiWUyYKrJNj8Kif6q3Ba5zp/8jnfPy3pQE+4XcTj6h3eZM5SYVUyDNX9Zk69Isr/dx0I+78aJUaQ== + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + matchit@^1.0.0: version "1.0.8" resolved "https://registry.yarnpkg.com/matchit/-/matchit-1.0.8.tgz#9a129e38f79b2053dd75339215b19e1f6bb88efb" @@ -1340,30 +3106,72 @@ matchit@^1.0.0: dependencies: "@arr/every" "^1.0.0" -math-interval-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-1.1.0.tgz#dbeda5b06b3249973c6df6170fde2386f0afd893" - integrity sha1-2+2lsGsySZc8bfYXD94jhvCv2JM= - dependencies: - xregexp "^2.0.0" +math-interval-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-2.0.1.tgz#e22cd6d15a0a7f4c03aec560db76513da615bed4" + integrity sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA== -messageformat@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-0.3.1.tgz#e58fff8245e9b3971799e5b43db58b3e9417f5a2" - integrity sha1-5Y//gkXps5cXmeW0PbWLPpQX9aI= - dependencies: - async "~1.5.2" - glob "~6.0.4" - make-plural "~3.0.3" - nopt "~3.0.6" - watchr "~2.4.13" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +messageformat-formatters@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz#0492c1402a48775f751c9b17c0354e92be012b08" + integrity sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg== + +messageformat-parser@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-4.1.2.tgz#fd34ec39912a14868a1595eaeb742485ab8ab372" + integrity sha512-7dWuifeyldz7vhEuL96Kwq1fhZXBW+TUfbnHN4UCrCxoXQTYjHnR78eI66Gk9LaLLsAvzPNVJBaa66DRfFNaiA== + +messageformat@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-2.3.0.tgz#de263c49029d5eae65d7ee25e0754f57f425ad91" + integrity sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w== + dependencies: + make-plural "^4.3.0" + messageformat-formatters "^2.0.1" + messageformat-parser "^4.1.2" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + 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" + +mime-db@1.42.0: + version "1.42.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" + integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.25" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" + integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== + dependencies: + mime-db "1.42.0" mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -"minimatch@2 || 3", minimatch@^3.0.4: +minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -1375,7 +3183,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.2.0: +minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -1385,6 +3193,29 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mixin-object@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" @@ -1393,28 +3224,60 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@^0.5.1, mkdirp@~0.5.1: +mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== mustache@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.1.0.tgz#9fba26e7aefc5709f07ff585abb7e0abced6c372" - integrity sha512-3Bxq1R5LBZp7fbFPZzFe5WN4s0q3+gxZaZuZVY+QctYJiCiVgXHOTIC0/HgZuOPFt/6BQcx5u0H2CUOxT/RoGQ== + version "3.2.1" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" + integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + nconf@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.10.0.tgz#da1285ee95d0a922ca6cee75adcf861f48205ad2" @@ -1425,7 +3288,7 @@ nconf@^0.10.0: secure-keys "^1.0.0" yargs "^3.19.0" -needle@^2.2.4: +needle@^2.2.1, needle@^2.2.4, needle@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== @@ -1434,19 +3297,59 @@ needle@^2.2.4: iconv-lite "^0.4.4" sax "^1.2.4" +neo-async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +netmask@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" + integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nopt@~3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== dependencies: - abbrev "1" + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" -nopt@~4.0.1: +node-pre-gyp@*: + version "0.14.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" + integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4.4.2" + +nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= @@ -1454,11 +3357,48 @@ nopt@~4.0.1: abbrev "1" osenv "^0.1.4" +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + normalize-url@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.1.6: + version "1.4.7" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.7.tgz#9e954365a06b80b18111ea900945af4f88ed4848" + integrity sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -1466,33 +3406,91 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.0.7: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-hash@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" - integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== dependencies: define-properties "^1.1.2" - es-abstract "^1.5.1" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -1523,6 +3521,18 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + 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-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -1556,11 +3566,72 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-limit@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-map@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pac-proxy-agent@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz#115b1e58f92576cac2eba718593ca7b0e37de2ad" + integrity sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ== + dependencies: + agent-base "^4.2.0" + debug "^4.1.1" + get-uri "^2.0.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^3.0.0" + pac-resolver "^3.0.0" + raw-body "^2.2.0" + socks-proxy-agent "^4.0.1" + +pac-resolver@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-3.0.0.tgz#6aea30787db0a891704deb7800a722a7615a6f26" + integrity sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA== + dependencies: + co "^4.6.0" + degenerator "^1.0.4" + ip "^1.1.5" + netmask "^1.0.6" + thunkify "^2.1.2" + package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -1576,6 +3647,14 @@ pako@~1.0.2: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-path@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.1.tgz#0ec769704949778cb3b8eda5e994c32073a1adff" @@ -1594,6 +3673,21 @@ parse-url@^5.0.0: parse-path "^4.0.0" protocols "^1.4.0" +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -1609,23 +3703,64 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + phin@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/phin/-/phin-3.4.0.tgz#479df2ecfbbc2b8a6039852970b8b15a78da5169" - integrity sha512-wueoW9X6HbzBN4AqV3Etv9kkgYyaObwPTsIYsUEmgDWiLI6SzYozEsOZ5e3Hd/9H0mrIUbqUuvOTA6SCqErJrQ== + version "3.4.1" + resolved "https://registry.yarnpkg.com/phin/-/phin-3.4.1.tgz#b023d14fa86fc6e4b40b6d0dfd5fe478c9c1bbb8" + integrity sha512-NkBCNRPxeyrgaPlWx4DHTAdca3s2LkvIBiiG6RoSbykcOtW/pA/7rUP/67FPIinvbo7h+HENST/vJ17LdRNUdw== dependencies: centra "^2.2.1" -picomatch@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" - integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== +picomatch@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" + integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + polka@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/polka/-/polka-0.5.2.tgz#588bee0c5806dbc6c64958de3a1251860e9f2e26" @@ -1634,15 +3769,35 @@ polka@^0.5.2: "@polka/url" "^0.5.0" trouter "^2.0.1" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= prettier@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" process-nextick-args@~2.0.0: version "2.0.1" @@ -1656,16 +3811,33 @@ process-nextick-args@~2.0.0: dependencies: asap "~2.0.3" -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= +prompts@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" + integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.3" protocols@^1.1.0, protocols@^1.4.0: version "1.4.7" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32" integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== +proxy-agent@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-3.1.1.tgz#7e04e06bf36afa624a1540be247b47c970bd3014" + integrity sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw== + dependencies: + agent-base "^4.2.0" + debug "4" + http-proxy-agent "^2.1.0" + https-proxy-agent "^3.0.0" + lru-cache "^5.1.1" + pac-proxy-agent "^3.0.1" + proxy-from-env "^1.0.0" + socks-proxy-agent "^4.0.1" + proxy-from-env@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" @@ -1676,6 +3848,11 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= +psl@^1.1.24, psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -1684,12 +3861,32 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0: +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -rc@^1.0.1, rc@^1.1.6: +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +raw-body@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -1699,7 +3896,39 @@ rc@^1.0.1, rc@^1.1.6: minimist "^1.2.0" strip-json-comments "~2.0.1" -readable-stream@~2.3.6: +react-is@^16.8.4: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@1.1.x: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@2, readable-stream@^2.0.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -1712,12 +3941,36 @@ readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.1, readable-stream@^3.1.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.3.tgz#d6e011ed5b9240a92f08651eeb40f7942ceb6cc1" - integrity sha512-ZOsfTGkjO2kqeR5Mzr5RYDbTGYneSkdNKX2fOX2P5jF7vMrd/GNnIAUtDldeHHumHUCQ3V05YfWUdxMPAsRu9Q== + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: - picomatch "^2.0.4" + extend-shallow "^3.0.2" + safe-regex "^1.1.0" registry-auth-token@^3.0.1: version "3.4.0" @@ -1734,10 +3987,101 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" -require-from-string@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + 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.0" + 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.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.10.0, resolve@^1.3.2: + version "1.14.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" + integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== + dependencies: + path-parse "^1.0.6" restore-cursor@^2.0.0: version "2.0.0" @@ -1747,13 +4091,23 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -rimraf@^2.6.3: +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -1762,13 +4116,13 @@ run-async@^2.2.0: is-promise "^2.1.0" rxjs@^6.4.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" - integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -1778,32 +4132,38 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safefs@^3.1.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/safefs/-/safefs-3.2.2.tgz#8170c1444d7038e08caea05a374fae2fa349e15c" - integrity sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw= +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: - graceful-fs "*" + ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@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" + sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scandirectory@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/scandirectory/-/scandirectory-2.5.0.tgz#6ce03f54a090b668e3cbedbf20edf9e310593e72" - integrity sha1-bOA/VKCQtmjjy+2/IO354xBZPnI= - dependencies: - ignorefs "^1.0.0" - safefs "^3.1.2" - taskgroup "^4.0.5" - secure-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca" @@ -1816,21 +4176,41 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -semver@^5.0.3, semver@^5.1.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + set-immediate-shim@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + shallow-clone@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" @@ -1853,16 +4233,61 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -sigmund@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +sisteransi@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" + integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +smart-buffer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + snyk-config@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-2.2.3.tgz#8e09bb98602ad044954d30a9fc1695ab5b6042fa" @@ -1872,14 +4297,15 @@ snyk-config@^2.2.1: lodash "^4.17.15" nconf "^0.10.0" -snyk-docker-plugin@1.29.1: - version "1.29.1" - resolved "https://registry.yarnpkg.com/snyk-docker-plugin/-/snyk-docker-plugin-1.29.1.tgz#4ae989e5084eef744b371f88b2890a8d971ab871" - integrity sha512-Mucc1rZ7l0U8Dykr5m6HPjau8b2H8JVtVaXGbKSZD6e/47JDJhudkgrWjsS5Yt/Zdp1weE3+4SguftFiVR971A== +snyk-docker-plugin@1.33.1: + version "1.33.1" + resolved "https://registry.yarnpkg.com/snyk-docker-plugin/-/snyk-docker-plugin-1.33.1.tgz#9fe0acf9964ed3bc49721163ed88de32b212ed05" + integrity sha512-xfs3DN1tPMTh6J8x2341wGK4HRr+pI5+i/YRuRmsslnBnwk/DkKYcbt8zOIWk6kzMoW8vo+9LqqXBQO/24szKg== dependencies: debug "^4.1.1" dockerfile-ast "0.0.16" semver "^6.1.0" + tar-stream "^2.1.0" tslib "^1" snyk-go-parser@1.3.1: @@ -1901,12 +4327,12 @@ snyk-go-plugin@1.11.1: tmp "0.0.33" tslib "^1.10.0" -snyk-gradle-plugin@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/snyk-gradle-plugin/-/snyk-gradle-plugin-3.1.0.tgz#7e24b5da2210f18e2476a94a3b5586405c3ac262" - integrity sha512-789Rqyhv1+WYbfy1Qilgsw0FMccedSaCO5n+54CXXGVUZWMsVvqJj3T8k7+vis+9Eq+Sgbdzti8vDtApz6rWWQ== +snyk-gradle-plugin@3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/snyk-gradle-plugin/-/snyk-gradle-plugin-3.2.2.tgz#703484bec39390d8bd9ca89a408deb77fd63122a" + integrity sha512-ijIWsypbtpdTuRcYTFsnEWbaBnhCc7q0iIg0A4OcOW/xLyInPwyfBMnip4ubNfHAS/PrvzgfwwwJhttcQD0ZaQ== dependencies: - "@snyk/cli-interface" "^2.1.0" + "@snyk/cli-interface" "2.2.0" "@types/debug" "^4.1.4" chalk "^2.4.2" clone-deep "^0.3.0" @@ -1922,33 +4348,38 @@ snyk-module@1.9.1, snyk-module@^1.6.0, snyk-module@^1.9.1: debug "^3.1.0" hosted-git-info "^2.7.1" -snyk-mvn-plugin@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/snyk-mvn-plugin/-/snyk-mvn-plugin-2.4.0.tgz#b653050a4095feccffc1b9387dc3a3f2f1aa69da" - integrity sha512-Fmt6Mjx6zZz+4q6PnBkhuNGhEX++q/pKMI26ls4p3JPkx4KxBz89oncpkmf7P8YCkoaka8oHhtDEv/R4Z9LleQ== +snyk-mvn-plugin@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/snyk-mvn-plugin/-/snyk-mvn-plugin-2.7.0.tgz#39996df2a878b16a7e3cbe5b63a7c43855031d49" + integrity sha512-DLBt+6ZvtoleXE7Si3wAa6gdPSWsXdIQEY6m2zW2InN9WiaRwIEKMCY822eFmRPZVNNmZNRUIeQsoHZwv/slqQ== dependencies: + "@snyk/cli-interface" "2.2.0" + debug "^4.1.1" lodash "^4.17.15" + needle "^2.4.0" + tmp "^0.1.0" tslib "1.9.3" -snyk-nodejs-lockfile-parser@1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.16.0.tgz#1c1d0aba4643830901ef999415816e7a92b0974d" - integrity sha512-cf3uozRXEG88nsjOQlo+SfOJPpcLs45qpnuk2vhBBZ577IMnV+fTOJQsP2YRiikLUbdgkVlduviwUO6OVn1PhA== +snyk-nodejs-lockfile-parser@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.17.0.tgz#709e1d8c83faccae3bfdac5c10620dcedbf8c4ac" + integrity sha512-i4GAYFj9TJLOQ8F+FbIJuJWdGymi8w/XcrEX0FzXk7DpYUCY3mWibyKhw8RasfYBx5vLwUzEvRMaQuc2EwlyfA== dependencies: "@yarnpkg/lockfile" "^1.0.2" graphlib "^2.1.5" lodash "^4.17.14" + p-map "2.1.0" source-map-support "^0.5.7" tslib "^1.9.3" uuid "^3.3.2" -snyk-nuget-plugin@1.12.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/snyk-nuget-plugin/-/snyk-nuget-plugin-1.12.1.tgz#a57becf9e60593f8b94c4b8717069521748b9a2e" - integrity sha512-QuANQxBjTGj3hEf2YpEQ0WuI4Yq/93boqWUs4eoSTfDyBRFgIkUP6fLkzNldrkL8fQbcagqQ2Xz8M9IEKRQtMg== +snyk-nuget-plugin@1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/snyk-nuget-plugin/-/snyk-nuget-plugin-1.16.0.tgz#241c6c8a417429c124c3ebf6db314a14eb8eed89" + integrity sha512-OEusK3JKKpR4Yto5KwuqjQGgb9wAhmDqBWSQomWdtKQVFrzn5B6BMzOFikUzmeMTnUGGON7gurQBLXeZZLhRqg== dependencies: debug "^3.1.0" - dotnet-deps-parser "4.5.0" + dotnet-deps-parser "4.9.0" jszip "^3.1.5" lodash "^4.17.14" snyk-paket-parser "1.5.0" @@ -1962,12 +4393,13 @@ snyk-paket-parser@1.5.0: dependencies: tslib "^1.9.3" -snyk-php-plugin@1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/snyk-php-plugin/-/snyk-php-plugin-1.6.4.tgz#c3470aea2f185d2f3417cfc5e966ecf7fd1efa20" - integrity sha512-FFQeimtbwq17nDUS0o0zuKgyjXSX7SpoC9iYTeKvxTXrmKf2QlxTtPvmMM4/hQxehEu1i40ow1Ozw0Ahxm8Dpw== +snyk-php-plugin@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/snyk-php-plugin/-/snyk-php-plugin-1.7.0.tgz#cf1906ed8a10db134c803be3d6e4be0cbdc5fe33" + integrity sha512-mDe90xkqSEVrpx1ZC7ItqCOc6fZCySbE+pHVI+dAPUmf1C1LSWZrZVmAVeo/Dw9sJzJfzmcdAFQl+jZP8/uV0A== dependencies: - "@snyk/composer-lockfile-parser" "1.0.3" + "@snyk/cli-interface" "2.2.0" + "@snyk/composer-lockfile-parser" "1.2.0" tslib "1.9.3" snyk-policy@1.13.5: @@ -1985,10 +4417,10 @@ snyk-policy@1.13.5: snyk-try-require "^1.3.1" then-fs "^2.0.0" -snyk-python-plugin@^1.13.3: - version "1.13.3" - resolved "https://registry.yarnpkg.com/snyk-python-plugin/-/snyk-python-plugin-1.13.3.tgz#34587001de2cca8fb400f3f21110c29b39a80e83" - integrity sha512-Ud7mHmpMG4uCChvYLx5jA8HwOV/FNpT65xTxSt+6wsOjIUTuLiqM86mbvgzgk3pir8vMP9yQEsCi1i0zYLBArw== +snyk-python-plugin@1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/snyk-python-plugin/-/snyk-python-plugin-1.16.0.tgz#0eae3c085a87b7d91f8097f598571104c01e0f08" + integrity sha512-IA53xOcy1s881tbIrIXNqIuCNozd4PAVWN8oF0xgRn2NQbq0e7EWt7kFPJbmZodpLCDpXaKKqV2MHbXruFIsrw== dependencies: "@snyk/cli-interface" "^2.0.3" tmp "0.0.33" @@ -2024,14 +4456,15 @@ snyk-resolve@1.0.1, snyk-resolve@^1.0.0, snyk-resolve@^1.0.1: debug "^3.1.0" then-fs "^2.0.0" -snyk-sbt-plugin@2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/snyk-sbt-plugin/-/snyk-sbt-plugin-2.8.0.tgz#6812e1df1c311e99a7aa565559032c7511d1e4d4" - integrity sha512-ZzyBdND5CsaO0xkv05geZXu8Dd6Llvr/5oTj811U7h7UmrvljrAiABW4RGjRJPrPVuuJaDej2p633sgGtK9UsA== +snyk-sbt-plugin@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/snyk-sbt-plugin/-/snyk-sbt-plugin-2.11.0.tgz#f5469dcf5589e34575fc901e2064475582cc3e48" + integrity sha512-wUqHLAa3MzV6sVO+05MnV+lwc+T6o87FZZaY+43tQPytBI2Wq23O3j4POREM4fa2iFfiQJoEYD6c7xmhiEUsSA== dependencies: + debug "^4.1.1" semver "^6.1.2" tmp "^0.1.0" - tree-kill "^1.2.1" + tree-kill "^1.2.2" tslib "^1.10.0" snyk-tree@^1.0.0: @@ -2052,19 +4485,20 @@ snyk-try-require@1.3.1, snyk-try-require@^1.1.1, snyk-try-require@^1.3.1: then-fs "^2.0.0" snyk@^1.226.1: - version "1.234.0" - resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.234.0.tgz#b368d9a2c137778ff5f84bb600fbe312a1515068" - integrity sha512-A/F6hB/Gyh7bxAueXxuF9/tvQ5xyrma5v6SnEY5ZBRGJtpIcolVY0KQRgbbjTRjYuO/2vI5Kd1vVhSj6WGud3g== + version "1.272.0" + resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.272.0.tgz#854a545ed14a415560a57b36b065023dd590e621" + integrity sha512-fs2i8rj0gf+azC/8YOLIM9lrKZKtu5JYkL065Hge95KDWzzSQMpZWdec1qqN/uTvzZ0b89303Lh/+MuY//br1Q== dependencies: - "@snyk/cli-interface" "^2.0.3" - "@snyk/dep-graph" "1.12.0" + "@snyk/cli-interface" "2.3.0" + "@snyk/dep-graph" "1.13.1" "@snyk/gemfile" "1.2.0" - "@snyk/snyk-cocoapods-plugin" "1.0.3" + "@snyk/snyk-cocoapods-plugin" "2.0.1" "@types/agent-base" "^4.2.0" "@types/restify" "^4.3.6" abbrev "^1.1.1" ansi-escapes "3.2.0" chalk "^2.4.2" + cli-spinner "0.2.10" configstore "^3.1.2" debug "^3.1.0" diff "^4.0.1" @@ -2075,22 +4509,23 @@ snyk@^1.226.1: needle "^2.2.4" opn "^5.5.0" os-name "^3.0.0" + proxy-agent "^3.1.1" proxy-from-env "^1.0.0" semver "^6.0.0" snyk-config "^2.2.1" - snyk-docker-plugin "1.29.1" + snyk-docker-plugin "1.33.1" snyk-go-plugin "1.11.1" - snyk-gradle-plugin "3.1.0" + snyk-gradle-plugin "3.2.2" snyk-module "1.9.1" - snyk-mvn-plugin "2.4.0" - snyk-nodejs-lockfile-parser "1.16.0" - snyk-nuget-plugin "1.12.1" - snyk-php-plugin "1.6.4" + snyk-mvn-plugin "2.7.0" + snyk-nodejs-lockfile-parser "1.17.0" + snyk-nuget-plugin "1.16.0" + snyk-php-plugin "1.7.0" snyk-policy "1.13.5" - snyk-python-plugin "^1.13.3" + snyk-python-plugin "1.16.0" snyk-resolve "1.0.1" snyk-resolve-deps "4.4.0" - snyk-sbt-plugin "2.8.0" + snyk-sbt-plugin "2.11.0" snyk-tree "^1.0.0" snyk-try-require "1.3.1" source-map-support "^0.5.11" @@ -2101,20 +4536,90 @@ snyk@^1.226.1: uuid "^3.3.2" wrap-ansi "^5.1.0" -source-map-support@^0.5.11, source-map-support@^0.5.7: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== +socks-proxy-agent@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" + integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== + dependencies: + agent-base "~4.2.1" + socks "~2.3.2" + +socks@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" + integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== + dependencies: + ip "1.1.5" + smart-buffer "^4.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.11, source-map-support@^0.5.6, source-map-support@^0.5.7: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0: +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sprintf-js@>=1.0.3: +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== @@ -2124,6 +4629,52 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + 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" + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -2133,7 +4684,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -2141,7 +4692,7 @@ string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0: +string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -2150,22 +4701,34 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.trimleft@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" - integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== dependencies: define-properties "^1.1.3" function-bind "^1.1.1" -string.prototype.trimright@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" - integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== dependencies: define-properties "^1.1.3" function-bind "^1.1.1" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -2194,6 +4757,11 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -2211,13 +4779,41 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -taskgroup@^4.0.5, taskgroup@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/taskgroup/-/taskgroup-4.3.1.tgz#7de193febd768273c457730497024d512c27915a" - integrity sha1-feGT/r12gnPEV3MElwJNUSwnkVo= +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: - ambi "^2.2.0" - csextends "^1.0.3" + has-flag "^3.0.0" + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tar-stream@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" + integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== + dependencies: + bl "^3.0.0" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^4.4.2: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" temp-dir@^1.0.0: version "1.0.0" @@ -2239,6 +4835,16 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + then-fs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/then-fs/-/then-fs-2.0.0.tgz#72f792dd9d31705a91ae19ebfcf8b3f968c81da2" @@ -2246,11 +4852,21 @@ then-fs@^2.0.0: dependencies: promise ">=3.2 <8" +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +thunkify@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" + integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= + timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -2270,15 +4886,78 @@ tmp@^0.1.0: dependencies: rimraf "^2.6.3" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + toml@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== -tree-kill@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" - integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== trouter@^2.0.1: version "2.0.1" @@ -2297,22 +4976,42 @@ tslib@^1, tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -typechecker@^2.0.8: - version "2.1.0" - resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.1.0.tgz#d1c2093a54ff8a19f58cff877eeaa54f2242d383" - integrity sha1-0cIJOlT/ihn1jP+HfuqlTyJC04M= +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" -typechecker@^4.3.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-4.7.0.tgz#5249f427358f45b7250c4924fd4d01ed9ba435e9" - integrity sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ== +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: - editions "^2.1.0" + prelude-ls "~1.1.2" -typechecker@~2.0.1: - version "2.0.8" - resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-2.0.8.tgz#e83da84bb64c584ccb345838576c40b0337db82e" - integrity sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4= +uglify-js@^3.1.4: + version "3.7.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.3.tgz#f918fce9182f466d5140f24bb0ff35c2d32dcc6a" + integrity sha512-7tINm46/3puUA4hCkKYo4Xdts+JDaVC9ZPRcG8Xw9R4nhO/gZgUM3TENq8IF4Vatk8qCig4MzP/c8G4u2BkVQg== + dependencies: + commander "~2.20.3" + source-map "~0.6.1" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" unique-string@^1.0.0: version "1.0.0" @@ -2321,6 +5020,19 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" @@ -2349,6 +5061,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -2356,12 +5073,17 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" -util-deprecate@~1.0.1: +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@~1.0.0: +util.promisify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== @@ -2379,32 +5101,96 @@ valid-url@1.0.9: resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + vscode-languageserver-types@^3.5.0: version "3.14.0" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz#d3b5952246d30e5241592b6dde8280e03942e743" integrity sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A== -watchr@~2.4.13: - version "2.4.13" - resolved "https://registry.yarnpkg.com/watchr/-/watchr-2.4.13.tgz#d74847bb4d6f90f61fe2c74f9f68662aa0e07601" - integrity sha1-10hHu01vkPYf4sdPn2hmKqDgdgE= - dependencies: - eachr "^2.0.2" - extendr "^2.1.0" - extract-opts "^2.2.0" - ignorefs "^1.0.0" - safefs "^3.1.2" - scandirectory "^2.5.0" - taskgroup "^4.2.0" - typechecker "^2.0.8" - -which@^1.2.9: +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + widest-line@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" @@ -2424,6 +5210,11 @@ windows-release@^3.1.0: dependencies: execa "^1.0.0" +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -2451,6 +5242,15 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write-file-atomic@^2.0.0: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" @@ -2460,11 +5260,23 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xml2js@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" @@ -2474,12 +5286,11 @@ xml2js@0.4.19: xmlbuilder "~9.0.1" xml2js@^0.4.17: - version "0.4.22" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.22.tgz#4fa2d846ec803237de86f30aa9b5f70b6600de02" - integrity sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw== + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== dependencies: sax ">=0.6.0" - util.promisify "~1.0.0" xmlbuilder "~11.0.0" xmlbuilder@~11.0.0: @@ -2493,11 +5304,11 @@ xmlbuilder@~9.0.1: integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= xmldom@^0.1.22: - version "0.1.27" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== -xregexp@^2.0.0: +xregexp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= @@ -2507,11 +5318,45 @@ y18n@^3.2.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + yargs@^3.19.0: version "3.32.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" From dd79faacb7f123b7b7d572a74483525061f27315 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 9 Jan 2020 17:09:51 -0800 Subject: [PATCH 164/936] Adding a step 0 for curl (#13) --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 438c8df7..c19f18db 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,13 @@ consume events from LaunchDarkly to provide their users with more context. There are several steps to creating an integration with LaunchDarkly. +### Step 0: Replicate your desired behavior with `curl` + +Prior to connecting LaunchDarkly with a third-party service, you should replicate your integration's desired behavior in an isolated environment (standalone from LaunchDarkly). The easiest way to do this is by using [`curl`](https://curl.haxx.se/docs/manpage.html). A lot of API documentation has `curl` example commands provided for developers to use. Find the API documentation for your third-party service and execute sample commands against it. Take note of the request semantics. This will help streamline your manifest and template definitions. + ### Step 1: Fork this Repository -You will need to fork this repository to your own Github account. When you've +You will need to fork this repository to your own GitHub account. When you've completed your integration, you can [submit a pull request to LaunchDarkly](#step-7-submitting-your-integration) for it to get approved and deployed. From 82b1955234a0b5a3826eb415ec7471de3f7c7cef Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 16 Jan 2020 12:54:12 -0800 Subject: [PATCH 165/936] Imiller/ch59904/add project and environment to goaltender (#14) * update logdna template env to be dynamic from WebhookContext * update signalfx project and env to be dynamic from WebhookContext * fixing merge conflict with changing date to timestamp type --- integrations/logdna/templates/template.json | 4 +-- integrations/signalfx/templates/template.json | 25 +++++++++---------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json index 9770625a..1bcf5031 100644 --- a/integrations/logdna/templates/template.json +++ b/integrations/logdna/templates/template.json @@ -4,7 +4,7 @@ "line": "{{{title}}}{{#if comment}}, Comment: {{comment}}{{/if}}", "app": "{{formVariables.app}}", "level": "INFO", - "env": "production" + "env": "{{project.environment.key}}" } ] -} +} \ No newline at end of file diff --git a/integrations/signalfx/templates/template.json b/integrations/signalfx/templates/template.json index aa258e7f..b7e710c4 100644 --- a/integrations/signalfx/templates/template.json +++ b/integrations/signalfx/templates/template.json @@ -1,14 +1,13 @@ - - [{ - "category": "AUDIT", - "dimensions": { - "environment": "production", - "project": "ben-dev", - "flag": "{{name}}", - "kind": "{{kind}}", - "event": "{{{title}}}", - "comment": "{{comment}}" - }, - "eventType": "LaunchDarkly {{kind}} change", - "timestamp": {{timestamp.milliseconds}} +[{ + "category": "AUDIT", + "dimensions": { + "environment": "{{project.environment.key}}", + "project": "{{project.key}}", + "flag": "{{name}}", + "kind": "{{kind}}", + "event": "{{{title}}}", + "comment": "{{comment}}" + }, + "eventType": "LaunchDarkly {{kind}} change", + "timestamp": {{timestamp.milliseconds}} }] From 186c9ea252e5dc34a6ee372dc708420d388ca166 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 17 Jan 2020 16:58:04 -0800 Subject: [PATCH 166/936] Imiller/ch59903/add a new relic goaltender integration for (#15) * stub manifest.json for New Relic integration * stubbed new relic integration, waiting for pro trial to access api * add new relic integration. logo still missing though * delete file used for testing * update timestamp to be in milliseconds * update images * update image paths * Update url from ld-stg to app Co-Authored-By: Henry Barrow * add instructions to find/create an api key * add instructions to find account id * remove default isSecret=false and make account id description more concise * add link to docs for finding new relic account id Co-Authored-By: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add link to docs for api key * add some notes to readme Co-authored-by: Henry Barrow Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> --- integrations/new-relic/README.md | 12 ++++ .../assets/images/new-relic-horizontal.svg | 20 ++++++ .../assets/images/new-relic-square.svg | 12 ++++ integrations/new-relic/manifest.json | 68 +++++++++++++++++++ integrations/new-relic/templates/flag.json | 8 +++ 5 files changed, 120 insertions(+) create mode 100644 integrations/new-relic/README.md create mode 100644 integrations/new-relic/assets/images/new-relic-horizontal.svg create mode 100644 integrations/new-relic/assets/images/new-relic-square.svg create mode 100644 integrations/new-relic/manifest.json create mode 100644 integrations/new-relic/templates/flag.json diff --git a/integrations/new-relic/README.md b/integrations/new-relic/README.md new file mode 100644 index 00000000..f7ca8a1a --- /dev/null +++ b/integrations/new-relic/README.md @@ -0,0 +1,12 @@ +# LaunchDarkly New Relic Flag Events Integration +Please note that this integration requires a New Relic Pro account to function. +You should be able to see all LaunchDarkly flag events by running `SELECT * FROM LaunchDarkly` in your New Relic Insights Data Explorer. + +If you want to see all the Event Types that have been posted in the last day, run `SHOW EVENT TYPES SINCE 1 day ago` + + +## Troubleshooting the New Relic Events API +curl -X POST -d '{"eventType": "test", "message": "testing testing 123"}' -H "Content-Type:application/json" -H "X-Insert-Key: " https://insights-collector.newrelic.com/v1/accounts//events + +run `SELECT * FROM test` in New Relic Insights Data Explorer to see if your test event showed up! + diff --git a/integrations/new-relic/assets/images/new-relic-horizontal.svg b/integrations/new-relic/assets/images/new-relic-horizontal.svg new file mode 100644 index 00000000..3c23784f --- /dev/null +++ b/integrations/new-relic/assets/images/new-relic-horizontal.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/new-relic/assets/images/new-relic-square.svg b/integrations/new-relic/assets/images/new-relic-square.svg new file mode 100644 index 00000000..dcf7f0c0 --- /dev/null +++ b/integrations/new-relic/assets/images/new-relic-square.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json new file mode 100644 index 00000000..d00b8368 --- /dev/null +++ b/integrations/new-relic/manifest.json @@ -0,0 +1,68 @@ +{ + "name": "New Relic", + "version": "1.0.0", + "overview": "Send LaunchDarkly audit events to New Relic", + "description": "This integration sends LaunchDarkly audit events to New Relic. Please note that it requires a paid Insights subscription to function.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://newrelic.com/", + "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" + }, + "categories": [ + "apm", + "monitoring", + "alerts" + ], + "icons": { + "square": "assets/images/new-relic-square.svg", + "horizontal": "assets/images/new-relic-horizontal.svg" + }, + "formVariables": [ + { + "key": "accountId", + "name": "New Relic Account ID", + "description": "Enter your 6-digit [New Relic Account ID](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/account-id) found in the URL of your New Relic account.", + "type": "string" + }, + { + "key": "apiKey", + "name": "New Relic API Key", + "description": "Enter your [New Relic API key](https://docs.newrelic.com/docs/insights/insights-data-sources/custom-data/introduction-event-api#register).", + "type": "string", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "https://insights-collector.newrelic.com/v1/accounts/{{accountId}}/events", + "method": "POST", + "headers": [ + { + "name": "X-Insert-Key", + "value": "{{apiKey}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "flag": "templates/flag.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": [ + "proj/*:env/production:flag/*" + ], + "actions": [ + "*" + ] + } + ] + } + } +} \ No newline at end of file diff --git a/integrations/new-relic/templates/flag.json b/integrations/new-relic/templates/flag.json new file mode 100644 index 00000000..f426b60a --- /dev/null +++ b/integrations/new-relic/templates/flag.json @@ -0,0 +1,8 @@ +{ + "message": "{{{title}}}", + "eventType": "LaunchDarkly", + "url": "https://app.launchdarkly.com{{_links.site.href}}", + "timestamp": "{{timestamp.milliseconds}}", + "name": "{{name}}", + "project": "{{project.name}}" +} From 232b6642603efdce3f803d06edcbe4691f3155a8 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 21 Jan 2020 18:14:46 -0800 Subject: [PATCH 167/936] Add template rendering to tests and add preview script --- .gitignore | 2 +- README.md | 2 + __tests__/validate.js | 145 ++++++++---- integrations/datadog/templates/template.json | 6 +- .../templates/template.json | 6 +- integrations/slack/manifest.json | 2 +- integrations/slack/templates/template.json | 9 +- package.json | 10 +- preview.js | 73 ++++++ sample-context/flag-update.json | 75 +++++++ yarn.lock | 211 +++--------------- 11 files changed, 307 insertions(+), 234 deletions(-) create mode 100644 preview.js create mode 100644 sample-context/flag-update.json diff --git a/.gitignore b/.gitignore index b05ff1fd..9df57afd 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,4 @@ build dist public .DS_Store -latest \ No newline at end of file +latest diff --git a/README.md b/README.md index e12f166d..a1564126 100644 --- a/README.md +++ b/README.md @@ -346,6 +346,8 @@ Sandbox](http://tryhandlebarsjs.com/). Run `npm install` to install the validation dependencies. Run `npm test` to run the validation suite. In addition, we recommend install pre-commit hooks with `pre-commit install` to have the validation suite run before every commit. +Run `npm run preview YOUR_INTEGRATION_NAME` to preview your integration's templates with sample data. + ### Step 8: Submitting your integration Once you're done with your integration, [submit a pull request against this diff --git a/__tests__/validate.js b/__tests__/validate.js index a0f66845..7dda835e 100644 --- a/__tests__/validate.js +++ b/__tests__/validate.js @@ -1,14 +1,36 @@ -const { readdirSync, existsSync } = require('fs'); +const { readdirSync, existsSync, readFileSync } = require('fs'); +const Handlebars = require('handlebars'); const Ajv = require('ajv'); const _ = require('lodash'); const schema = require('../manifest.schema.json'); +const flagUpdateContext = require('../sample-context/flag-update'); const getDirectories = source => readdirSync(source, { withFileTypes: true }) .filter(dir => dir.isDirectory()) .map(dir => dir.name); +const getFormVariableContext = formVariables => { + const endpointContext = {}; + if (formVariables) { + formVariables.forEach(formVariable => { + switch (formVariable.type) { + case 'string': + endpointContext[formVariable.key] = formVariable.key; + break; + case 'boolean': + endpointContext[formVariable.key] = true; + break; + case 'uri': + endpointContext[formVariable.key] = `https://${formVariable.key}.com`; + break; + } + }); + } + return endpointContext; +}; + let manifests = []; const ajv = new Ajv(); const validate = ajv.compile(schema); @@ -35,46 +57,93 @@ describe('All integrations', () => { ).toBe(true); }); - test.each(manifests)('Templates exist for %s', (key, manifest) => { - const flagTemplatePath = _.get( - manifest, - 'capabilities.auditLogEventsHook.templates.flag', - null - ); - const projectTemplatePath = _.get( - manifest, - 'capabilities.auditLogEventsHook.templates.project', - null - ); - const environmentTemplatePath = _.get( - manifest, - 'capabilities.auditLogEventsHook.templates.environment', - null - ); - const metricTemplatePath = _.get( - manifest, - 'capabilities.auditLogEventsHook.templates.metric', - null - ); - if (flagTemplatePath) { - expect(existsSync(`./integrations/${key}/${flagTemplatePath}`)).toBe( - true + test.each(manifests)( + 'Referenced form variables exist for %s', + (key, manifest) => { + const formVariables = _.get(manifest, 'formVariables', null); + const endpoint = _.get( + manifest, + 'capabilities.auditLogEventsHook.endpoint', + null ); + if (endpoint) { + const endpointContext = getFormVariableContext(formVariables); + endpointContext.context = flagUpdateContext; + const urlTemplate = Handlebars.compile(endpoint.url, { + strict: true, + }); + expect( + () => urlTemplate(endpointContext), + `${key}: request URL template must render successfully` + ).not.toThrow(); + endpoint.headers.forEach(header => { + const headerTemplate = Handlebars.compile(header.value, { + strict: true, + }); + expect( + () => headerTemplate(endpointContext), + `${key}: request header (${header.name}) value template must render successfully` + ).not.toThrow(); + }); + } } - if (projectTemplatePath) { - expect(existsSync(`./integrations/${key}/${projectTemplatePath}`)).toBe( - true + ); + + test.each(manifests)( + 'Templates can be successfully rendered for %s', + (key, manifest) => { + const flagTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.flag', + null ); - } - if (environmentTemplatePath) { - expect( - existsSync(`./integrations/${key}/${environmentTemplatePath}`) - ).toBe(true); - } - if (metricTemplatePath) { - expect(existsSync(`./integrations/${key}/${metricTemplatePath}`)).toBe( - true + const projectTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.project', + null + ); + const environmentTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.environment', + null ); + const metricTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.metric', + null + ); + if (flagTemplatePath) { + const path = `./integrations/${key}/${flagTemplatePath}`; + expect(existsSync(path)).toBe(true); + const templateString = readFileSync(path, { encoding: 'utf-8' }); + const flagTemplate = Handlebars.compile(templateString, { + strict: true, + }); + + const formVariables = _.get(manifest, 'formVariables', null); + const formVariableContext = getFormVariableContext(formVariables); + const fullContext = Object.assign({}, flagUpdateContext); + fullContext.formVariables = formVariableContext; + expect( + () => flagTemplate(fullContext), + `${key}: flag template must render successfully` + ).not.toThrow(); + } + if (projectTemplatePath) { + expect(existsSync(`./integrations/${key}/${projectTemplatePath}`)).toBe( + true + ); + } + if (environmentTemplatePath) { + expect( + existsSync(`./integrations/${key}/${environmentTemplatePath}`) + ).toBe(true); + } + if (metricTemplatePath) { + expect(existsSync(`./integrations/${key}/${metricTemplatePath}`)).toBe( + true + ); + } } - }); + ); }); diff --git a/integrations/datadog/templates/template.json b/integrations/datadog/templates/template.json index 2d785a1f..b0dfd303 100644 --- a/integrations/datadog/templates/template.json +++ b/integrations/datadog/templates/template.json @@ -1,7 +1,7 @@ { - "title": "{{summary}}", - "text": "{{memberName}} {{action}} {{resourceName}}", - "date_happened": "{{dateHappened}}", + "title": "{{title}}", + "text": "{{details.plainText}}", + "date_happened": "{{timestamp.seconds}}", "tags": ["any", "arbitrary", "tag"], "source_type_name": "example.com" } diff --git a/integrations/sample-integration/templates/template.json b/integrations/sample-integration/templates/template.json index 2d785a1f..b0dfd303 100644 --- a/integrations/sample-integration/templates/template.json +++ b/integrations/sample-integration/templates/template.json @@ -1,7 +1,7 @@ { - "title": "{{summary}}", - "text": "{{memberName}} {{action}} {{resourceName}}", - "date_happened": "{{dateHappened}}", + "title": "{{title}}", + "text": "{{details.plainText}}", + "date_happened": "{{timestamp.seconds}}", "tags": ["any", "arbitrary", "tag"], "source_type_name": "example.com" } diff --git a/integrations/slack/manifest.json b/integrations/slack/manifest.json index 61b1a6c6..702c77fd 100644 --- a/integrations/slack/manifest.json +++ b/integrations/slack/manifest.json @@ -26,7 +26,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "{{uri}}", + "url": "{{url}}", "method": "POST", "headers": [ { diff --git a/integrations/slack/templates/template.json b/integrations/slack/templates/template.json index 444b8747..5dcc48da 100644 --- a/integrations/slack/templates/template.json +++ b/integrations/slack/templates/template.json @@ -3,7 +3,7 @@ "@type": "MessageCard", "themeColor": "0072C6", "title": "Visit the Outlook Dev Portal", - "text": "{{}}", + "text": "{{title}}", "potentialAction": [ { "@type": "ActionCard", @@ -29,8 +29,11 @@ "@type": "OpenUri", "name": "Learn More", "targets": [ - { "os": "default", "uri": "https://docs.microsoft.com/outlook/actionable-messages" } + { + "os": "default", + "uri": "https://docs.microsoft.com/outlook/actionable-messages" + } ] } ] -} \ No newline at end of file +} diff --git a/package.json b/package.json index 99b8d7d2..bae93350 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,13 @@ "main": "index.js", "scripts": { "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md", - "test": "jest" + "test": "jest", + "preview": "node preview.js" + }, + "jest": { + "setupFilesAfterEnv": [ + "jest-expect-message" + ] }, "repository": { "type": "git", @@ -20,7 +26,9 @@ "devDependencies": { "@adobe/jsonschema2md": "3.3.1", "ajv": "^6.10.2", + "handlebars": "4.7.2", "jest": "24.9.0", + "jest-expect-message": "1.0.2", "lodash": "^4.17.15" }, "prettier": { diff --git a/preview.js b/preview.js new file mode 100644 index 00000000..5c26f7ca --- /dev/null +++ b/preview.js @@ -0,0 +1,73 @@ +const { readFileSync } = require('fs'); +const Handlebars = require('handlebars'); +const _ = require('lodash'); + +const flagUpdateContext = require('./sample-context/flag-update'); + +const args = process.argv; + +const getFormVariableContext = formVariables => { + const endpointContext = {}; + if (formVariables) { + formVariables.forEach(formVariable => { + switch (formVariable.type) { + case 'string': + endpointContext[formVariable.key] = formVariable.key; + break; + case 'boolean': + endpointContext[formVariable.key] = true; + break; + case 'uri': + endpointContext[formVariable.key] = `https://${formVariable.key}.com`; + break; + } + }); + } + return endpointContext; +}; + +if (args.length <= 2) { + console.log('please provide an integration name'); + process.exit(1); +} + +const integrationName = args[2]; + +const manifest = require(`./integrations/${integrationName}/manifest.json`); +const formVariables = _.get(manifest, 'formVariables', null); +const endpoint = _.get( + manifest, + 'capabilities.auditLogEventsHook.endpoint', + null +); + +if (endpoint) { + const endpointContext = getFormVariableContext(formVariables); + endpointContext.context = flagUpdateContext; + const urlTemplate = Handlebars.compile(endpoint.url, { + strict: true, + }); + console.log('URL: ', urlTemplate(endpointContext)); + console.log('METHOD:', endpoint.method); + endpoint.headers.forEach(header => { + const headerTemplate = Handlebars.compile(header.value, { + strict: true, + }); + console.log(`HEADER: ${header.name}: ${headerTemplate(endpointContext)}`); + }); + + const flagTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.flag', + null + ); + + const path = `./integrations/${integrationName}/${flagTemplatePath}`; + const templateString = readFileSync(path, { encoding: 'utf-8' }); + const flagTemplate = Handlebars.compile(templateString, { strict: true }); + + const fullContext = Object.assign({}, flagUpdateContext); + fullContext.formVariables = getFormVariableContext(formVariables); + console.log('BODY:\tflag-update.json'); + console.log(flagTemplate(fullContext)); +} diff --git a/sample-context/flag-update.json b/sample-context/flag-update.json new file mode 100644 index 00000000..b844aab1 --- /dev/null +++ b/sample-context/flag-update.json @@ -0,0 +1,75 @@ +{ + "_links": { + "canonical": { + "href": "/api/v2/flags/always-snippet/example-test", + "type": "application/json" + }, + "parent": { + "href": "/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", + "type": "application/json" + }, + "site": { + "href": "/always-snippet/production/features/example-test", + "type": "text/html" + } + }, + "_id": "5defebd006121dd9f7ea90d0", + "_accountId": "xyz123", + "date": 1576004560130, + "timestamp": { + "milliseconds": 1576004560130, + "seconds": 1576004560 + }, + "kind": "flag", + "name": "Example test", + "details": { + "plainText": "added testing@example.com to the variation true", + "markdown": "- added [testing@example.com](mailto:testing@example.com) to the variation *true*" + }, + "description": "", + "shortDescription": "", + "comment": "This is just a test", + "member": { + "_links": { + "parent": { + "href": "/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@example.com", + "firstName": "Henry", + "lastName": "Barrow" + }, + "project": { + "name": "test project", + "key": "test-project", + "tags": ["project_tag"], + "environment": { + "name": "test environment", + "key": "test-environment", + "tags": ["env_tag", "env_tag2"] + } + }, + "key": "test-key", + "tags": ["flag_tag", "flag_tag2"], + "titleVerb": "", + "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in 'Production'", + "title": "Henrietta Powell turned on the flag Example test in 'Production'", + "titleObj": { + "plainText": "Henrietta Powell turned on the flag Example test in 'Production'", + "markdown": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in 'Production'" + }, + "target": { + "_links": null, + "name": "" + } +} diff --git a/yarn.lock b/yarn.lock index 9464e1ae..90fc72f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -557,7 +557,7 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== -abbrev@1, abbrev@^1.1.1: +abbrev@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -656,24 +656,11 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -987,11 +974,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== - ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" @@ -1131,11 +1113,6 @@ configstore@^3.0.0, configstore@^3.1.2: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - convert-source-map@^1.4.0, convert-source-map@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" @@ -1314,21 +1291,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -1718,13 +1685,6 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1751,20 +1711,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -1886,6 +1832,17 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +handlebars@4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.2.tgz#01127b3840156a0927058779482031afe0e730d7" + integrity sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + handlebars@^4.1.2: version "4.5.3" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" @@ -1920,11 +1877,6 @@ has-symbols@^1.0.0, has-symbols@^1.0.1: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -2030,13 +1982,6 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -2512,6 +2457,11 @@ jest-environment-node@^24.9.0: jest-mock "^24.9.0" jest-util "^24.9.0" +jest-expect-message@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jest-expect-message/-/jest-expect-message-1.0.2.tgz#6d67cdf093457a607d231038a3b84aa3a076bcba" + integrity sha512-WFiXMgwS2lOqQZt1iJMI/hOXpUm32X+ApsuzYcQpW5m16Pv6/Gd9kgC+Q+Q1YVNU04kYcAOv9NXMnjg6kKUy6Q== + jest-get-type@^24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" @@ -3193,21 +3143,6 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -3224,7 +3159,7 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -3288,7 +3223,7 @@ nconf@^0.10.0: secure-keys "^1.0.0" yargs "^3.19.0" -needle@^2.2.1, needle@^2.2.4, needle@^2.4.0: +needle@^2.2.4, needle@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== @@ -3333,30 +3268,6 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -3379,26 +3290,6 @@ normalize-url@^3.3.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-packlist@^1.1.6: - version "1.4.7" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.7.tgz#9e954365a06b80b18111ea900945af4f88ed4848" - integrity sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -3406,16 +3297,6 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -3431,11 +3312,6 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" @@ -3533,11 +3409,6 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" @@ -3553,19 +3424,11 @@ os-name@^3.0.0: macos-release "^2.2.0" windows-release "^3.1.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - p-each-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" @@ -3886,7 +3749,7 @@ raw-body@^2.2.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: +rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -3928,7 +3791,7 @@ readable-stream@1.1.x: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@2, readable-stream@^2.0.6, readable-stream@~2.3.6: +readable-stream@2, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -4096,7 +3959,7 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: +rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -4176,7 +4039,7 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -4186,7 +4049,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.2.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -4684,7 +4547,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -4802,19 +4665,6 @@ tar-stream@^2.1.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^4.4.2: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" @@ -5184,13 +5034,6 @@ which@^1.2.9, which@^1.3.0: dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - widest-line@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" @@ -5328,7 +5171,7 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== From 11bdf8e9317dd76cdf7a49a96fab5aee2861ed1b Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 22 Jan 2020 10:42:53 -0800 Subject: [PATCH 168/936] Remove slack and datadog, update readme and preview.js text --- README.md | 2 +- integrations/datadog/LICENSE.md | 13 ---- integrations/datadog/README.md | 0 .../datadog/assets/images/dd_icon_rgb.svg | 41 ------------ .../datadog/assets/images/dd_logo_h_rgb.svg | 64 ------------------- integrations/datadog/manifest.json | 53 --------------- integrations/datadog/templates/template.json | 7 -- integrations/slack/LICENSE.md | 13 ---- integrations/slack/README.md | 0 .../slack/assets/images/Slack_Mark.svg | 17 ----- .../slack/assets/images/Slack_RGB.svg | 15 ----- integrations/slack/manifest.json | 53 --------------- integrations/slack/templates/template.json | 39 ----------- preview.js | 2 +- 14 files changed, 2 insertions(+), 317 deletions(-) delete mode 100644 integrations/datadog/LICENSE.md delete mode 100644 integrations/datadog/README.md delete mode 100644 integrations/datadog/assets/images/dd_icon_rgb.svg delete mode 100644 integrations/datadog/assets/images/dd_logo_h_rgb.svg delete mode 100644 integrations/datadog/manifest.json delete mode 100644 integrations/datadog/templates/template.json delete mode 100644 integrations/slack/LICENSE.md delete mode 100644 integrations/slack/README.md delete mode 100644 integrations/slack/assets/images/Slack_Mark.svg delete mode 100644 integrations/slack/assets/images/Slack_RGB.svg delete mode 100644 integrations/slack/manifest.json delete mode 100644 integrations/slack/templates/template.json diff --git a/README.md b/README.md index a1564126..be5ff862 100644 --- a/README.md +++ b/README.md @@ -346,7 +346,7 @@ Sandbox](http://tryhandlebarsjs.com/). Run `npm install` to install the validation dependencies. Run `npm test` to run the validation suite. In addition, we recommend install pre-commit hooks with `pre-commit install` to have the validation suite run before every commit. -Run `npm run preview YOUR_INTEGRATION_NAME` to preview your integration's templates with sample data. +Run `npm run preview YOUR_INTEGRATION_DIR_NAME` to preview your integration's templates with sample data. ### Step 8: Submitting your integration diff --git a/integrations/datadog/LICENSE.md b/integrations/datadog/LICENSE.md deleted file mode 100644 index aa12a4cb..00000000 --- a/integrations/datadog/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2019 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/datadog/README.md b/integrations/datadog/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/integrations/datadog/assets/images/dd_icon_rgb.svg b/integrations/datadog/assets/images/dd_icon_rgb.svg deleted file mode 100644 index f39a6ac1..00000000 --- a/integrations/datadog/assets/images/dd_icon_rgb.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - diff --git a/integrations/datadog/assets/images/dd_logo_h_rgb.svg b/integrations/datadog/assets/images/dd_logo_h_rgb.svg deleted file mode 100644 index f6f77fa2..00000000 --- a/integrations/datadog/assets/images/dd_logo_h_rgb.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json deleted file mode 100644 index 90d6eadf..00000000 --- a/integrations/datadog/manifest.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "Datadog", - "version": "1.0.0", - "overview": "Send audit log events to your Datadog dashboards", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Datadog. These events can provide context to your Datadog dashboards.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/docs/datadog", - "privacyPolicy": "https://www.datadoghq.com/legal/privacy/" - }, - "categories": ["apm", "monitoring", "alerts"], - "icons": { - "square": "assets/images/dd_icon_rgb.svg", - "horizontal": "assets/images/dd_logo_h_rgb.svg" - }, - "formVariables": [ - { - "key": "apitoken", - "name": "Datadog API Token", - "type": "string", - "description": "Enter an API key from your [Datadog account](https://app.datadoghq.com/account/settings#api).", - "isSecret": true - } - ], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "https://api.datadoghq.com/api/v1/events/?api_key={{apitoken}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - } - ] - }, - "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "metric": "templates/template.json" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } -} diff --git a/integrations/datadog/templates/template.json b/integrations/datadog/templates/template.json deleted file mode 100644 index b0dfd303..00000000 --- a/integrations/datadog/templates/template.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "title": "{{title}}", - "text": "{{details.plainText}}", - "date_happened": "{{timestamp.seconds}}", - "tags": ["any", "arbitrary", "tag"], - "source_type_name": "example.com" -} diff --git a/integrations/slack/LICENSE.md b/integrations/slack/LICENSE.md deleted file mode 100644 index aa12a4cb..00000000 --- a/integrations/slack/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2019 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/slack/README.md b/integrations/slack/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/integrations/slack/assets/images/Slack_Mark.svg b/integrations/slack/assets/images/Slack_Mark.svg deleted file mode 100644 index 06148c7b..00000000 --- a/integrations/slack/assets/images/Slack_Mark.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/integrations/slack/assets/images/Slack_RGB.svg b/integrations/slack/assets/images/Slack_RGB.svg deleted file mode 100644 index 3174f50b..00000000 --- a/integrations/slack/assets/images/Slack_RGB.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/integrations/slack/manifest.json b/integrations/slack/manifest.json deleted file mode 100644 index 702c77fd..00000000 --- a/integrations/slack/manifest.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "Slack", - "version": "1.0.0", - "overview": "Send audit log events to your Slack channels", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Slack.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/docs/msteams", - "privacyPolicy": "https://privacy.microsoft.com/en-us" - }, - "categories": ["monitoring", "alerts"], - "icons": { - "square": "assets/images/Slack_Mark.svg", - "horizontal": "assets/images/Slack_RGB.svg" - }, - "formVariables": [ - { - "key": "url", - "name": "Incoming Webhook URL", - "type": "uri", - "description": "The URL for one of your [Slack incoming webhooks](https://my.slack.com/apps/A0F7XDUAZ-incoming-webhooks)", - "isSecret": false - } - ], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "{{url}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - } - ] - }, - "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "metric": "templates/template.json" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } -} diff --git a/integrations/slack/templates/template.json b/integrations/slack/templates/template.json deleted file mode 100644 index 5dcc48da..00000000 --- a/integrations/slack/templates/template.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "@context": "https://schema.org/extensions", - "@type": "MessageCard", - "themeColor": "0072C6", - "title": "Visit the Outlook Dev Portal", - "text": "{{title}}", - "potentialAction": [ - { - "@type": "ActionCard", - "name": "Send Feedback", - "inputs": [ - { - "@type": "TextInput", - "id": "feedback", - "isMultiline": true, - "title": "Let us know what you think about Actionable Messages" - } - ], - "actions": [ - { - "@type": "HttpPOST", - "name": "Send Feedback", - "isPrimary": true, - "target": "http://..." - } - ] - }, - { - "@type": "OpenUri", - "name": "Learn More", - "targets": [ - { - "os": "default", - "uri": "https://docs.microsoft.com/outlook/actionable-messages" - } - ] - } - ] -} diff --git a/preview.js b/preview.js index 5c26f7ca..c622775e 100644 --- a/preview.js +++ b/preview.js @@ -27,7 +27,7 @@ const getFormVariableContext = formVariables => { }; if (args.length <= 2) { - console.log('please provide an integration name'); + console.log('please provide an integration directory name'); process.exit(1); } From e6b015d004b76289b46d9261afe8f5266193a84f Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 22 Jan 2020 13:10:29 -0800 Subject: [PATCH 169/936] default policy small fixes (#17) --- MANIFEST.md | 2 +- README.md | 12 +++++++++++- integrations/grafana/manifest.json | 8 +++++++- integrations/prometheus-pushgateway/manifest.json | 8 +++++++- manifest.schema.json | 1 + 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/MANIFEST.md b/MANIFEST.md index cd18c0b7..6dd2cbff 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -101,7 +101,7 @@ https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information `defaultPolicy` - is optional -- type: `object[]` +- type: `object[]`\* at least `1` items in the array ##### defaultPolicy Type diff --git a/README.md b/README.md index be5ff862..a6aa342d 100644 --- a/README.md +++ b/README.md @@ -221,7 +221,17 @@ has three properties: An array of [LaunchDarkly policies](https://docs.launchdarkly.com/docs/policies-in-custom-roles) that act as a filter for which events to send to your webhook endpoint. These - policies can be overriden by users subscribing to your integration. + policies can be overriden by users subscribing to your integration. We recommend the following default policy which specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects: + +```json + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] +``` #### Endpoint template variables diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index fae79c66..f6ff6f23 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -54,7 +54,13 @@ "environment": "templates/template.json", "metric": "templates/template.json" }, - "defaultPolicy": [] + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] } } } diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index 7becdee8..cf3bd612 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -37,7 +37,13 @@ "environment": "templates/template", "metric": "templates/template" }, - "defaultPolicy": [] + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] } } } diff --git a/manifest.schema.json b/manifest.schema.json index 7542cc2a..7836a07f 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -436,6 +436,7 @@ "title": "Default Policy", "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", "type": "array", + "minItems": 1, "items": { "$id": "#/properties/capability/audit-log-events-hook/policy", "title": "Policy", From b147efad3bf860ecaf83cc098ec89013ad69dd64 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 23 Jan 2020 16:57:27 -0800 Subject: [PATCH 170/936] Add json string escaping and template validation (#18) * Add json template validation * PR feedback * Remove my name from sample context --- __tests__/utils.js | 33 +++++++++ __tests__/validate.js | 21 +++++- .../appdynamics/templates/template.json | 16 ++-- integrations/sentry/manifest.json | 2 +- integrations/sentry/templates/template.json | 5 +- integrations/signalfx/manifest.json | 8 +- .../{template.json => template.json.hbs} | 2 +- integrations/splunk/templates/template.json | 22 +++--- preview.js | 6 +- .../flag-update.client-side-sdk.json | 74 +++++++++++++++++++ ...ag-update.json => flag-update.toggle.json} | 4 +- utils/json-escape.js | 32 ++++++++ 12 files changed, 191 insertions(+), 34 deletions(-) create mode 100644 __tests__/utils.js rename integrations/signalfx/templates/{template.json => template.json.hbs} (85%) create mode 100644 sample-context/flag-update.client-side-sdk.json rename sample-context/{flag-update.json => flag-update.toggle.json} (97%) create mode 100644 utils/json-escape.js diff --git a/__tests__/utils.js b/__tests__/utils.js new file mode 100644 index 00000000..06eed4d5 --- /dev/null +++ b/__tests__/utils.js @@ -0,0 +1,33 @@ +const jsonEscape = require('../utils/json-escape'); + +describe('jsonEscape escapes a variety of data shapes', () => { + test('escapes strings', () => { + const input = `slash\-string + newline`; + expect(jsonEscape(input)).toEqual('slash-string\\n newline'); + }); + test('escapes arrays', () => { + const input = [`slash\\string`, `another\\one`]; + expect(jsonEscape(input)).toEqual(['slash\\\\string', 'another\\\\one']); + }); + test('escapes complex object', () => { + const input = { + str: `slash\-string`, + arr: [`slash\\string`, `another\\one`], + obj: { + nested: `nest\-dash`, + number: 42, + bool: false, + }, + }; + expect(jsonEscape(input)).toEqual({ + str: 'slash-string', + arr: ['slash\\\\string', 'another\\\\one'], + obj: { + nested: 'nest-dash', + number: 42, + bool: false, + }, + }); + }); +}); diff --git a/__tests__/validate.js b/__tests__/validate.js index 7dda835e..8b84fa5a 100644 --- a/__tests__/validate.js +++ b/__tests__/validate.js @@ -3,8 +3,9 @@ const Handlebars = require('handlebars'); const Ajv = require('ajv'); const _ = require('lodash'); +const jsonEscape = require('../utils/json-escape'); const schema = require('../manifest.schema.json'); -const flagUpdateContext = require('../sample-context/flag-update'); +const flagUpdateContext = require('../sample-context/flag-update.client-side-sdk'); const getDirectories = source => readdirSync(source, { withFileTypes: true }) @@ -31,6 +32,11 @@ const getFormVariableContext = formVariables => { return endpointContext; }; +const isJSONTemplate = templateFilename => { + const lowercase = templateFilename.toLowerCase(); + return lowercase.endsWith('.json') || lowercase.endsWith('.json.hbs'); +}; + let manifests = []; const ajv = new Ajv(); const validate = ajv.compile(schema); @@ -122,12 +128,23 @@ describe('All integrations', () => { const formVariables = _.get(manifest, 'formVariables', null); const formVariableContext = getFormVariableContext(formVariables); - const fullContext = Object.assign({}, flagUpdateContext); + const isJSON = isJSONTemplate(flagTemplatePath); + const fullContext = isJSON + ? jsonEscape(Object.assign({}, flagUpdateContext)) + : Object.assign({}, flagUpdateContext); fullContext.formVariables = formVariableContext; expect( () => flagTemplate(fullContext), `${key}: flag template must render successfully` ).not.toThrow(); + // Validate json templates render to valid json + if (isJSON) { + const rendered = flagTemplate(fullContext); + expect( + () => JSON.parse(rendered), + `.json templates must render valid JSON\n${rendered}` + ).not.toThrow(); + } } if (projectTemplatePath) { expect(existsSync(`./integrations/${key}/${projectTemplatePath}`)).toBe( diff --git a/integrations/appdynamics/templates/template.json b/integrations/appdynamics/templates/template.json index 13534c71..651e2b71 100644 --- a/integrations/appdynamics/templates/template.json +++ b/integrations/appdynamics/templates/template.json @@ -1,9 +1,9 @@ - - [{ - "application_id": "LaunchDarkly", - "summary": "{{title}}", - "comment": "{{comment}}", - "eventtype": "APPLICATION_DEPLOYMENT", - "severity": "INFO" +[ + { + "application_id": "LaunchDarkly", + "summary": "{{title}}", + "comment": "{{#if comment}}{{comment}}{{/if}}", + "eventtype": "APPLICATION_DEPLOYMENT", + "severity": "INFO" } -] \ No newline at end of file +] diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index bd675cb5..0b893c76 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -33,7 +33,7 @@ { "key": "projectId", "name": "Project ID", - "description": "Sentry Project ID you'd like to assicate with LaunchDarkly events", + "description": "Sentry Project ID you'd like to associate with LaunchDarkly events", "placeholder": "123", "type": "string" } diff --git a/integrations/sentry/templates/template.json b/integrations/sentry/templates/template.json index 7bf2d9e4..bce09ffa 100644 --- a/integrations/sentry/templates/template.json +++ b/integrations/sentry/templates/template.json @@ -20,12 +20,11 @@ }, "message": { - "formatted": "{{ title }}\n{{ description }}\n\n{{ comment }}" + "formatted": "{{ title }}\n{{ description }}{{#if comment}}\n\n{{ comment }}{{/if}}" }, "user": { "id": "launchdarkly/member/{{ member._id }}", "email": "{{ member.email }}", "Member Name": "{{ member.firstName }} {{ member.lastName }}" } - -} \ No newline at end of file +} diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 64759825..dd335bbc 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -47,10 +47,10 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "metric": "templates/template.json" + "flag": "templates/template.json.hbs", + "project": "templates/template.json.hbs", + "environment": "templates/template.json.hbs", + "metric": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/signalfx/templates/template.json b/integrations/signalfx/templates/template.json.hbs similarity index 85% rename from integrations/signalfx/templates/template.json rename to integrations/signalfx/templates/template.json.hbs index b7e710c4..b8b17011 100644 --- a/integrations/signalfx/templates/template.json +++ b/integrations/signalfx/templates/template.json.hbs @@ -6,7 +6,7 @@ "flag": "{{name}}", "kind": "{{kind}}", "event": "{{{title}}}", - "comment": "{{comment}}" + "comment": "{{#if comment}}{{comment}}{{/if}}" }, "eventType": "LaunchDarkly {{kind}} change", "timestamp": {{timestamp.milliseconds}} diff --git a/integrations/splunk/templates/template.json b/integrations/splunk/templates/template.json index eb8be071..5ad62a42 100644 --- a/integrations/splunk/templates/template.json +++ b/integrations/splunk/templates/template.json @@ -1,13 +1,13 @@ { - "sourcetype":"launchdarkly", - "time":"{{timestamp.milliseconds}}", - "event": { - "kind":"{{kind}}", - "name":"{{name}}", - "member_email":"{{member.email}}", - "member_name":"{{member.firstName}} {{member.lastName}}", - "verb":"{{titleVerb}}", - "message":"{{title}}", - "comment":"{{{comment}}}" - } + "sourcetype": "launchdarkly", + "time": "{{timestamp.milliseconds}}", + "event": { + "kind": "{{kind}}", + "name": "{{name}}", + "member_email": "{{member.email}}", + "member_name": "{{member.firstName}} {{member.lastName}}", + "verb": "{{titleVerb}}", + "message": "{{title}}", + "comment": "{{#if comment}}{{{comment}}}{{/if}}" + } } diff --git a/preview.js b/preview.js index c622775e..ced1eaca 100644 --- a/preview.js +++ b/preview.js @@ -2,7 +2,9 @@ const { readFileSync } = require('fs'); const Handlebars = require('handlebars'); const _ = require('lodash'); -const flagUpdateContext = require('./sample-context/flag-update'); +const jsonEscape = require('./utils/json-escape'); + +const flagUpdateContext = require('./sample-context/flag-update.client-side-sdk'); const args = process.argv; @@ -66,7 +68,7 @@ if (endpoint) { const templateString = readFileSync(path, { encoding: 'utf-8' }); const flagTemplate = Handlebars.compile(templateString, { strict: true }); - const fullContext = Object.assign({}, flagUpdateContext); + const fullContext = jsonEscape(Object.assign({}, flagUpdateContext)); fullContext.formVariables = getFormVariableContext(formVariables); console.log('BODY:\tflag-update.json'); console.log(flagTemplate(fullContext)); diff --git a/sample-context/flag-update.client-side-sdk.json b/sample-context/flag-update.client-side-sdk.json new file mode 100644 index 00000000..99640c39 --- /dev/null +++ b/sample-context/flag-update.client-side-sdk.json @@ -0,0 +1,74 @@ +{ + "_links": { + "canonical": { + "href": "/api/v2/flags/default/demo-flag", + "type": "application/json" + }, + "parent": { + "href": "/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "/api/v2/auditlog/5e28dbea06121d71dd129e79", + "type": "application/json" + }, + "site": { + "href": "/default/~/features/demo-flag", + "type": "text/html" + } + }, + "_id": "5e28dbea06121d71dd129e79", + "_accountId": "", + "date": 0, + "timestamp": { + "milliseconds": 1579736042409, + "seconds": 1579736042 + }, + "kind": "flag", + "name": "Demo flag", + "details": { + "plainText": "Changed the flag to be available to client-side SDKs", + "markdown": "* Changed the flag to be available to client\\-side SDKs\n" + }, + "description": "* Changed the flag to be available to client\\-side SDKs\n", + "shortDescription": "", + "project": { + "name": "Default Project", + "key": "default", + "tags": [], + "environment": { + "name": "Test", + "key": "test", + "tags": [] + } + }, + "key": "demo-flag", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "updated the flag", + "markdownTitle": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [Demo flag](http://localhost/default/~/features/demo-flag)", + "title": "Henrietta Powell updated the flag Demo flag", + "titleObj": { + "plainText": "Henrietta Powell updated the flag Demo flag", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [Demo flag](http://localhost/default/~/features/demo-flag)" + }, + "target": { + "_links": null, + "name": "" + } + } diff --git a/sample-context/flag-update.json b/sample-context/flag-update.toggle.json similarity index 97% rename from sample-context/flag-update.json rename to sample-context/flag-update.toggle.json index b844aab1..3a9a53aa 100644 --- a/sample-context/flag-update.json +++ b/sample-context/flag-update.toggle.json @@ -46,8 +46,8 @@ }, "_id": "569f514183f2164430000002", "email": "testing@example.com", - "firstName": "Henry", - "lastName": "Barrow" + "firstName": "Henrietta", + "lastName": "Powell" }, "project": { "name": "test project", diff --git a/utils/json-escape.js b/utils/json-escape.js new file mode 100644 index 00000000..8844d2aa --- /dev/null +++ b/utils/json-escape.js @@ -0,0 +1,32 @@ +const _ = require('lodash'); + +const jsonEscapeString = str => { + return JSON.stringify(str).slice(1, -1); +}; + +const jsonEscapeObject = obj => { + const ret = {}; + Object.keys(obj).forEach(key => { + ret[key] = jsonEscape(obj[key]); + }); + return ret; +}; + +const jsonEscapeArray = arr => { + return _.map(arr, value => jsonEscape(value)); +}; + +const jsonEscape = value => { + if (_.isString(value)) { + return jsonEscapeString(value); + } + if (_.isPlainObject(value)) { + return jsonEscapeObject(value); + } + if (_.isArray(value)) { + return jsonEscapeArray(value); + } + return value; +}; + +module.exports = jsonEscape; From 3541d63ec7d8ae0b96b49492aae27b15600939cb Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 24 Jan 2020 11:50:07 -0800 Subject: [PATCH 171/936] Allow defaultvalue to be a string or boolean (#19) * permit string of boolean for defaultValue * Add test to check defaultType matches formVariable type * Clean up test --- __tests__/validate.js | 18 ++++++++++++++++++ manifest.schema.json | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/__tests__/validate.js b/__tests__/validate.js index 8b84fa5a..779239a3 100644 --- a/__tests__/validate.js +++ b/__tests__/validate.js @@ -95,6 +95,24 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'defaultValue types match the type of the formVariable for %s', + (key, manifest) => { + const formVariables = _.get(manifest, 'formVariables', null); + if (formVariables) { + formVariables.forEach(formVariable => { + if (!_.isUndefined(formVariable.defaultValue)) { + if (formVariable.type === "string" || formVariable.type === "uri") { + expect(_.isString(formVariable.defaultValue)).toBe(true) + } else if (formVariable.type === "boolean") { + expect(_.isBoolean(formVariable.defaultValue)).toBe(true) + } + } + }) + } + } + ) + test.each(manifests)( 'Templates can be successfully rendered for %s', (key, manifest) => { diff --git a/manifest.schema.json b/manifest.schema.json index 7836a07f..2779cfa3 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -263,7 +263,7 @@ "defaultValue": { "$id": "#/properties/formVariables/variable/default-value", "title": "Default value", - "type": "string", + "type": ["boolean","string"], "description": "Default value for variable. Can be overridden by user in the UI" } }, @@ -551,4 +551,4 @@ "categories", "icons" ] -} \ No newline at end of file +} From ba0ece4b67fd62066500eeea1466f0a51a3a79cf Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 24 Jan 2020 17:04:14 -0800 Subject: [PATCH 172/936] Remove metric template type and add default (#20) * Remove metric template and add default * update MANIFEST.md * update MANIFEST.md and replace yarn with npm * clarify default * Update test to check default --- MANIFEST.md | 66 +- README.md | 732 +- __tests__/validate.js | 32 +- integrations/appdynamics/manifest.json | 2 +- integrations/grafana/manifest.json | 2 +- integrations/logdna/manifest.json | 2 +- integrations/msteams/manifest.json | 2 +- .../prometheus-pushgateway/manifest.json | 2 +- integrations/sample-integration/manifest.json | 2 +- integrations/sentry/manifest.json | 2 +- integrations/signalfx/manifest.json | 2 +- integrations/splunk/manifest.json | 2 +- manifest.schema.json | 13 +- package-lock.json | 7595 +++++++++++++++++ package.json | 2 +- preview.js | 2 +- .../flag-update.client-side-sdk.json | 1 - sample-context/flag-update.toggle.json | 1 - yarn.lock | 5214 ----------- 19 files changed, 8039 insertions(+), 5637 deletions(-) create mode 100644 package-lock.json delete mode 100644 yarn.lock diff --git a/MANIFEST.md b/MANIFEST.md index 6dd2cbff..5275f97a 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -409,53 +409,53 @@ Templates to use for body of the webhook request | Property | Type | Required | | ------------- | ------ | -------- | +| `default` | string | Optional | | `environment` | string | Optional | | `flag` | string | Optional | -| `metric` | string | Optional | | `project` | string | Optional | -#### environment +#### default -##### Environment template +##### default template -Template to use for environment events +Template to use if the event does not have a corresponding named template -`environment` +`default` - is optional - type: `string` -##### environment Type +##### default Type `string` -#### flag +#### environment -##### Flag template +##### Environment template -Template to use for flag events +Template to use for environment events -`flag` +`environment` - is optional - type: `string` -##### flag Type +##### environment Type `string` -#### metric +#### flag -##### Metric template +##### Flag template -Template to use for metric events +Template to use for flag events -`metric` +`flag` - is optional - type: `string` -##### metric Type +##### flag Type `string` @@ -538,16 +538,16 @@ Array type: `object[]` All items must be of the type: `object` with following properties: -| Property | Type | Required | Default | -| -------------- | ------- | ------------ | ------- | -| `defaultValue` | string | Optional | | -| `description` | string | **Required** | | -| `isOptional` | boolean | Optional | `false` | -| `isSecret` | boolean | Optional | `false` | -| `key` | string | **Required** | | -| `name` | string | **Required** | | -| `placeholder` | string | Optional | | -| `type` | string | **Required** | | +| Property | Type | Required | Default | +| -------------- | -------------- | ------------ | ------- | +| `defaultValue` | boolean,string | Optional | | +| `description` | string | **Required** | | +| `isOptional` | boolean | Optional | `false` | +| `isSecret` | boolean | Optional | `false` | +| `key` | string | **Required** | | +| `name` | string | **Required** | | +| `placeholder` | string | Optional | | +| `type` | string | **Required** | | #### defaultValue @@ -558,11 +558,21 @@ Default value for variable. Can be overridden by user in the UI `defaultValue` - is optional -- type: `string` +- type: multiple ##### defaultValue Type -`string` +- type: `boolean,string`. + +```json +{ + "$id": "#/properties/formVariables/variable/default-value", + "title": "Default value", + "type": ["boolean", "string"], + "description": "Default value for variable. Can be overridden by user in the UI", + "simpletype": "multiple" +} +``` #### description diff --git a/README.md b/README.md index a6aa342d..e2d47428 100644 --- a/README.md +++ b/README.md @@ -1,374 +1,358 @@ -# LaunchDarkly integrations - -[![CircleCI](https://circleci.com/gh/launchdarkly/ld-integrations.svg?style=svg&circle-token=c12dfaa51d070b8bbc8dea0c0adf4c402b5b9123)](https://circleci.com/gh/launchdarkly/ld-integrations) - -Feature flags not only provide you control over your deployment and rollout but -also provides context to other related systems -- giving your team visibility -into how your services react due to changes to flags. This repository contains -LaunchDarkly integrations built by our community. Most of these integrations -consume events from LaunchDarkly to provide their users with more context. - -## Getting started - -There are several steps to creating an integration with LaunchDarkly. - -### Step 0: Replicate your desired behavior with `curl` - -Prior to connecting LaunchDarkly with a third-party service, you should replicate your integration's desired behavior in an isolated environment (standalone from LaunchDarkly). The easiest way to do this is by using [`curl`](https://curl.haxx.se/docs/manpage.html). A lot of API documentation has `curl` example commands provided for developers to use. Find the API documentation for your third-party service and execute sample commands against it. Take note of the request semantics. This will help streamline your manifest and template definitions. - -### Step 1: Fork this Repository - -You will need to fork this repository to your own GitHub account. When you've -completed your integration, you can [submit a pull request to -LaunchDarkly](#step-7-submitting-your-integration) for it to get approved and -deployed. - -### Step 2: Create a new directory inside `./integrations` - -Create a new directory inside the [integrations](./integrations) directory named -after your organization or integration's name (e.g., `example-dot-com`). Make -sure the directory has no spaces and uses -[kebab-casing](https://wiki.c2.com/?KebabCase). - -You should only change files and directories inside your new directory. Our -validation process will reject any pull requests that attempt to modify content -outside of your directory. - -### Step 3: Create your integration manifest - -Create an empty -[`manifest.json`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#launchdarkly-integrations-manifest-properties) -file inside your new directory. The `manifest.json` file will describe your -integration's information and capabilities. - -The properties of LaunchDarkly's integration manifest are defined through a -[JSON schema](./manifest.schema.json) and has a [corresponding schema -documentation](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md). -Many IDEs can provide you inline help and validation while editing your -manifest. To enable this you can register the [JSON -schema](./manifest.schema.json) in your IDE. If you use -[VSCode](https://code.visualstudio.com/), VSCode will detect the settings in -this repository and apply the schema validation without any additional -configuration. - -![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) - -### Step 4: Describe your integration's basic information inside the manifest - -The first part of the manifest describes your organization, contacts, URLs, and -a few things we need to list your integration properly: - -``` -{ - "name": "Sample Integration", - "version": "1.0.0", - "overview": "Short one-liner describing your integration", - "description": "Send flag data to space. Markdown based description.", - "author": "Example Dot Com", - "supportEmail": "support@example.com", - "links": { - "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" - }, - "categories": ["apm", "monitoring", "alerts"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - ... -} -``` - -The example above describes the basic information about your integration. We -will use most of the information above when rendering your integration -configuration form inside the LaunchDarkly UI. - -There are a few properties in the manifest that can accept simple -[markdown](https://daringfireball.net/projects/markdown/). One of them is the -[`description`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#description). -This markdown format will get converted to HTML in LaunchDarkly's UI. Only use -simple markdown structures like links and basic text formatting. - -Notice that the -[`icons`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#icons) -described above are in SVG format. This is intentional. Your organization's (or -integration's) logo will be used in the LaunchDarkly UI but also inside a public -facing integrations listing on -[launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG -files allow your logo to scale nicely on different devices. We do not accept -other image formats. - -Also, notice that the `icon.square` and `icon.horizontal` properties point to a -relative path. This path is relative to your integration's directory. You are -free to create any directories and files that support your integration. - -You can also create a `README.md` inside your integration's directory that -provides additional information about your integration. If provided, we may use -your `README.md` as documentation to your integration. - -### Step 5: Collecting integration configuration data from LaunchDarkly users - -Most integrations will need to collect one or more pieces of configuration data -that supports the integration. Some examples include: - -- API token -- Webhook endpoint -- URLs - -To support these configurations, you can describe a set of -[`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) -that define these configuration properties. Here's an example: - -``` -{ - ... - "formVariables": [ - { - "key": "endpointUrl", - "name": "Webhook endpoint URL", - "description": "Enter the URL to the webhook endpoint", - "default": "https://example.com/inbound_webhook", - "type": "url", - "isSecret": false - }, - { - "key": "apiToken", - "name": "API Key", - "description": "Enter your [API key](https://example.com/api) here", - "type": "string", - "isSecret": true - } - ], - ... -} -``` - -The -[`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) -entry above will yield the following UI inside of the [LaunchDarkly Integration -page](https://app.launchdarkly.com/default/integrations): - -![Example configuration -form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) - -The `formVariables[].description` will be used as a field label on the UI. You -can use simple markdown to link a word or phrase to an external URL. - -### Step 6: Define your integration's capabilities - -The third part of defining your LaunchDarkly integration is describing its -[capabilities](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#capabilities). - -As of today, we support only one capability, [Audit Log Event -Hook](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook). -An Audit Log Event Hook is a webhook that's sent by LaunchDarkly whenever an -event happens inside of LaunchDarkly. This capability can be used to trigger an -event in another service. - -Here's an example of an Audit Log Event Hook capability that subscribes to flag -events in a LaunchDarkly account: - -``` -{ - ... - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "{{endpointUrl}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, - "templates": { - "flag": "templates/flag.json" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } - ... -} -``` - -The -[`auditLogEventsHook`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook) -has three properties: - -1. [`endpoint`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#endpoint): - Describes the HTTP handler that will receive the webhook. In the example - above, you'll notice that a few of the properties (`endpoint.url` and - `endpoint.headers[].value`) will accept template variables. These template - variables can reference any `formVariables` you've defined in your manifest. - The templating language we use is based off of - [Handlebars](https://handlebarsjs.com/) syntax. -2. [`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates): - A map of template paths relative to your integration's directory. These - templates can be any file type. -3. [`defaultPolicy`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#defaultpolicy): - An array of [LaunchDarkly - policies](https://docs.launchdarkly.com/docs/policies-in-custom-roles) that - act as a filter for which events to send to your webhook endpoint. These - policies can be overriden by users subscribing to your integration. We recommend the following default policy which specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects: - -```json - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] -``` - -#### Endpoint template variables - -There are a few properties that allow template variables to be substituted at -runtime. The main ones are the `endpoint.url` and the -`endpoint.headers[].value`. This will allow you to configure a dynamic endpoint -based on the `formVariables` your integration collects from the user. Here are -some examples: - -``` -This first example will utilize the `endpointUrl` formVariable as the URL of the endpoint and use the `apiToken` as a `Bearer` token in the `Authorization` header. -... - "endpoint": { - "url": "{{endpointUrl}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, -... - -This next example uses the `apiToken` formVariable as a query parameter on the URL. -... - "endpoint": { - "url": "https://example.com/apiToken?={{apiToken}}", - "method": "POST" - }, -... - -``` - -#### Template files - -Before the `auditLogEventsHook` capability sends the request to the endpoint -handling your webhook, you have the option to transform the body of the request -sent to your handler. If you don't provide one or more templates, LaunchDarkly -will send you a default JSON payload that looks like this: - -``` -{ - "_links": { - "canonical": { - "href": "/api/v2/flags/always-snippet/example-test", - "type": "application/json" - }, - "parent": { - "href": "/api/v2/auditlog", - "type": "application/json" - }, - "self": { - "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", - "type": "application/json" - }, - "site": { - "href": "/always-snippet/production/features/example-test", - "type": "text/html" - } - }, - "_id": "5defebd006121dd9f7ea90d0", - "_accountId": "", - "timestamp": { - "milliseconds": 1576004560130, - "seconds": 1576004560, - }, - "kind": "flag", - "name": "Example test", - "description": "", - "shortDescription": "", - "comment": "This is just a test", - "member": { - "_links": { - "parent": { - "href": "/api/v2/members", - "type": "application/json" - }, - "self": { - "href": "/api/v2/members/569f514183f2164430000002", - "type": "application/json" - } - }, - "_id": "569f514183f2164430000002", - "email": "testing@example.com", - "firstName": "Henry", - "lastName": "Barrow" - }, - "titleVerb": "", - "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", - "title": "Henrietta Powell turned on the flag Example test in 'Production'", - "target": { - "_links": null, - "name": "" - } -} -``` - -However, if you choose to provide one or more -[`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates), -LaunchDarkly will render your template using the context data above. Your -template can be any text based format, but make sure you specify the appropriate -`Content-Type` header in your `endpoint.headers` property to match the content -type of your template body. - -We use basic [Handlerbars](https://handlebarsjs.com/) template syntax to render -your template. Check out [Handlebars' Language -Guide](https://handlebarsjs.com/guide/) for more information on its syntax. In -addition to the basic language syntax, we support the following [built-in -helpers](https://github.com/aymerick/raymond#built-in-helpers): `if`, `unless`, -`each`, `with`, `lookup`, and `equal`. - -To test your templates, you can use the [Handlebars -Sandbox](http://tryhandlebarsjs.com/). - -### Step 7: Validating your integration - -Run `npm install` to install the validation dependencies. Run `npm test` to run the validation suite. In addition, we -recommend install pre-commit hooks with `pre-commit install` to have the validation suite run before every commit. - -Run `npm run preview YOUR_INTEGRATION_DIR_NAME` to preview your integration's templates with sample data. - -### Step 8: Submitting your integration - -Once you're done with your integration, [submit a pull request against this -repo](https://github.com/launchdarkly/ld-integrations/pull/new/master). Your -branch will run through some automated validations and will be reviewed by -someone on our team. Once everything checks out, we'll publish your integration -when you give us the green light. - -## Comments, suggestions, bug reports? - -Visit us in our Slack channel -[#ext-integrations](https://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQhttps://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQ) -or log an issue or request -[here](https://github.com/launchdarkly/ld-integrations/issues). +# README + +## Top-level Schemas + +- [Abstract](./abstract.md "This is an abstract schema") – `https://example.com/schemas/abstract` +- [Abstract](./abstract-1.md "This is an abstract schema") – `https://example.com/schemas/abstract` +- [Abstract](./abstract-2.md "This is an abstract schema") – `https://example.com/schemas/abstract` +- [Abstract](./abstract-3.md "This is an abstract schema") – `https://example.com/schemas/abstract` +- [Abstract](./abstract-4.md "This is an abstract schema") – `https://example.com/schemas/abstract` +- [Abstract](./abstract-5.md "This is an abstract schema") – `https://example.com/schemas/abstract` +- [Arrays](./arrays.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` +- [Arrays](./tuple.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` +- [Arrays](./arrays-1.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` +- [Arrays](./arrays-2.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` +- [Arrays](./arrays-3.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` +- [Arrays](./tuple-1.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` +- [Arrays](./arrays-4.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` +- [Arrays](./arrays-5.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` +- [Button](./button.md "Renders a Button") – `http://www.example.com/schemas/components/Button.json` +- [Button](./button-1.md "Renders a Button") – `http://www.example.com/schemas/components/Button.json` +- [Complex References](./complex.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` +- [Complex References](./complex-1.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` +- [Complex References](./complex-2.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` +- [Complex References](./complex-3.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` +- [Complex References](./complex-4.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` +- [Complex References](./complex-5.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` +- [Constant Types](./constants.md "This is an example schema with examples for properties with constant values") – `https://example.com/schemas/constants` +- [Constant Types](./constants-1.md "This is an example schema with examples for properties with constant values") – `https://example.com/schemas/constants` +- [Constant Types](./constants-2.md "This is an example schema with examples for properties with constant values") – `https://example.com/schemas/constants` +- [Constant Types](./constants-3.md "This is an example schema with examples for properties with constant values") – `https://example.com/schemas/constants` +- [Custom](./custom.md "This is an extensible schema") – `https://example.com/schemas/custom` +- [Custom](./custom-1.md "This is an extensible schema") – `https://example.com/schemas/custom` +- [Custom](./custom-2.md "This is an extensible schema") – `https://example.com/schemas/custom` +- [Custom](./custom-3.md "This is an extensible schema") – `https://example.com/schemas/custom` +- [Deeply Extending](./deepextending.md "This is an extending schema") – `https://example.com/schemas/deepextending` +- [Deeply Extending](./deepextending-1.md "This is an extending schema") – `https://example.com/schemas/deepextending` +- [Deeply Extending](./deepextending-2.md "This is an extending schema") – `https://example.com/schemas/deepextending` +- [Deeply Extending](./deepextending-3.md "This is an extending schema") – `https://example.com/schemas/deepextending` +- [Definitions](./definitions.md "This is an example of using a definitions object within a schema") – `https://example.com/schemas/definitions` +- [Definitions](./definitions-1.md "This is an example of using a definitions object within a schema") – `https://example.com/schemas/definitions` +- [Definitions](./definitions-2.md "This is an example of using a definitions object within a schema") – `https://example.com/schemas/definitions` +- [Definitions](./definitions-3.md "This is an example of using a definitions object within a schema") – `https://example.com/schemas/definitions` +- [Enumerated ](./enums.md "This is an example schema with examples for properties with enum values") – `https://example.com/schemas/enums` +- [Enumerated ](./enums-1.md "This is an example schema with examples for properties with enum values") – `https://example.com/schemas/enums` +- [Enumerated ](./enums-2.md "This is an example schema with examples for properties with enum values") – `https://example.com/schemas/enums` +- [Enumerated ](./enums-3.md "This is an example schema with examples for properties with enum values") – `https://example.com/schemas/enums` +- [Example](./example.md "This is an example schema with examples") – `https://example.com/schemas/example` +- [Example](./example-1.md "This is an example schema with examples") – `https://example.com/schemas/example` +- [Example](./example-2.md "This is an example schema with examples") – `https://example.com/schemas/example` +- [Example](./example-3.md "This is an example schema with examples") – `https://example.com/schemas/example` +- [Examples](./examples.md "This is an example schema with multiple examples") – `https://example.com/schemas/examples` +- [Examples](./examples-1.md "This is an example schema with multiple examples") – `https://example.com/schemas/examples` +- [Examples](./examples-2.md "This is an example schema with multiple examples") – `https://example.com/schemas/examples` +- [Examples](./examples-3.md "This is an example schema with multiple examples") – `https://example.com/schemas/examples` +- [Extending](./extending.md "This is an extending schema") – `https://example.com/schemas/extending` +- [Extending](./extending-1.md "This is an extending schema") – `https://example.com/schemas/extending` +- [Extending](./extending-2.md "This is an extending schema") – `https://example.com/schemas/extending` +- [Extending](./extending-3.md "This is an extending schema") – `https://example.com/schemas/extending` +- [Extensible](./extensible.md "This is an extensible schema") – `https://example.com/schemas/extensible` +- [Extensible](./extensible-1.md "This is an extensible schema") – `https://example.com/schemas/extensible` +- [Extensible](./extensible-2.md "This is an extensible schema") – `https://example.com/schemas/extensible` +- [Extensible](./extensible-3.md "This is an extensible schema") – `https://example.com/schemas/extensible` +- [HTML](./html.md) – `-` +- [HTML](./html-1.md) – `-` +- [Identifiable](./identifiable.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` +- [Identifiable](./identifiable-1.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` +- [Identifiable](./identifiable-2.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` +- [Identifiable](./identifiable-3.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` +- [Identifiable](./identifiable-4.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` +- [Identifiable](./identifiable-5.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` +- [JWT](./jwt.md) – `-` +- [JWT](./jwt-1.md) – `-` +- [Join Types](./join.md "This is an example of a JSON schema with only a join type key") – `https://example.com/schemas/join` +- [Join Types](./join-1.md "This is an example of a JSON schema with only a join type key") – `https://example.com/schemas/join` +- [Join Types](./join-2.md "This is an example of a JSON schema with only a join type key") – `https://example.com/schemas/join` +- [Join Types](./join-3.md "This is an example of a JSON schema with only a join type key") – `https://example.com/schemas/join` +- [LaunchDarkly Integrations Manifest](./manifest.md "Describes the capabilities and intent of a LaunchDarkly integration") – `https://launchdarkly.com/schemas/v1.0/integrations` +- [LaunchDarkly Integrations Manifest](./manifest-1.md "Describes the capabilities and intent of a LaunchDarkly integration") – `https://launchdarkly.com/schemas/v1.0/integrations` +- [Meta](./meta.md "Content and Section Metadata Properties") – `https://ns.adobe.com/helix/pipeline/meta` +- [Meta](./meta-1.md "Content and Section Metadata Properties") – `https://ns.adobe.com/helix/pipeline/meta` +- [Nested Object](./nestedobj.md) – `https://example.com/schemas/nestedobject` +- [Nested Object](./nestedobj-1.md) – `https://example.com/schemas/nestedobject` +- [Nested Object](./nestedobj-2.md) – `https://example.com/schemas/nestedobject` +- [Nested Object](./nestedobj-3.md) – `https://example.com/schemas/nestedobject` +- [Not true](./not.md) – `-` +- [Not true](./not-1.md) – `-` +- [PNG](./png.md) – `-` +- [PNG](./png-1.md) – `-` +- [Pattern Properties](./pattern.md "This is an example of a JSON schema with only a patternProperties key") – `https://example.com/schemas/pattern` +- [Pattern Properties](./pattern-1.md "This is an example of a JSON schema with only a patternProperties key") – `https://example.com/schemas/pattern` +- [Pattern Properties](./pattern-2.md "This is an example of a JSON schema with only a patternProperties key") – `https://example.com/schemas/pattern` +- [Pattern Properties](./pattern-3.md "This is an example of a JSON schema with only a patternProperties key") – `https://example.com/schemas/pattern` +- [Properties](./type.md "Properties of Button") – `-` +- [Properties](./format.md "Properties of Datepicker") – `-` +- [Properties](./type-1.md "Properties of Button") – `-` +- [Properties](./format-1.md "Properties of Datepicker") – `-` +- [Simple](./simple.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` +- [Simple](./simple-1.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` +- [Simple](./simple-2.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` +- [Simple](./simple-3.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` +- [Simple](./simple-4.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` +- [Simple](./simple-5.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` +- [Simple Types](./simpletypes.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` +- [Simple Types](./simpletypes-1.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` +- [Simple Types](./simpletypes-2.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` +- [Simple Types](./simpletypes-3.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` +- [Simple Types](./simpletypes-4.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` +- [Simple Types](./simpletypes-5.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` +- [Stabilizing](./stabilizing.md "This is a schema which is currently in the stabilizing status") – `https://example.com/schemas/stabilizing` +- [Stabilizing](./stabilizing-1.md "This is a schema which is currently in the stabilizing status") – `https://example.com/schemas/stabilizing` +- [Stabilizing](./stabilizing-2.md "This is a schema which is currently in the stabilizing status") – `https://example.com/schemas/stabilizing` +- [Stabilizing](./stabilizing-3.md "This is a schema which is currently in the stabilizing status") – `https://example.com/schemas/stabilizing` +- [Subdir](./subdir.md "A schema in a sub directory") – `https://example.com/schemas/subdir/subdir` +- [Subdir](./subdir-1.md "A schema in a sub directory") – `https://example.com/schemas/subdir/subdir` +- [Subdir](./subdir-2.md "A schema in a sub directory") – `https://example.com/schemas/subdir/subdir` +- [Subdir](./subdir-3.md "A schema in a sub directory") – `https://example.com/schemas/subdir/subdir` +- [Type Arrays](./typearrays.md "This schema test type arrays and nullable types") – `https://example.com/schemas/typearrays` +- [Type Arrays](./typearrays-1.md "This schema test type arrays and nullable types") – `https://example.com/schemas/typearrays` +- [Type Arrays](./typearrays-2.md "This schema test type arrays and nullable types") – `https://example.com/schemas/typearrays` +- [Type Arrays](./typearrays-3.md "This schema test type arrays and nullable types") – `https://example.com/schemas/typearrays` +- [Untitled array in undefined](./arrays-6.md) – `-` +- [Untitled array in undefined](./arrays-7.md) – `-` +- [Untitled object in undefined](./object.md) – `-` +- [Untitled object in undefined](./null.md) – `-` +- [Untitled object in undefined](./enums-4.md) – `-` +- [Untitled object in undefined](./deadref.md) – `-` +- [Untitled object in undefined](./one.md "The first schema in the cycle (or is it the last?)") – `http://example.com/schemas/one` +- [Untitled object in undefined](./three.md) – `http://example.com/schemas/three` +- [Untitled object in undefined](./two.md) – `http://example.com/schemas/two` +- [Untitled object in undefined](./additionalprops.md) – `-` +- [Untitled object in undefined](./object-1.md) – `-` +- [Untitled object in undefined](./null-1.md) – `-` +- [Untitled object in undefined](./enums-5.md) – `-` +- [Untitled object in undefined](./deadref-1.md) – `-` +- [Untitled object in undefined](./one-1.md "The first schema in the cycle (or is it the last?)") – `http://example.com/schemas/one` +- [Untitled object in undefined](./three-1.md) – `http://example.com/schemas/three` +- [Untitled object in undefined](./two-1.md) – `http://example.com/schemas/two` +- [Untitled object in undefined](./additionalprops-1.md) – `-` +- [Untitled schema](./merged.md) – `-` +- [Untitled schema](./objectorarray.md) – `-` +- [Untitled schema](./wrong.md) – `https://example.com/ns/wrong` +- [Untitled schema](./merged-1.md) – `-` +- [Untitled schema](./objectorarray-1.md) – `-` +- [Untitled schema](./wrong-1.md) – `https://example.com/ns/wrong` +- [You don't know what I am](./undefined.md) – `-` +- [You don't know what I am](./undefined-1.md) – `-` + +## Other Schemas + +### Objects + +- [Audit Log Events Hook](./manifest-properties-capabilities-properties-audit-log-events-hook.md "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint") – `#/properties/capability/audit-log-events-hook#/properties/capabilities/properties/auditLogEventsHook` +- [Capabilities](./manifest-properties-capabilities.md "Specify which capabilities you'd like your integration to have") – `#/properties/capabilities#/properties/capabilities` +- [Endpoint](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-endpoint.md "Properties that describe the HTTP endpoint LaunchDarkly will send hooks to") – `#/properties/capability/audit-log-events-hook/receiving-endpoint#/properties/capabilities/properties/auditLogEventsHook/properties/endpoint` +- [Enumerated (Nested)](./enums-properties-enumerated-nested.md "This is an example schema with examples for properties of nested objects with enum values") – `https://example.com/schemas/enums#/properties/nested` +- [Enumerated (Nested)](./enums-1-properties-enumerated-nested.md "This is an example schema with examples for properties of nested objects with enum values") – `https://example.com/schemas/enums#/properties/nested` +- [Enumerated (Nested)](./enums-2-properties-enumerated-nested.md "This is an example schema with examples for properties of nested objects with enum values") – `https://example.com/schemas/enums#/properties/nested` +- [Enumerated (Nested)](./enums-3-properties-enumerated-nested.md "This is an example schema with examples for properties of nested objects with enum values") – `https://example.com/schemas/enums#/properties/nested` +- [Form variable](./manifest-properties-form-variables-form-variable.md "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration") – `#/properties/formVariables/variable#/properties/formVariables/items` +- [Header items](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-endpoint-properties-http-headers-header-items.md "A name and value pair to send as headers with the hook request") – `#/properties/capability/audit-log-events-hook/header/items#/properties/capabilities/properties/auditLogEventsHook/properties/endpoint/properties/headers/items` +- [Icons](./manifest-properties-icons.md "Logos describing your integration in SVG format") – `#/properties/icons#/properties/icons` +- [Links](./manifest-properties-links.md "A set of reference links supporting your integration") – `#/properties/links#/properties/links` +- [Policy](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy-policy.md "A LaunchDarkly policy") – `#/properties/capability/audit-log-events-hook/policy#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy/items` +- [Properties](./button-properties-properties.md "Properties of Button") – `http://www.example.com/schemas/components/Button.json#/properties/properties` +- [Properties](./button-1-properties-properties.md "Properties of Button") – `http://www.example.com/schemas/components/Button.json#/properties/properties` +- [Simple](./complex-properties-simple.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple#/properties/refnamed` +- [Untitled object in Abstract](./abstract-defs-first.md) – `https://example.com/schemas/abstract#/$defs/first` +- [Untitled object in Abstract](./abstract-defs-second.md) – `https://example.com/schemas/abstract#/$defs/second` +- [Untitled object in Abstract](./abstract-1-definitions-first.md) – `https://example.com/schemas/abstract#/definitions/first` +- [Untitled object in Abstract](./abstract-1-definitions-second.md) – `https://example.com/schemas/abstract#/definitions/second` +- [Untitled object in Abstract](./abstract-2-definitions-first.md) – `https://example.com/schemas/abstract#/definitions/first` +- [Untitled object in Abstract](./abstract-2-definitions-second.md) – `https://example.com/schemas/abstract#/definitions/second` +- [Untitled object in Abstract](./abstract-3-defs-first.md) – `https://example.com/schemas/abstract#/$defs/first` +- [Untitled object in Abstract](./abstract-3-defs-second.md) – `https://example.com/schemas/abstract#/$defs/second` +- [Untitled object in Abstract](./abstract-4-definitions-first.md) – `https://example.com/schemas/abstract#/definitions/first` +- [Untitled object in Abstract](./abstract-4-definitions-second.md) – `https://example.com/schemas/abstract#/definitions/second` +- [Untitled object in Abstract](./abstract-5-definitions-first.md) – `https://example.com/schemas/abstract#/definitions/first` +- [Untitled object in Abstract](./abstract-5-definitions-second.md) – `https://example.com/schemas/abstract#/definitions/second` +- [Untitled object in Arrays](./arrays-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` +- [Untitled object in Arrays](./arrays-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` +- [Untitled object in Arrays](./arrays-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` +- [Untitled object in Arrays](./arrays-1-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` +- [Untitled object in Arrays](./arrays-1-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` +- [Untitled object in Arrays](./arrays-1-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` +- [Untitled object in Arrays](./arrays-2-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` +- [Untitled object in Arrays](./arrays-2-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` +- [Untitled object in Arrays](./arrays-2-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` +- [Untitled object in Arrays](./arrays-3-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` +- [Untitled object in Arrays](./arrays-3-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` +- [Untitled object in Arrays](./arrays-3-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` +- [Untitled object in Arrays](./arrays-4-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` +- [Untitled object in Arrays](./arrays-4-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` +- [Untitled object in Arrays](./arrays-4-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` +- [Untitled object in Arrays](./arrays-5-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` +- [Untitled object in Arrays](./arrays-5-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` +- [Untitled object in Arrays](./arrays-5-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` +- [Untitled object in Complex References](./complex-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` +- [Untitled object in Complex References](./complex-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` +- [Untitled object in Complex References](./complex-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` +- [Untitled object in Complex References](./complex-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` +- [Untitled object in Complex References](./complex-1-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` +- [Untitled object in Complex References](./complex-1-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` +- [Untitled object in Complex References](./complex-1-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` +- [Untitled object in Complex References](./complex-1-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` +- [Untitled object in Complex References](./complex-2-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` +- [Untitled object in Complex References](./complex-2-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` +- [Untitled object in Complex References](./complex-2-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` +- [Untitled object in Complex References](./complex-2-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` +- [Untitled object in Complex References](./complex-3-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` +- [Untitled object in Complex References](./complex-3-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` +- [Untitled object in Complex References](./complex-3-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` +- [Untitled object in Complex References](./complex-3-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` +- [Untitled object in Complex References](./complex-4-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` +- [Untitled object in Complex References](./complex-4-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` +- [Untitled object in Complex References](./complex-4-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` +- [Untitled object in Complex References](./complex-4-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` +- [Untitled object in Complex References](./complex-5-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` +- [Untitled object in Complex References](./complex-5-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` +- [Untitled object in Complex References](./complex-5-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` +- [Untitled object in Complex References](./complex-5-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` +- [Untitled object in JWT](./jwt-json-web-token-items-1.md) – `undefined#/contentSchema/items/1` +- [Untitled object in JWT](./jwt-1-json-web-token-items-1.md) – `undefined#/contentSchema/items/1` +- [Untitled object in Join Types](./join-oneof-0-not-oneof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/0` +- [Untitled object in Join Types](./join-oneof-0-not-oneof-1.md "Another simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/1` +- [Untitled object in Join Types](./join-oneof-1-allof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/1/allOf/0` +- [Untitled object in Join Types](./join-oneof-2-anyof-0.md "Another simple string") – `https://example.com/schemas/join#/oneOf/2/anyOf/0` +- [Untitled object in Join Types](./join-1-oneof-0-not-oneof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/0` +- [Untitled object in Join Types](./join-1-oneof-0-not-oneof-1.md "Another simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/1` +- [Untitled object in Join Types](./join-1-oneof-1-allof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/1/allOf/0` +- [Untitled object in Join Types](./join-1-oneof-2-anyof-0.md "Another simple string") – `https://example.com/schemas/join#/oneOf/2/anyOf/0` +- [Untitled object in Join Types](./join-2-oneof-0-not-oneof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/0` +- [Untitled object in Join Types](./join-2-oneof-0-not-oneof-1.md "Another simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/1` +- [Untitled object in Join Types](./join-2-oneof-1-allof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/1/allOf/0` +- [Untitled object in Join Types](./join-2-oneof-2-anyof-0.md "Another simple string") – `https://example.com/schemas/join#/oneOf/2/anyOf/0` +- [Untitled object in Join Types](./join-3-oneof-0-not-oneof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/0` +- [Untitled object in Join Types](./join-3-oneof-0-not-oneof-1.md "Another simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/1` +- [Untitled object in Join Types](./join-3-oneof-1-allof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/1/allOf/0` +- [Untitled object in Join Types](./join-3-oneof-2-anyof-0.md "Another simple string") – `https://example.com/schemas/join#/oneOf/2/anyOf/0` +- [Untitled object in Nested Object](./nestedobj-properties-settings.md "settings") – `https://example.com/schemas/nestedobject#/properties/settings` +- [Untitled object in Nested Object](./nestedobj-properties-settings-properties-collaborators.md "collaborators") – `https://example.com/schemas/nestedobject#/properties/settings/properties/collaborators` +- [Untitled object in Nested Object](./nestedobj-1-properties-settings.md "settings") – `https://example.com/schemas/nestedobject#/properties/settings` +- [Untitled object in Nested Object](./nestedobj-1-properties-settings-properties-collaborators.md "collaborators") – `https://example.com/schemas/nestedobject#/properties/settings/properties/collaborators` +- [Untitled object in Nested Object](./nestedobj-2-properties-settings.md "settings") – `https://example.com/schemas/nestedobject#/properties/settings` +- [Untitled object in Nested Object](./nestedobj-2-properties-settings-properties-collaborators.md "collaborators") – `https://example.com/schemas/nestedobject#/properties/settings/properties/collaborators` +- [Untitled object in Nested Object](./nestedobj-3-properties-settings.md "settings") – `https://example.com/schemas/nestedobject#/properties/settings` +- [Untitled object in Nested Object](./nestedobj-3-properties-settings-properties-collaborators.md "collaborators") – `https://example.com/schemas/nestedobject#/properties/settings/properties/collaborators` +- [Untitled object in undefined](./one-properties-children-items-anyof-0.md) – `http://example.com/schemas/three#/properties/children/items/anyOf/0` +- [Untitled object in undefined](./three-1-properties-children-items-anyof-1.md) – `http://example.com/schemas/two#/properties/children/items/anyOf/1` +- [Webhook body template](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-webhook-body-template.md "Templates to use for body of the webhook request") – `#/properties/capability/audit-log-events-hook/templates#/properties/capabilities/properties/auditLogEventsHook/properties/templates` + +### Arrays + +- [Actions](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy-policy-properties-actions.md "A list of action specifiers defining the actions to which the statement applies") – `#/properties/capability/audit-log-events-hook/policy/actions#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy/items/properties/actions` +- [Categories](./manifest-properties-categories.md "Categories that describe your integration") – `#/properties/categories#/properties/categories` +- [Default Policy](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy.md "LaunchDarkly policy that allows you to filter events sent to your webhook") – `#/properties/capability/audit-log-events-hook/default-policy#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy` +- [Form variables](./manifest-properties-form-variables.md "Form variables will be rendered on the integration configuration page") – `#/properties/formVariables#/properties/formVariables` +- [HTTP headers](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-endpoint-properties-http-headers.md "Headers to send with the webhook request") – `#/properties/capability/audit-log-events-hook/headers#/properties/capabilities/properties/auditLogEventsHook/properties/endpoint/properties/headers` +- [JSON Web Token](./jwt-json-web-token.md) – `undefined#/contentSchema` +- [JSON Web Token](./jwt-1-json-web-token.md) – `undefined#/contentSchema` +- [Not actions](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy-policy-properties-not-actions.md "A list of action specifiers defining the actions to which the statement does not apply") – `#/properties/capability/audit-log-events-hook/policy/not-actions#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy/items/properties/notActions` +- [Not resources](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy-policy-properties-not-resources.md "A list of resource specifiers defining the resources to which the statement does not apply") – `#/properties/capability/audit-log-events-hook/policy/not-resources#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy/items/properties/notResources` +- [Resources](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy-policy-properties-resources.md "A list of resource specifiers defining the resources to which the statement applies") – `#/properties/capability/audit-log-events-hook/policy/resources#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy/items/properties/resources` +- [Untitled array in Arrays](./arrays-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` +- [Untitled array in Arrays](./arrays-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` +- [Untitled array in Arrays](./arrays-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` +- [Untitled array in Arrays](./arrays-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` +- [Untitled array in Arrays](./arrays-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` +- [Untitled array in Arrays](./arrays-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` +- [Untitled array in Arrays](./arrays-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` +- [Untitled array in Arrays](./arrays-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` +- [Untitled array in Arrays](./arrays-properties-truefalseanylist.md) – `https://example.com/schemas/arrays#/properties/truefalseanylist` +- [Untitled array in Arrays](./arrays-properties-truefalsewronglist.md) – `https://example.com/schemas/arrays#/properties/truefalsewronglist` +- [Untitled array in Arrays](./arrays-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` +- [Untitled array in Arrays](./arrays-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` +- [Untitled array in Arrays](./arrays-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` +- [Untitled array in Arrays](./arrays-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` +- [Untitled array in Arrays](./arrays-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` +- [Untitled array in Arrays](./tuple-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` +- [Untitled array in Arrays](./arrays-1-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` +- [Untitled array in Arrays](./arrays-1-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` +- [Untitled array in Arrays](./arrays-1-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` +- [Untitled array in Arrays](./arrays-1-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` +- [Untitled array in Arrays](./arrays-1-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` +- [Untitled array in Arrays](./arrays-1-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` +- [Untitled array in Arrays](./arrays-1-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` +- [Untitled array in Arrays](./arrays-1-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` +- [Untitled array in Arrays](./arrays-1-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` +- [Untitled array in Arrays](./arrays-1-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` +- [Untitled array in Arrays](./arrays-1-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` +- [Untitled array in Arrays](./arrays-1-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` +- [Untitled array in Arrays](./arrays-1-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` +- [Untitled array in Arrays](./arrays-2-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` +- [Untitled array in Arrays](./arrays-2-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` +- [Untitled array in Arrays](./arrays-2-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` +- [Untitled array in Arrays](./arrays-2-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` +- [Untitled array in Arrays](./arrays-2-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` +- [Untitled array in Arrays](./arrays-2-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` +- [Untitled array in Arrays](./arrays-2-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` +- [Untitled array in Arrays](./arrays-2-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` +- [Untitled array in Arrays](./arrays-2-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` +- [Untitled array in Arrays](./arrays-2-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` +- [Untitled array in Arrays](./arrays-2-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` +- [Untitled array in Arrays](./arrays-2-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` +- [Untitled array in Arrays](./arrays-2-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` +- [Untitled array in Arrays](./arrays-3-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` +- [Untitled array in Arrays](./arrays-3-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` +- [Untitled array in Arrays](./arrays-3-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` +- [Untitled array in Arrays](./arrays-3-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` +- [Untitled array in Arrays](./arrays-3-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` +- [Untitled array in Arrays](./arrays-3-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` +- [Untitled array in Arrays](./arrays-3-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` +- [Untitled array in Arrays](./arrays-3-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` +- [Untitled array in Arrays](./arrays-3-properties-truefalseanylist.md) – `https://example.com/schemas/arrays#/properties/truefalseanylist` +- [Untitled array in Arrays](./arrays-3-properties-truefalsewronglist.md) – `https://example.com/schemas/arrays#/properties/truefalsewronglist` +- [Untitled array in Arrays](./arrays-3-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` +- [Untitled array in Arrays](./arrays-3-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` +- [Untitled array in Arrays](./arrays-3-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` +- [Untitled array in Arrays](./arrays-3-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` +- [Untitled array in Arrays](./arrays-3-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` +- [Untitled array in Arrays](./tuple-1-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` +- [Untitled array in Arrays](./arrays-4-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` +- [Untitled array in Arrays](./arrays-4-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` +- [Untitled array in Arrays](./arrays-4-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` +- [Untitled array in Arrays](./arrays-4-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` +- [Untitled array in Arrays](./arrays-4-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` +- [Untitled array in Arrays](./arrays-4-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` +- [Untitled array in Arrays](./arrays-4-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` +- [Untitled array in Arrays](./arrays-4-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` +- [Untitled array in Arrays](./arrays-4-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` +- [Untitled array in Arrays](./arrays-4-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` +- [Untitled array in Arrays](./arrays-4-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` +- [Untitled array in Arrays](./arrays-4-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` +- [Untitled array in Arrays](./arrays-4-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` +- [Untitled array in Arrays](./arrays-5-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` +- [Untitled array in Arrays](./arrays-5-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` +- [Untitled array in Arrays](./arrays-5-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` +- [Untitled array in Arrays](./arrays-5-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` +- [Untitled array in Arrays](./arrays-5-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` +- [Untitled array in Arrays](./arrays-5-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` +- [Untitled array in Arrays](./arrays-5-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` +- [Untitled array in Arrays](./arrays-5-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` +- [Untitled array in Arrays](./arrays-5-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` +- [Untitled array in Arrays](./arrays-5-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` +- [Untitled array in Arrays](./arrays-5-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` +- [Untitled array in Arrays](./arrays-5-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` +- [Untitled array in Arrays](./arrays-5-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` +- [Untitled array in Meta](./meta-definitions-meta-properties-types.md "The inferred class names for the section") – `https://ns.adobe.com/helix/pipeline/meta#/definitions/meta/properties/types` +- [Untitled array in Meta](./meta-1-definitions-meta-properties-types.md "The inferred class names for the section") – `https://ns.adobe.com/helix/pipeline/meta#/definitions/meta/properties/types` +- [Untitled array in undefined](./merged-oneof-1.md) – `undefined#/oneOf/1` +- [Untitled array in undefined](./one-properties-children.md) – `http://example.com/schemas/one#/properties/children` +- [Untitled array in undefined](./three-1-properties-children.md) – `http://example.com/schemas/three#/properties/children` +- [Untitled array in undefined](./two-1-properties-children.md) – `http://example.com/schemas/two#/properties/children` +- [Untitled array in undefined](./three-properties-children.md) – `http://example.com/schemas/three#/properties/children` +- [Untitled array in undefined](./two-properties-children.md) – `http://example.com/schemas/two#/properties/children` +- [Untitled array in undefined](./merged-1-oneof-1.md) – `undefined#/oneOf/1` +- [Untitled array in undefined](./one-1-properties-children.md) – `http://example.com/schemas/one#/properties/children` +- [Untitled array in undefined](./three-1-properties-children.md) – `http://example.com/schemas/three#/properties/children` +- [Untitled array in undefined](./two-1-properties-children.md) – `http://example.com/schemas/two#/properties/children` diff --git a/__tests__/validate.js b/__tests__/validate.js index 779239a3..f6abf515 100644 --- a/__tests__/validate.js +++ b/__tests__/validate.js @@ -131,7 +131,7 @@ describe('All integrations', () => { 'capabilities.auditLogEventsHook.templates.environment', null ); - const metricTemplatePath = _.get( + const defaultTemplatePath = _.get( manifest, 'capabilities.auditLogEventsHook.templates.metric', null @@ -174,10 +174,36 @@ describe('All integrations', () => { existsSync(`./integrations/${key}/${environmentTemplatePath}`) ).toBe(true); } - if (metricTemplatePath) { - expect(existsSync(`./integrations/${key}/${metricTemplatePath}`)).toBe( + if (defaultTemplatePath) { + expect(existsSync(`./integrations/${key}/${defaultTemplatePath}`)).toBe( true ); + const path = `./integrations/${key}/${defaultTemplatePath}`; + expect(existsSync(path)).toBe(true); + const templateString = readFileSync(path, { encoding: 'utf-8' }); + const flagTemplate = Handlebars.compile(templateString, { + strict: true, + }); + + const formVariables = _.get(manifest, 'formVariables', null); + const formVariableContext = getFormVariableContext(formVariables); + const isJSON = isJSONTemplate(flagTemplatePath); + const fullContext = isJSON + ? jsonEscape(Object.assign({}, flagUpdateContext)) + : Object.assign({}, flagUpdateContext); + fullContext.formVariables = formVariableContext; + expect( + () => flagTemplate(fullContext), + `${key}: default template must render successfully` + ).not.toThrow(); + // Validate json templates render to valid json + if (isJSON) { + const rendered = flagTemplate(fullContext); + expect( + () => JSON.parse(rendered), + `.json templates must render valid JSON\n${rendered}` + ).not.toThrow(); + } } } ); diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 57cae93a..1f7e7b3c 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -57,7 +57,7 @@ "flag": "templates/template.json", "project": "templates/template.json", "environment": "templates/template.json", - "metric": "templates/template.json" + "default": "templates/template.json" }, "defaultPolicy": [ { diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index f6ff6f23..3c2f8eb4 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -52,7 +52,7 @@ "flag": "templates/template.json", "project": "templates/template.json", "environment": "templates/template.json", - "metric": "templates/template.json" + "default": "templates/template.json" }, "defaultPolicy": [ { diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 7c32ff1e..4a7c377e 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -59,7 +59,7 @@ "flag": "templates/template.json", "project": "templates/template.json", "environment": "templates/template.json", - "metric": "templates/template.json" + "default": "templates/template.json" }, "defaultPolicy": [ { diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index d73f983b..35addd19 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -39,7 +39,7 @@ "flag": "templates/template.json", "project": "templates/template.json", "environment": "templates/template.json", - "metric": "templates/template.json" + "default": "templates/template.json" }, "defaultPolicy": [ { diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index cf3bd612..7ccaa16a 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -35,7 +35,7 @@ "flag": "templates/template", "project": "templates/template", "environment": "templates/template", - "metric": "templates/template" + "default": "templates/template" }, "defaultPolicy": [ { diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index dae5fc4c..780a81d8 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -83,7 +83,7 @@ "flag": "templates/template.json", "project": "templates/template.json", "environment": "templates/template.json", - "metric": "templates/template.json" + "default": "templates/template.json" }, "defaultPolicy": [ { diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index 0b893c76..8b4b981a 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -58,7 +58,7 @@ "flag": "templates/template.json", "project": "templates/template.json", "environment": "templates/template.json", - "metric": "templates/template.json" + "default": "templates/template.json" }, "defaultPolicy": [ { diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index dd335bbc..242b7363 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -50,7 +50,7 @@ "flag": "templates/template.json.hbs", "project": "templates/template.json.hbs", "environment": "templates/template.json.hbs", - "metric": "templates/template.json.hbs" + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 68e57f15..dc6b8efd 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -51,7 +51,7 @@ "flag": "templates/template.json", "project": "templates/template.json", "environment": "templates/template.json", - "metric": "templates/template.json" + "default": "templates/template.json" }, "defaultPolicy": [ { diff --git a/manifest.schema.json b/manifest.schema.json index 2779cfa3..61ad7a6e 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -263,7 +263,10 @@ "defaultValue": { "$id": "#/properties/formVariables/variable/default-value", "title": "Default value", - "type": ["boolean","string"], + "type": [ + "boolean", + "string" + ], "description": "Default value for variable. Can be overridden by user in the UI" } }, @@ -401,7 +404,7 @@ "flag", "project", "environment", - "metric" + "default" ] }, "properties": { @@ -423,10 +426,10 @@ "description": "Template to use for environment events", "type": "string" }, - "metric": { + "default": { "$id": "#/properties/capability/audit-log-events-hook/templates/metric", - "title": "Metric template", - "description": "Template to use for metric events", + "title": "default template", + "description": "Template to use if the event does not have a corresponding named template", "type": "string" } } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..c1a69453 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7595 @@ +{ + "name": "ld-integrations", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@adobe/helix-log": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@adobe/helix-log/-/helix-log-2.2.2.tgz", + "integrity": "sha512-Jn8EUE2Mpb3NRz5wWrj3xu51kZDYboTlAueG5mgYdG3/NnHNUJU75N/JMpA+QTPSAi9XjWoUmM7nQW346qbU3g==", + "dev": true, + "requires": { + "colorette": "^1.1.0", + "ferrum": "^1.2.0", + "phin": "^3.4.0", + "polka": "^0.5.2", + "snyk": "^1.226.1", + "uuid": "^3.3.3" + } + }, + "@adobe/jsonschema2md": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@adobe/jsonschema2md/-/jsonschema2md-3.3.1.tgz", + "integrity": "sha512-fF3TaFazqZ52DaM9Au97STq7LnnMzDFr5Nr4RUY/7XImL0fW8SbjLl3M3AuALI2UZv28qcWxu+h03Nz3k2h7HA==", + "dev": true, + "requires": { + "@adobe/helix-log": "^2.0.0", + "ajv": "^6.10.2", + "bluebird": "^3.5.5", + "ejs": "^2.6.2", + "github-slugger": "^1.2.1", + "i18n": "^0.8.3", + "jasmine-xml-reporter": "^1.2.1", + "json-pointer": "^0.6.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "optimist": "^0.6.1", + "prettier": "^1.18.2", + "readdirp": "^3.1.1", + "valid-url": "1.0.9" + } + }, + "@arr/every": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.1.tgz", + "integrity": "sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/core": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", + "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helpers": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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 + } + } + }, + "@babel/generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "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.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", + "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@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/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@polka/url": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", + "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==", + "dev": true + }, + "@snyk/cli-interface": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.3.0.tgz", + "integrity": "sha512-ecbylK5Ol2ySb/WbfPj0s0GuLQR+KWKFzUgVaoNHaSoN6371qRWwf2uVr+hPUP4gXqCai21Ug/RDArfOhlPwrQ==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, + "@snyk/cocoapods-lockfile-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-3.0.0.tgz", + "integrity": "sha512-AebCc+v9vtOL9tFkU4/tommgVsXxqdx6t45kCkBW+FC4PaYvfYEg9Eg/9GqlY9+nFrLFo/uTr+E/aR0AF/KqYA==", + "dev": true, + "requires": { + "@snyk/dep-graph": "^1.11.0", + "@snyk/ruby-semver": "^2.0.4", + "@types/js-yaml": "^3.12.1", + "core-js": "^3.2.0", + "js-yaml": "^3.13.1", + "source-map-support": "^0.5.7", + "tslib": "^1.9.3" + } + }, + "@snyk/composer-lockfile-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@snyk/composer-lockfile-parser/-/composer-lockfile-parser-1.2.0.tgz", + "integrity": "sha512-kZT+HTqgNcQMeoE5NM9M3jj463M8zI7ZxqZXLw9WoyVs5JTt9g0qFWxIG1cNwZdGVI+y7tzZbNWw9BlMD1vCCQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@snyk/dep-graph": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@snyk/dep-graph/-/dep-graph-1.13.1.tgz", + "integrity": "sha512-Ww2xvm5UQgrq9eV0SdTBCh+w/4oI2rCx5vn1IOSeypaR0CO4p+do1vm3IDZ2ugg4jLSfHP8+LiD6ORESZMkQ2w==", + "dev": true, + "requires": { + "graphlib": "^2.1.5", + "lodash": "^4.7.14", + "object-hash": "^1.3.1", + "semver": "^6.0.0", + "source-map-support": "^0.5.11", + "tslib": "^1.9.3" + } + }, + "@snyk/gemfile": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@snyk/gemfile/-/gemfile-1.2.0.tgz", + "integrity": "sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==", + "dev": true + }, + "@snyk/ruby-semver": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@snyk/ruby-semver/-/ruby-semver-2.0.4.tgz", + "integrity": "sha512-ceMD4CBS3qtAg+O0BUvkKdsheUNCqi+/+Rju243Ul8PsUgZnXmGiqfk/2z7DCprRQnxUTra4+IyeDQT7wAheCQ==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "@snyk/snyk-cocoapods-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-2.0.1.tgz", + "integrity": "sha512-XVkvaMvMzQ3miJi/YZmsRJSAUfDloYhfg6pXPgzAeAugB4p+cNi01Z68pT62ypB8U/Ugh1Xx2pb9aoOFqBbSjA==", + "dev": true, + "requires": { + "@snyk/cli-interface": "1.5.0", + "@snyk/cocoapods-lockfile-parser": "3.0.0", + "@snyk/dep-graph": "^1.13.1", + "source-map-support": "^0.5.7", + "tslib": "^1.9.3" + }, + "dependencies": { + "@snyk/cli-interface": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-1.5.0.tgz", + "integrity": "sha512-+Qo+IO3YOXWgazlo+CKxOuWFLQQdaNCJ9cSfhFQd687/FuesaIxWdInaAdfpsLScq0c6M1ieZslXgiZELSzxbg==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + } + } + }, + "@types/agent-base": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/agent-base/-/agent-base-4.2.0.tgz", + "integrity": "sha512-8mrhPstU+ZX0Ugya8tl5DsDZ1I5ZwQzbL/8PA0z8Gj0k9nql7nkaMzmPVLj+l/nixWaliXi+EBiLA8bptw3z7Q==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/node": "*" + } + }, + "@types/babel__core": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", + "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "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.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", + "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/bunyan": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.6.tgz", + "integrity": "sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "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": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/js-yaml": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA==", + "dev": true + }, + "@types/node": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.5.0.tgz", + "integrity": "sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ==", + "dev": true + }, + "@types/restify": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/restify/-/restify-4.3.6.tgz", + "integrity": "sha512-4l4f0EXnleXQttlhRCXtTuJ8UelsKiAKIK2AAEd2epBHu41aEbM0U2z6E5tUrNwlbxz7qaNBISduGMeg+G3PaA==", + "dev": true, + "requires": { + "@types/bunyan": "*", + "@types/node": "*" + } + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/xml2js": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.3.tgz", + "integrity": "sha512-Pv2HGRE4gWLs31In7nsyXEH4uVVsd0HNV9i2dyASvtDIlOtSTr1eczPLDpdEuyv5LWH5LT20GIXwPjkshKWI1g==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz", + "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==", + "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 + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "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" + } + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^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==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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 + }, + "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" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "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" + } + }, + "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==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "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=", + "dev": true + }, + "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 + }, + "ast-types": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", + "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==", + "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 + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "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=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "dev": true, + "requires": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + } + }, + "babel-plugin-jest-hoist": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", + "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", + "dev": true, + "requires": { + "readable-stream": "^3.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", + "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "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" + } + } + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.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" + } + } + } + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "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-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 + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "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" + } + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "centra": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/centra/-/centra-2.4.0.tgz", + "integrity": "sha512-AWmF3EHNe/noJHviynZOrdnUuQzT5AMgl9nJPXGvnzGXrI2ZvNDrEcdqskc4EtQwt2Q1IggXb0OXy7zZ1Xvvew==", + "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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinner": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", + "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "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.1.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", + "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==", + "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==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "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, + "optional": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "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" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "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 + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.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" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", + "dev": true + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "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=", + "dev": true + }, + "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", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "dockerfile-ast": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.0.16.tgz", + "integrity": "sha512-+HZToHjjiLPl46TqBrok5dMrg5oCkZFPSROMQjRmvin0zG4FxK0DJXTpV/CUPYY2zpmEvVza55XLwSHFx/xZMw==", + "dev": true, + "requires": { + "vscode-languageserver-types": "^3.5.0" + } + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotnet-deps-parser": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/dotnet-deps-parser/-/dotnet-deps-parser-4.9.0.tgz", + "integrity": "sha512-V0O+7pI7Ei+iL5Kgy6nYq1UTwzrpqci5K/zf8cXyP5RWBSQBUl/JOE9I67zLUkKiwOdfPhbMQgcRj/yGA+NL1A==", + "dev": true, + "requires": { + "@types/xml2js": "0.4.3", + "lodash": "^4.17.11", + "source-map-support": "^0.5.7", + "tslib": "^1.10.0", + "xml2js": "0.4.19" + }, + "dependencies": { + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + } + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "email-validator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", + "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", + "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 + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "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.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.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" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "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.13.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.13.0.tgz", + "integrity": "sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "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": "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" + } + }, + "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", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "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", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "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-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "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==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "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" + } + }, + "ferrum": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ferrum/-/ferrum-1.7.0.tgz", + "integrity": "sha512-Ycr5nz/Pj7HsIqx+dZgAq27nq35bSzNzwsUbc4vFPl9PG1OgrzwDH57noH6blT7gh1XzKnqEYGrSYDU+4Vy2VA==", + "dev": true, + "requires": { + "lodash.isplainobject": "4.0.6" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "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" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "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==", + "dev": true, + "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", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "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-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" + } + }, + "get-uri": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", + "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", + "dev": true, + "requires": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "~3.0.2", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + }, + "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 + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "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=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-up": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", + "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "parse-url": "^5.0.0" + } + }, + "git-url-parse": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", + "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", + "dev": true, + "requires": { + "git-up": "^4.0.0" + } + }, + "github-slugger": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.1.tgz", + "integrity": "sha512-SsZUjg/P03KPzQBt7OxJPasGw6NRO5uOgiZ5RGXVud5iSIZ0eNZeNp5rTwCxtavrRUa/A77j8mePVc5lEvk0KQ==", + "dev": true, + "requires": { + "emoji-regex": ">=6.0.0 <=6.1.1" + }, + "dependencies": { + "emoji-regex": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", + "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=", + "dev": true + } + } + }, + "glob": { + "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", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "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 + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.2.tgz", + "integrity": "sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-escaper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", + "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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 + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", + "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "i18n": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.4.tgz", + "integrity": "sha512-PvMcG+yqYWXrwgdmCpL+APCGa8lRY0tdlo2cXp9UeR3u4h1bJGqFsgybfmG/MqtL1iDmdaPPPLJebXGrZ1XoMQ==", + "dev": true, + "requires": { + "debug": "*", + "make-plural": "^6.0.1", + "math-interval-parser": "^2.0.1", + "messageformat": "^2.3.0", + "mustache": "*", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "iconv-lite": { + "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" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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-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", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "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-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "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" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-ssh": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", + "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", + "dev": true, + "requires": { + "protocols": "^1.1.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 + }, + "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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "jasmine-reporters": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz", + "integrity": "sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1", + "xmldom": "^0.1.22" + } + }, + "jasmine-xml-reporter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jasmine-xml-reporter/-/jasmine-xml-reporter-1.2.1.tgz", + "integrity": "sha1-fKoqUYAv7+2+JLPqinrUJ8nqfbM=", + "dev": true, + "requires": { + "jasmine-reporters": "^2.2.0" + } + }, + "jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "dev": true, + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.9.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "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" + } + }, + "jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "dev": true, + "requires": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + }, + "string-width": { + "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": "^5.1.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + } + } + }, + "jest-changed-files": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" + } + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-docblock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-environment-jsdom": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" + } + }, + "jest-expect-message": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jest-expect-message/-/jest-expect-message-1.0.2.tgz", + "integrity": "sha512-WFiXMgwS2lOqQZt1iJMI/hOXpUm32X+ApsuzYcQpW5m16Pv6/Gd9kgC+Q+Q1YVNU04kYcAOv9NXMnjg6kKUy6Q==", + "dev": true + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" + } + }, + "jest-leak-detector": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "dev": true, + "requires": { + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true + }, + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" + } + }, + "jest-runner": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" + }, + "dependencies": { + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "string-width": { + "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": "^5.1.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + } + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true + }, + "jest-snapshot": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "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" + } + } + } + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.9.0", + "string-length": "^2.0.0" + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "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=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "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-pointer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.0.tgz", + "integrity": "sha1-jlAFUKaqxUZKRzN32leqbMIoKNc=", + "dev": true, + "requires": { + "foreach": "^2.0.4" + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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==", + "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 + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "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 + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "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=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "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.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "macos-release": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", + "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-plural": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.0.1.tgz", + "integrity": "sha512-h0uBNi4tpDkiWUyYKrJNj8Kif6q3Ba5zp/8jnfPy3pQE+4XcTj6h3eZM5SYVUyDNX9Zk69Isr/dx0I+78aJUaQ==", + "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-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" + } + }, + "matchit": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/matchit/-/matchit-1.0.8.tgz", + "integrity": "sha512-CwPPICzozd/ezCzpVwGYG5bMVieaapnA0vvHDQnmQ2u2vZtVLynoPmvFsZjL67hFOvTBhhpqSR0bq3uloDP/Rw==", + "dev": true, + "requires": { + "@arr/every": "^1.0.0" + } + }, + "math-interval-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", + "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "messageformat": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", + "integrity": "sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==", + "dev": true, + "requires": { + "make-plural": "^4.3.0", + "messageformat-formatters": "^2.0.1", + "messageformat-parser": "^4.1.2" + }, + "dependencies": { + "make-plural": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz", + "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "messageformat-formatters": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz", + "integrity": "sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==", + "dev": true + }, + "messageformat-parser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.2.tgz", + "integrity": "sha512-7dWuifeyldz7vhEuL96Kwq1fhZXBW+TUfbnHN4UCrCxoXQTYjHnR78eI66Gk9LaLLsAvzPNVJBaa66DRfFNaiA==", + "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" + } + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "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 + }, + "mustache": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.0.0.tgz", + "integrity": "sha512-FJgjyX/IVkbXBXYUwH+OYwQKqWpFPLaLVESd70yHjSDunwzV2hZOoTBvPf4KLoxesUzzyfTH6F784Uqd7Wm5yA==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "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 + }, + "nconf": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", + "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", + "dev": true, + "requires": { + "async": "^1.4.0", + "ini": "^1.3.0", + "secure-keys": "^1.0.0", + "yargs": "^3.19.0" + } + }, + "needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "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": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "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" + } + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "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" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "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", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "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-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "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", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "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==", + "dev": true, + "requires": { + "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 + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "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 + }, + "pac-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", + "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", + "dev": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^4.1.1", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "dev": true, + "requires": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "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" + } + }, + "parse-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", + "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0" + } + }, + "parse-url": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", + "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "normalize-url": "^3.3.0", + "parse-path": "^4.0.0", + "protocols": "^1.4.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "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-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "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" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/phin/-/phin-3.4.1.tgz", + "integrity": "sha512-NkBCNRPxeyrgaPlWx4DHTAdca3s2LkvIBiiG6RoSbykcOtW/pA/7rUP/67FPIinvbo7h+HENST/vJ17LdRNUdw==", + "dev": true, + "requires": { + "centra": "^2.2.1" + } + }, + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "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", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "polka": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/polka/-/polka-0.5.2.tgz", + "integrity": "sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==", + "dev": true, + "requires": { + "@polka/url": "^0.5.0", + "trouter": "^2.0.1" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "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=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "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 + } + } + }, + "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 + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + }, + "prompts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" + } + }, + "protocols": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", + "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==", + "dev": true + }, + "proxy-agent": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", + "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", + "dev": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "4", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^3.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^3.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "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==", + "dev": true + }, + "raw-body": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", + "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.3", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react-is": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", + "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" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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" + } + } + } + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "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", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "dev": true, + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "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 + }, + "resolve": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "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 + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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 + }, + "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==", + "dev": true + }, + "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" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^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" + } + } + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "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 + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sisteransi": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "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", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } + }, + "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 + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "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" + } + } + } + }, + "snyk": { + "version": "1.280.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.280.0.tgz", + "integrity": "sha512-tlatfeEg3S40V6ETGsWAHtu5XLDlsZ/Dr2rPEzcyOEa0zjmcZ4/GpLyrJSbOptkx0XYPK2bRO6yCXfP4+R5RBQ==", + "dev": true, + "requires": { + "@snyk/cli-interface": "2.3.0", + "@snyk/dep-graph": "1.13.1", + "@snyk/gemfile": "1.2.0", + "@snyk/snyk-cocoapods-plugin": "2.0.1", + "@types/agent-base": "^4.2.0", + "@types/restify": "^4.3.6", + "abbrev": "^1.1.1", + "ansi-escapes": "3.2.0", + "chalk": "^2.4.2", + "cli-spinner": "0.2.10", + "configstore": "^3.1.2", + "debug": "^3.1.0", + "diff": "^4.0.1", + "git-url-parse": "11.1.2", + "glob": "^7.1.3", + "inquirer": "^6.2.2", + "lodash": "^4.17.14", + "needle": "^2.2.4", + "opn": "^5.5.0", + "os-name": "^3.0.0", + "proxy-agent": "^3.1.1", + "proxy-from-env": "^1.0.0", + "semver": "^6.0.0", + "snyk-config": "^2.2.1", + "snyk-docker-plugin": "1.33.1", + "snyk-go-plugin": "1.11.1", + "snyk-gradle-plugin": "3.2.4", + "snyk-module": "1.9.1", + "snyk-mvn-plugin": "2.7.0", + "snyk-nodejs-lockfile-parser": "1.17.0", + "snyk-nuget-plugin": "1.16.0", + "snyk-php-plugin": "1.7.0", + "snyk-policy": "1.13.5", + "snyk-python-plugin": "1.16.0", + "snyk-resolve": "1.0.1", + "snyk-resolve-deps": "4.4.0", + "snyk-sbt-plugin": "2.11.0", + "snyk-tree": "^1.0.0", + "snyk-try-require": "1.3.1", + "source-map-support": "^0.5.11", + "strip-ansi": "^5.2.0", + "tempfile": "^2.0.0", + "then-fs": "^2.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.2", + "wrap-ansi": "^5.1.0" + } + }, + "snyk-config": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.2.3.tgz", + "integrity": "sha512-9NjxHVMd1U1LFw66Lya4LXgrsFUiuRiL4opxfTFo0LmMNzUoU5Bk/p0zDdg3FE5Wg61r4fP2D8w+QTl6M8CGiw==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash": "^4.17.15", + "nconf": "^0.10.0" + } + }, + "snyk-docker-plugin": { + "version": "1.33.1", + "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.33.1.tgz", + "integrity": "sha512-xfs3DN1tPMTh6J8x2341wGK4HRr+pI5+i/YRuRmsslnBnwk/DkKYcbt8zOIWk6kzMoW8vo+9LqqXBQO/24szKg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "dockerfile-ast": "0.0.16", + "semver": "^6.1.0", + "tar-stream": "^2.1.0", + "tslib": "^1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "snyk-go-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/snyk-go-parser/-/snyk-go-parser-1.3.1.tgz", + "integrity": "sha512-jrFRfIk6yGHFeipGD66WV9ei/A/w/lIiGqI80w1ndMbg6D6M5pVNbK7ngDTmo4GdHrZDYqx/VBGBsUm2bol3Rg==", + "dev": true, + "requires": { + "toml": "^3.0.0", + "tslib": "^1.9.3" + } + }, + "snyk-go-plugin": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.11.1.tgz", + "integrity": "sha512-IsNi7TmpHoRHzONOWJTT8+VYozQJnaJpKgnYNQjzNm2JlV8bDGbdGQ1a8LcEoChxnJ8v8aMZy7GTiQyGGABtEQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "graphlib": "^2.1.1", + "snyk-go-parser": "1.3.1", + "tmp": "0.0.33", + "tslib": "^1.10.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "snyk-gradle-plugin": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-3.2.4.tgz", + "integrity": "sha512-XmS1gl7uZNHP9HP5RaPuRXW3VjkbdWe+EgSOlvmspztkubIOIainqc87k7rIJ6u3tLBhqsZK8b5ru0/E9Q69hQ==", + "dev": true, + "requires": { + "@snyk/cli-interface": "2.3.0", + "@types/debug": "^4.1.4", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "tmp": "0.0.33", + "tslib": "^1.9.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "snyk-module": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.9.1.tgz", + "integrity": "sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "hosted-git-info": "^2.7.1" + } + }, + "snyk-mvn-plugin": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.7.0.tgz", + "integrity": "sha512-DLBt+6ZvtoleXE7Si3wAa6gdPSWsXdIQEY6m2zW2InN9WiaRwIEKMCY822eFmRPZVNNmZNRUIeQsoHZwv/slqQ==", + "dev": true, + "requires": { + "@snyk/cli-interface": "2.2.0", + "debug": "^4.1.1", + "lodash": "^4.17.15", + "needle": "^2.4.0", + "tmp": "^0.1.0", + "tslib": "1.9.3" + }, + "dependencies": { + "@snyk/cli-interface": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.2.0.tgz", + "integrity": "sha512-sA7V2JhgqJB9z5uYotgQc5iNDv//y+Mdm39rANxmFjtZMSYJZHkP80arzPjw1mB5ni/sWec7ieYUUFeySZBfVg==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "requires": { + "rimraf": "^2.6.3" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + } + } + }, + "snyk-nodejs-lockfile-parser": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.17.0.tgz", + "integrity": "sha512-i4GAYFj9TJLOQ8F+FbIJuJWdGymi8w/XcrEX0FzXk7DpYUCY3mWibyKhw8RasfYBx5vLwUzEvRMaQuc2EwlyfA==", + "dev": true, + "requires": { + "@yarnpkg/lockfile": "^1.0.2", + "graphlib": "^2.1.5", + "lodash": "^4.17.14", + "p-map": "2.1.0", + "source-map-support": "^0.5.7", + "tslib": "^1.9.3", + "uuid": "^3.3.2" + } + }, + "snyk-nuget-plugin": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.16.0.tgz", + "integrity": "sha512-OEusK3JKKpR4Yto5KwuqjQGgb9wAhmDqBWSQomWdtKQVFrzn5B6BMzOFikUzmeMTnUGGON7gurQBLXeZZLhRqg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "dotnet-deps-parser": "4.9.0", + "jszip": "^3.1.5", + "lodash": "^4.17.14", + "snyk-paket-parser": "1.5.0", + "tslib": "^1.9.3", + "xml2js": "^0.4.17" + } + }, + "snyk-paket-parser": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.5.0.tgz", + "integrity": "sha512-1CYMPChJ9D9LBy3NLqHyv8TY7pR/LMISSr08LhfFw/FpfRZ+gTH8W6bbxCmybAYrOFNCqZkRprqOYDqZQFHipA==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, + "snyk-php-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.7.0.tgz", + "integrity": "sha512-mDe90xkqSEVrpx1ZC7ItqCOc6fZCySbE+pHVI+dAPUmf1C1LSWZrZVmAVeo/Dw9sJzJfzmcdAFQl+jZP8/uV0A==", + "dev": true, + "requires": { + "@snyk/cli-interface": "2.2.0", + "@snyk/composer-lockfile-parser": "1.2.0", + "tslib": "1.9.3" + }, + "dependencies": { + "@snyk/cli-interface": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.2.0.tgz", + "integrity": "sha512-sA7V2JhgqJB9z5uYotgQc5iNDv//y+Mdm39rANxmFjtZMSYJZHkP80arzPjw1mB5ni/sWec7ieYUUFeySZBfVg==", + "dev": true, + "requires": { + "tslib": "^1.9.3" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + } + } + }, + "snyk-policy": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.5.tgz", + "integrity": "sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "email-validator": "^2.0.4", + "js-yaml": "^3.13.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.0.0", + "snyk-module": "^1.9.1", + "snyk-resolve": "^1.0.1", + "snyk-try-require": "^1.3.1", + "then-fs": "^2.0.0" + } + }, + "snyk-python-plugin": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.16.0.tgz", + "integrity": "sha512-IA53xOcy1s881tbIrIXNqIuCNozd4PAVWN8oF0xgRn2NQbq0e7EWt7kFPJbmZodpLCDpXaKKqV2MHbXruFIsrw==", + "dev": true, + "requires": { + "@snyk/cli-interface": "^2.0.3", + "tmp": "0.0.33" + } + }, + "snyk-resolve": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.0.1.tgz", + "integrity": "sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "then-fs": "^2.0.0" + } + }, + "snyk-resolve-deps": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-4.4.0.tgz", + "integrity": "sha512-aFPtN8WLqIk4E1ulMyzvV5reY1Iksz+3oPnUVib1jKdyTHymmOIYF7z8QZ4UUr52UsgmrD9EA/dq7jpytwFoOQ==", + "dev": true, + "requires": { + "@types/node": "^6.14.4", + "@types/semver": "^5.5.0", + "ansicolors": "^0.3.2", + "debug": "^3.2.5", + "lodash.assign": "^4.2.0", + "lodash.assignin": "^4.2.0", + "lodash.clone": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", + "lru-cache": "^4.0.0", + "semver": "^5.5.1", + "snyk-module": "^1.6.0", + "snyk-resolve": "^1.0.0", + "snyk-tree": "^1.0.0", + "snyk-try-require": "^1.1.1", + "then-fs": "^2.0.0" + }, + "dependencies": { + "@types/node": { + "version": "6.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.9.tgz", + "integrity": "sha512-leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "snyk-sbt-plugin": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.11.0.tgz", + "integrity": "sha512-wUqHLAa3MzV6sVO+05MnV+lwc+T6o87FZZaY+43tQPytBI2Wq23O3j4POREM4fa2iFfiQJoEYD6c7xmhiEUsSA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "semver": "^6.1.2", + "tmp": "^0.1.0", + "tree-kill": "^1.2.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "requires": { + "rimraf": "^2.6.3" + } + } + } + }, + "snyk-tree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz", + "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=", + "dev": true, + "requires": { + "archy": "^1.0.0" + } + }, + "snyk-try-require": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.3.1.tgz", + "integrity": "sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI=", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.clonedeep": "^4.3.0", + "lru-cache": "^4.0.0", + "then-fs": "^2.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "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 + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "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", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "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==", + "dev": true, + "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" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.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" + } + } + } + }, + "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" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.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 + }, + "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 + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "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==", + "dev": true, + "requires": { + "has-flag": "^3.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==", + "dev": true + }, + "tar-stream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", + "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", + "dev": true, + "requires": { + "bl": "^3.0.0", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", + "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "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" + } + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "requires": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, + "then-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", + "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", + "dev": true, + "requires": { + "promise": ">=3.2 <8" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "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", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "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" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "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" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "trouter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/trouter/-/trouter-2.0.1.tgz", + "integrity": "sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==", + "dev": true, + "requires": { + "matchit": "^1.0.0" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "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=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "uglify-js": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.6.tgz", + "integrity": "sha512-yYqjArOYSxvqeeiYH2VGjZOqq6SVmhxzaPjJC1W2F9e+bqvFL9QXQ2osQuKUFjM2hGjKG2YclQnRKWQSt/nOTQ==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=", + "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", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "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=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vscode-languageserver-types": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz", + "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "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" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "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" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "windows-release": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", + "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", + "dev": true, + "requires": { + "execa": "^1.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 + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "string-width": { + "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": "^5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "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==", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "dev": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json index bae93350..28c6b152 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", "main": "index.js", "scripts": { - "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md", + "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md && echo '' >> manifest.schema.json", "test": "jest", "preview": "node preview.js" }, diff --git a/preview.js b/preview.js index ced1eaca..c3a20a1c 100644 --- a/preview.js +++ b/preview.js @@ -70,6 +70,6 @@ if (endpoint) { const fullContext = jsonEscape(Object.assign({}, flagUpdateContext)); fullContext.formVariables = getFormVariableContext(formVariables); - console.log('BODY:\tflag-update.json'); + console.log('BODY:\tflag-update.client-side-sdk.json'); console.log(flagTemplate(fullContext)); } diff --git a/sample-context/flag-update.client-side-sdk.json b/sample-context/flag-update.client-side-sdk.json index 99640c39..55e5df38 100644 --- a/sample-context/flag-update.client-side-sdk.json +++ b/sample-context/flag-update.client-side-sdk.json @@ -31,7 +31,6 @@ "markdown": "* Changed the flag to be available to client\\-side SDKs\n" }, "description": "* Changed the flag to be available to client\\-side SDKs\n", - "shortDescription": "", "project": { "name": "Default Project", "key": "default", diff --git a/sample-context/flag-update.toggle.json b/sample-context/flag-update.toggle.json index 3a9a53aa..87fddb6e 100644 --- a/sample-context/flag-update.toggle.json +++ b/sample-context/flag-update.toggle.json @@ -31,7 +31,6 @@ "markdown": "- added [testing@example.com](mailto:testing@example.com) to the variation *true*" }, "description": "", - "shortDescription": "", "comment": "This is just a test", "member": { "_links": { diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 90fc72f7..00000000 --- a/yarn.lock +++ /dev/null @@ -1,5214 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adobe/helix-log@^2.0.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@adobe/helix-log/-/helix-log-2.2.2.tgz#1a2b54e32bbbc667baad77b2ec50cc99cc67e626" - integrity sha512-Jn8EUE2Mpb3NRz5wWrj3xu51kZDYboTlAueG5mgYdG3/NnHNUJU75N/JMpA+QTPSAi9XjWoUmM7nQW346qbU3g== - dependencies: - colorette "^1.1.0" - ferrum "^1.2.0" - phin "^3.4.0" - polka "^0.5.2" - snyk "^1.226.1" - uuid "^3.3.3" - -"@adobe/jsonschema2md@3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@adobe/jsonschema2md/-/jsonschema2md-3.3.1.tgz#8ddc1e855c6997c6e496ce54f7e77cf9ec302c44" - integrity sha512-fF3TaFazqZ52DaM9Au97STq7LnnMzDFr5Nr4RUY/7XImL0fW8SbjLl3M3AuALI2UZv28qcWxu+h03Nz3k2h7HA== - dependencies: - "@adobe/helix-log" "^2.0.0" - ajv "^6.10.2" - bluebird "^3.5.5" - ejs "^2.6.2" - github-slugger "^1.2.1" - i18n "^0.8.3" - jasmine-xml-reporter "^1.2.1" - json-pointer "^0.6.0" - lodash "^4.17.15" - mkdirp "^0.5.1" - optimist "^0.6.1" - prettier "^1.18.2" - readdirp "^3.1.1" - valid-url "1.0.9" - -"@arr/every@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@arr/every/-/every-1.0.1.tgz#22fe1f8e6355beca6c7c7bde965eb15cf994387b" - integrity sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg== - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" - integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== - dependencies: - "@babel/highlight" "^7.0.0" - -"@babel/core@^7.1.0": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.7.tgz#ee155d2e12300bcc0cff6a8ad46f2af5063803e9" - integrity sha512-jlSjuj/7z138NLZALxVgrx13AOtqip42ATZP7+kYl53GvDV6+4dCek1mVUo8z8c8Xnw/mx2q3d9HWh3griuesQ== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.7" - "@babel/helpers" "^7.7.4" - "@babel/parser" "^7.7.7" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - convert-source-map "^1.7.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.4.0", "@babel/generator@^7.7.4", "@babel/generator@^7.7.7": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.7.tgz#859ac733c44c74148e1a72980a64ec84b85f4f45" - integrity sha512-/AOIBpHh/JU1l0ZFS4kiRCBnLi6OTHzh0RPk3h9isBxkkqELtQNFi1Vr/tiG9p1yfoUdKVwISuXWQR+hwwM4VQ== - dependencies: - "@babel/types" "^7.7.4" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-function-name@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" - integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== - dependencies: - "@babel/helper-get-function-arity" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/helper-get-function-arity@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" - integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helper-plugin-utils@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" - integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== - -"@babel/helper-split-export-declaration@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" - integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== - dependencies: - "@babel/types" "^7.7.4" - -"@babel/helpers@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" - integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== - dependencies: - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/highlight@^7.0.0": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" - integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.4", "@babel/parser@^7.7.7": - version "7.7.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.7.tgz#1b886595419cf92d811316d5b715a53ff38b4937" - integrity sha512-WtTZMZAZLbeymhkd/sEaPD8IQyGAhmuTuvTzLiCFM7iXiVdY0gc0IaI+cW0fh1BnSMbJSzXX6/fHllgHKwHhXw== - -"@babel/plugin-syntax-object-rest-spread@^7.0.0": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" - integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - -"@babel/template@^7.4.0", "@babel/template@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" - integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" - integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== - dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.4" - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" - integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@cnakazawa/watch@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" - integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - -"@jest/console@^24.7.1", "@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - -"@jest/core@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" - integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== - dependencies: - "@jest/console" "^24.7.1" - "@jest/reporters" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-changed-files "^24.9.0" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-resolve-dependencies "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - jest-watcher "^24.9.0" - micromatch "^3.1.10" - p-each-series "^1.0.0" - realpath-native "^1.1.0" - rimraf "^2.5.4" - slash "^2.0.0" - strip-ansi "^5.0.0" - -"@jest/environment@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" - integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== - dependencies: - "@jest/fake-timers" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - -"@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== - dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - -"@jest/reporters@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" - integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - istanbul-lib-coverage "^2.0.2" - istanbul-lib-instrument "^3.0.1" - istanbul-lib-report "^2.0.4" - istanbul-lib-source-maps "^3.0.1" - istanbul-reports "^2.2.6" - jest-haste-map "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - node-notifier "^5.4.2" - slash "^2.0.0" - source-map "^0.6.0" - string-length "^2.0.0" - -"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - -"@jest/test-sequencer@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" - integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== - dependencies: - "@jest/test-result" "^24.9.0" - jest-haste-map "^24.9.0" - jest-runner "^24.9.0" - jest-runtime "^24.9.0" - -"@jest/transform@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" - integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^24.9.0" - babel-plugin-istanbul "^5.1.0" - chalk "^2.0.1" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.1.15" - jest-haste-map "^24.9.0" - jest-regex-util "^24.9.0" - jest-util "^24.9.0" - micromatch "^3.1.10" - pirates "^4.0.1" - realpath-native "^1.1.0" - slash "^2.0.0" - source-map "^0.6.1" - write-file-atomic "2.4.1" - -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@polka/url@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-0.5.0.tgz#b21510597fd601e5d7c95008b76bf0d254ebfd31" - integrity sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw== - -"@snyk/cli-interface@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-1.5.0.tgz#b9dbe6ebfb86e67ffabf29d4e0d28a52670ac456" - integrity sha512-+Qo+IO3YOXWgazlo+CKxOuWFLQQdaNCJ9cSfhFQd687/FuesaIxWdInaAdfpsLScq0c6M1ieZslXgiZELSzxbg== - dependencies: - tslib "^1.9.3" - -"@snyk/cli-interface@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.2.0.tgz#5536bc913917c623d16d727f9f3759521a916026" - integrity sha512-sA7V2JhgqJB9z5uYotgQc5iNDv//y+Mdm39rANxmFjtZMSYJZHkP80arzPjw1mB5ni/sWec7ieYUUFeySZBfVg== - dependencies: - tslib "^1.9.3" - -"@snyk/cli-interface@2.3.0", "@snyk/cli-interface@^2.0.3": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@snyk/cli-interface/-/cli-interface-2.3.0.tgz#9d38f815a5cf2be266006954c2a058463d531e08" - integrity sha512-ecbylK5Ol2ySb/WbfPj0s0GuLQR+KWKFzUgVaoNHaSoN6371qRWwf2uVr+hPUP4gXqCai21Ug/RDArfOhlPwrQ== - dependencies: - tslib "^1.9.3" - -"@snyk/cocoapods-lockfile-parser@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-3.0.0.tgz#514b744cedd9d3d3efb2a5d06fce1662fec2ff1a" - integrity sha512-AebCc+v9vtOL9tFkU4/tommgVsXxqdx6t45kCkBW+FC4PaYvfYEg9Eg/9GqlY9+nFrLFo/uTr+E/aR0AF/KqYA== - dependencies: - "@snyk/dep-graph" "^1.11.0" - "@snyk/ruby-semver" "^2.0.4" - "@types/js-yaml" "^3.12.1" - core-js "^3.2.0" - js-yaml "^3.13.1" - source-map-support "^0.5.7" - tslib "^1.9.3" - -"@snyk/composer-lockfile-parser@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@snyk/composer-lockfile-parser/-/composer-lockfile-parser-1.2.0.tgz#62c6d88c6a39c55dda591854f5380923a993182f" - integrity sha512-kZT+HTqgNcQMeoE5NM9M3jj463M8zI7ZxqZXLw9WoyVs5JTt9g0qFWxIG1cNwZdGVI+y7tzZbNWw9BlMD1vCCQ== - dependencies: - lodash "^4.17.13" - -"@snyk/dep-graph@1.13.1": - version "1.13.1" - resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.13.1.tgz#45721f7e21136b62d1cdd99b3319e717d9071dfb" - integrity sha512-Ww2xvm5UQgrq9eV0SdTBCh+w/4oI2rCx5vn1IOSeypaR0CO4p+do1vm3IDZ2ugg4jLSfHP8+LiD6ORESZMkQ2w== - dependencies: - graphlib "^2.1.5" - lodash "^4.7.14" - object-hash "^1.3.1" - semver "^6.0.0" - source-map-support "^0.5.11" - tslib "^1.9.3" - -"@snyk/dep-graph@^1.11.0", "@snyk/dep-graph@^1.13.1": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@snyk/dep-graph/-/dep-graph-1.15.0.tgz#67bf790bc9f0eee36ad7dad053465cdd928ce223" - integrity sha512-GdF/dvqfKRVHqQio/tSkR4GRpAqIglLPEDZ+XlV7jT5btq9+Fxq2h25Lmm/a7sw+ODTOOqNhTF9y8ASc9VIhww== - dependencies: - graphlib "^2.1.5" - lodash "^4.7.14" - object-hash "^1.3.1" - semver "^6.0.0" - source-map-support "^0.5.11" - tslib "^1.10.0" - -"@snyk/gemfile@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@snyk/gemfile/-/gemfile-1.2.0.tgz#919857944973cce74c650e5428aaf11bcd5c0457" - integrity sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA== - -"@snyk/ruby-semver@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@snyk/ruby-semver/-/ruby-semver-2.0.4.tgz#457686ea7a4d60b10efddde99587efb3a53ba884" - integrity sha512-ceMD4CBS3qtAg+O0BUvkKdsheUNCqi+/+Rju243Ul8PsUgZnXmGiqfk/2z7DCprRQnxUTra4+IyeDQT7wAheCQ== - dependencies: - lodash "^4.17.14" - -"@snyk/snyk-cocoapods-plugin@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-2.0.1.tgz#be8660c854d551a56baa9d072bb4ae7f188cc1cd" - integrity sha512-XVkvaMvMzQ3miJi/YZmsRJSAUfDloYhfg6pXPgzAeAugB4p+cNi01Z68pT62ypB8U/Ugh1Xx2pb9aoOFqBbSjA== - dependencies: - "@snyk/cli-interface" "1.5.0" - "@snyk/cocoapods-lockfile-parser" "3.0.0" - "@snyk/dep-graph" "^1.13.1" - source-map-support "^0.5.7" - tslib "^1.9.3" - -"@types/agent-base@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@types/agent-base/-/agent-base-4.2.0.tgz#00644e8b395b40e1bf50aaf1d22cabc1200d5051" - integrity sha512-8mrhPstU+ZX0Ugya8tl5DsDZ1I5ZwQzbL/8PA0z8Gj0k9nql7nkaMzmPVLj+l/nixWaliXi+EBiLA8bptw3z7Q== - dependencies: - "@types/events" "*" - "@types/node" "*" - -"@types/babel__core@^7.1.0": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" - integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== - dependencies: - "@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.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" - integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== - dependencies: - "@babel/types" "^7.3.0" - -"@types/bunyan@*": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@types/bunyan/-/bunyan-1.8.6.tgz#6527641cca30bedec5feb9ab527b7803b8000582" - integrity sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ== - dependencies: - "@types/node" "*" - -"@types/debug@^4.1.4": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" - integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ== - -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== - -"@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/js-yaml@^3.12.1": - version "3.12.1" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.1.tgz#5c6f4a1eabca84792fbd916f0cb40847f123c656" - integrity sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA== - -"@types/node@*": - version "13.1.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.2.tgz#fe94285bf5e0782e1a9e5a8c482b1c34465fa385" - integrity sha512-B8emQA1qeKerqd1dmIsQYnXi+mmAzTB7flExjmy5X1aVAKFNNNDubkavwR13kR6JnpeLp3aLoJhwn9trWPAyFQ== - -"@types/node@^6.14.4": - version "6.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.9.tgz#733583e21ef0eab85a9737dfafbaa66345a92ef0" - integrity sha512-leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w== - -"@types/restify@^4.3.6": - version "4.3.6" - resolved "https://registry.yarnpkg.com/@types/restify/-/restify-4.3.6.tgz#5da5889b65c34c33937a67686bab591325dde806" - integrity sha512-4l4f0EXnleXQttlhRCXtTuJ8UelsKiAKIK2AAEd2epBHu41aEbM0U2z6E5tUrNwlbxz7qaNBISduGMeg+G3PaA== - dependencies: - "@types/bunyan" "*" - "@types/node" "*" - -"@types/semver@^5.5.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" - integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== - -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - -"@types/xml2js@0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.3.tgz#2f41bfc74d5a4022511721f872ed395a210ad3b7" - integrity sha512-Pv2HGRE4gWLs31In7nsyXEH4uVVsd0HNV9i2dyASvtDIlOtSTr1eczPLDpdEuyv5LWH5LT20GIXwPjkshKWI1g== - dependencies: - "@types/events" "*" - "@types/node" "*" - -"@types/yargs-parser@*": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" - integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== - -"@types/yargs@^13.0.0": - version "13.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.4.tgz#53d231cebe1a540e7e13727fc1f0d13ad4a9ba3b" - integrity sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A== - dependencies: - "@types/yargs-parser" "*" - -"@yarnpkg/lockfile@^1.0.2": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -abab@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== - -abbrev@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn-globals@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" - integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== - dependencies: - acorn "^6.0.1" - acorn-walk "^6.0.1" - -acorn-walk@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" - integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== - -acorn@^5.5.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== - -acorn@^6.0.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" - integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== - -agent-base@4, agent-base@^4.2.0, agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - dependencies: - es6-promisify "^5.0.0" - -agent-base@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== - dependencies: - es6-promisify "^5.0.0" - -ajv@^6.10.2, ajv@^6.5.5: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= - dependencies: - string-width "^2.0.0" - -ansi-escapes@3.2.0, ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansicolors@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" - integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk= - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -ast-types@0.x.x: - version "0.13.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" - integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" - integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== - -babel-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" - integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== - dependencies: - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/babel__core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.9.0" - chalk "^2.4.2" - slash "^2.0.0" - -babel-plugin-istanbul@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" - integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - find-up "^3.0.0" - istanbul-lib-instrument "^3.3.0" - test-exclude "^5.2.3" - -babel-plugin-jest-hoist@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" - integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== - dependencies: - "@types/babel__traverse" "^7.0.6" - -babel-preset-jest@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" - integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== - dependencies: - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.9.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bl@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88" - integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A== - dependencies: - readable-stream "^3.0.1" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -boxen@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - 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" - -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== - -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== - dependencies: - resolve "1.1.7" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -camelcase@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -centra@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/centra/-/centra-2.4.0.tgz#53846f97db27705e9f90c46e0f824f6eb697e2d1" - integrity sha512-AWmF3EHNe/noJHviynZOrdnUuQzT5AMgl9nJPXGvnzGXrI2ZvNDrEcdqskc4EtQwt2Q1IggXb0OXy7zZ1Xvvew== - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-spinner@0.2.10: - version "0.2.10" - resolved "https://registry.yarnpkg.com/cli-spinner/-/cli-spinner-0.2.10.tgz#f7d617a36f5c47a7bc6353c697fc9338ff782a47" - integrity sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q== - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cliui@^3.0.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -clone-deep@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8" - integrity sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg= - dependencies: - for-own "^1.0.0" - is-plain-object "^2.0.1" - kind-of "^3.2.2" - shallow-clone "^0.1.2" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -colorette@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.1.0.tgz#1f943e5a357fac10b4e0f5aaef3b14cdc1af6ec7" - integrity sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg== - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@~2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -configstore@^3.0.0, configstore@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -convert-source-map@^1.4.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js@^3.2.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.1.tgz#39d5e2e346258cc01eb7d44345b1c3c014ca3f05" - integrity sha512-186WjSik2iTGfDjfdCZAxv2ormxtKgemjC3SI6PL31qOA0j5LhTDVjHChccoc7brwLvpvLPiMyRlcO88C4l1QQ== - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" - integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== - dependencies: - cssom "0.3.x" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-uri-to-buffer@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz#77163ea9c20d8641b4707e8f18abdf9a78f34835" - integrity sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ== - -data-urls@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" - integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== - dependencies: - abab "^2.0.0" - whatwg-mimetype "^2.2.0" - whatwg-url "^7.0.0" - -debug@*, debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -debug@2, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -degenerator@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" - integrity sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU= - dependencies: - ast-types "0.x.x" - escodegen "1.x.x" - esprima "3.x.x" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= - -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - -diff@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" - integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== - -dockerfile-ast@0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/dockerfile-ast/-/dockerfile-ast-0.0.16.tgz#10b329d343329dab1de70375833495f85ad65913" - integrity sha512-+HZToHjjiLPl46TqBrok5dMrg5oCkZFPSROMQjRmvin0zG4FxK0DJXTpV/CUPYY2zpmEvVza55XLwSHFx/xZMw== - dependencies: - vscode-languageserver-types "^3.5.0" - -domexception@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== - dependencies: - webidl-conversions "^4.0.2" - -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== - dependencies: - is-obj "^1.0.0" - -dotnet-deps-parser@4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/dotnet-deps-parser/-/dotnet-deps-parser-4.9.0.tgz#d14f9f92ae9a64062cd215c8863d1e77e80236f0" - integrity sha512-V0O+7pI7Ei+iL5Kgy6nYq1UTwzrpqci5K/zf8cXyP5RWBSQBUl/JOE9I67zLUkKiwOdfPhbMQgcRj/yGA+NL1A== - dependencies: - "@types/xml2js" "0.4.3" - lodash "^4.17.11" - source-map-support "^0.5.7" - tslib "^1.10.0" - xml2js "0.4.19" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ejs@^2.6.2: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== - -email-validator@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed" - integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== - -"emoji-regex@>=6.0.0 <=6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" - integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.0-next.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" - integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escodegen@1.x.x, escodegen@^1.9.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.1.tgz#08770602a74ac34c7a90ca9229e7d51e379abc76" - integrity sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -esprima@3.x.x, esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.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" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - 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" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expect@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" - integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== - dependencies: - "@jest/types" "^24.9.0" - ansi-styles "^3.2.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-regex-util "^24.9.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -ferrum@^1.2.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/ferrum/-/ferrum-1.5.0.tgz#e2b6008547813832af77387288a7886e47a60509" - integrity sha512-yTooIyzJOXDRXY/ROvKBw3dgLOBMxJuI2boZvpITdQ7hVB7z89tw+4w66EJjnGpbTDnPanjnYn3aW9E5ZoPmSg== - dependencies: - lodash.isplainobject "4.0.6" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-uri-to-path@1, file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -for-in@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" - integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= - dependencies: - for-in "^1.0.1" - -foreach@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.11" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" - integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -ftp@~0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0= - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-uri@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.4.tgz#d4937ab819e218d4cb5ae18e4f5962bef169cc6a" - integrity sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q== - dependencies: - data-uri-to-buffer "1" - debug "2" - extend "~3.0.2" - file-uri-to-path "1" - ftp "~0.3.10" - readable-stream "2" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -git-up@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.1.tgz#cb2ef086653640e721d2042fe3104857d89007c0" - integrity sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw== - dependencies: - is-ssh "^1.3.0" - parse-url "^5.0.0" - -git-url-parse@11.1.2: - version "11.1.2" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.1.2.tgz#aff1a897c36cc93699270587bea3dbcbbb95de67" - integrity sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ== - dependencies: - git-up "^4.0.0" - -github-slugger@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.2.1.tgz#47e904e70bf2dccd0014748142d31126cfd49508" - integrity sha512-SsZUjg/P03KPzQBt7OxJPasGw6NRO5uOgiZ5RGXVud5iSIZ0eNZeNp5rTwCxtavrRUa/A77j8mePVc5lEvk0KQ== - dependencies: - emoji-regex ">=6.0.0 <=6.1.1" - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - 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" - -global-dirs@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - dependencies: - ini "^1.3.4" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -graphlib@^2.1.1, graphlib@^2.1.5: - version "2.1.8" - resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" - integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== - dependencies: - lodash "^4.17.15" - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - -handlebars@4.7.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.2.tgz#01127b3840156a0927058779482031afe0e730d7" - integrity sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -handlebars@^4.1.2: - version "4.5.3" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" - integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== - dependencies: - neo-async "^2.6.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== - dependencies: - ajv "^6.5.5" - har-schema "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== - -html-encoding-sniffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== - dependencies: - whatwg-encoding "^1.0.1" - -http-errors@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" - integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== - dependencies: - agent-base "4" - debug "3.1.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-proxy-agent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81" - integrity sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg== - dependencies: - agent-base "^4.3.0" - debug "^3.1.0" - -i18n@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.8.4.tgz#948e1ee7ddefef18b2785969388e097327031bd0" - integrity sha512-PvMcG+yqYWXrwgdmCpL+APCGa8lRY0tdlo2cXp9UeR3u4h1bJGqFsgybfmG/MqtL1iDmdaPPPLJebXGrZ1XoMQ== - dependencies: - debug "*" - make-plural "^6.0.1" - math-interval-parser "^2.0.1" - messageformat "^2.3.0" - mustache "*" - sprintf-js "^1.1.2" - -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.0, ini@^1.3.4, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@^6.2.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - -ip@1.1.5, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-buffer@^1.0.2, is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== - -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== - dependencies: - has "^1.0.3" - -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - -is-ssh@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.1.tgz#f349a8cadd24e65298037a522cf7520f2e81a0f3" - integrity sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg== - dependencies: - protocols "^1.1.0" - -is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== - -istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" - integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== - dependencies: - "@babel/generator" "^7.4.0" - "@babel/parser" "^7.4.3" - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.3" - "@babel/types" "^7.4.0" - istanbul-lib-coverage "^2.0.5" - semver "^6.0.0" - -istanbul-lib-report@^2.0.4: - version "2.0.8" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" - integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== - dependencies: - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - supports-color "^6.1.0" - -istanbul-lib-source-maps@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" - source-map "^0.6.1" - -istanbul-reports@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" - integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== - dependencies: - handlebars "^4.1.2" - -jasmine-reporters@^2.2.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz#898818ffc234eb8b3f635d693de4586f95548d43" - integrity sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A== - dependencies: - mkdirp "^0.5.1" - xmldom "^0.1.22" - -jasmine-xml-reporter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jasmine-xml-reporter/-/jasmine-xml-reporter-1.2.1.tgz#7caa2a51802fefedbe24b3ea8a7ad427c9ea7db3" - integrity sha1-fKoqUYAv7+2+JLPqinrUJ8nqfbM= - dependencies: - jasmine-reporters "^2.2.0" - -jest-changed-files@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" - integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== - dependencies: - "@jest/types" "^24.9.0" - execa "^1.0.0" - throat "^4.0.0" - -jest-cli@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" - integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== - dependencies: - "@jest/core" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - exit "^0.1.2" - import-local "^2.0.0" - is-ci "^2.0.0" - jest-config "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - prompts "^2.0.1" - realpath-native "^1.1.0" - yargs "^13.3.0" - -jest-config@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" - integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== - dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^24.9.0" - "@jest/types" "^24.9.0" - babel-jest "^24.9.0" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^24.9.0" - jest-environment-node "^24.9.0" - jest-get-type "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - micromatch "^3.1.10" - pretty-format "^24.9.0" - realpath-native "^1.1.0" - -jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-docblock@^24.3.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" - integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== - dependencies: - detect-newline "^2.1.0" - -jest-each@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" - integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== - dependencies: - "@jest/types" "^24.9.0" - chalk "^2.0.1" - jest-get-type "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - -jest-environment-jsdom@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" - integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - jsdom "^11.5.1" - -jest-environment-node@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" - integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== - dependencies: - "@jest/environment" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/types" "^24.9.0" - jest-mock "^24.9.0" - jest-util "^24.9.0" - -jest-expect-message@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jest-expect-message/-/jest-expect-message-1.0.2.tgz#6d67cdf093457a607d231038a3b84aa3a076bcba" - integrity sha512-WFiXMgwS2lOqQZt1iJMI/hOXpUm32X+ApsuzYcQpW5m16Pv6/Gd9kgC+Q+Q1YVNU04kYcAOv9NXMnjg6kKUy6Q== - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== - dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - -jest-jasmine2@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" - integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^24.9.0" - is-generator-fn "^2.0.0" - jest-each "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-runtime "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - pretty-format "^24.9.0" - throat "^4.0.0" - -jest-leak-detector@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" - integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== - dependencies: - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-matcher-utils@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== - dependencies: - "@jest/types" "^24.9.0" - -jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== - -jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" - integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== - -jest-resolve-dependencies@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" - integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== - dependencies: - "@jest/types" "^24.9.0" - jest-regex-util "^24.3.0" - jest-snapshot "^24.9.0" - -jest-resolve@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" - integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== - dependencies: - "@jest/types" "^24.9.0" - browser-resolve "^1.11.3" - chalk "^2.0.1" - jest-pnp-resolver "^1.2.1" - realpath-native "^1.1.0" - -jest-runner@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" - integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - chalk "^2.4.2" - exit "^0.1.2" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-docblock "^24.3.0" - jest-haste-map "^24.9.0" - jest-jasmine2 "^24.9.0" - jest-leak-detector "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - jest-runtime "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.6.0" - source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runtime@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" - integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== - dependencies: - "@jest/console" "^24.7.1" - "@jest/environment" "^24.9.0" - "@jest/source-map" "^24.3.0" - "@jest/transform" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.1.15" - jest-config "^24.9.0" - jest-haste-map "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - jest-regex-util "^24.3.0" - jest-resolve "^24.9.0" - jest-snapshot "^24.9.0" - jest-util "^24.9.0" - jest-validate "^24.9.0" - realpath-native "^1.1.0" - slash "^2.0.0" - strip-bom "^3.0.0" - yargs "^13.3.0" - -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== - -jest-snapshot@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" - integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== - dependencies: - "@babel/types" "^7.0.0" - "@jest/types" "^24.9.0" - chalk "^2.0.1" - expect "^24.9.0" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - jest-matcher-utils "^24.9.0" - jest-message-util "^24.9.0" - jest-resolve "^24.9.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^24.9.0" - semver "^6.2.0" - -jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== - dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== - dependencies: - "@jest/types" "^24.9.0" - camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" - leven "^3.1.0" - pretty-format "^24.9.0" - -jest-watcher@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" - integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== - dependencies: - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/yargs" "^13.0.0" - ansi-escapes "^3.0.0" - chalk "^2.0.1" - jest-util "^24.9.0" - string-length "^2.0.0" - -jest-worker@^24.6.0, jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -jest@24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" - integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== - dependencies: - import-local "^2.0.0" - jest-cli "^24.9.0" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^11.5.1: - version "11.12.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" - integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== - dependencies: - abab "^2.0.0" - acorn "^5.5.3" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle "^1.0.0" - data-urls "^1.0.0" - domexception "^1.0.1" - escodegen "^1.9.1" - html-encoding-sniffer "^1.0.2" - left-pad "^1.3.0" - nwsapi "^2.0.7" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.87.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.4" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^5.2.0" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-pointer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.0.tgz#8e500550a6aac5464a473377da57aa6cc22828d7" - integrity sha1-jlAFUKaqxUZKRzN32leqbMIoKNc= - dependencies: - foreach "^2.0.4" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== - dependencies: - minimist "^1.2.0" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jszip@^3.1.5: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.2.tgz#b143816df7e106a9597a94c77493385adca5bd1d" - integrity sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA== - dependencies: - lie "~3.3.0" - pako "~1.0.2" - readable-stream "~2.3.6" - set-immediate-shim "~1.0.1" - -kind-of@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" - integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= - dependencies: - is-buffer "^1.0.2" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0, kind-of@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= - dependencies: - package-json "^4.0.0" - -lazy-cache@^0.2.3: - version "0.2.7" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" - integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -left-pad@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== - dependencies: - immediate "~3.0.5" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - -lodash.assignin@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= - -lodash.clone@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= - -lodash.clonedeep@^4.3.0, lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash.isplainobject@4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.7.14: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lru-cache@^4.0.0, lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -macos-release@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" - integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-plural@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735" - integrity sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA== - optionalDependencies: - minimist "^1.2.0" - -make-plural@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-6.0.1.tgz#ed3839fac3f469ebbe505751d48fe3319769edfc" - integrity sha512-h0uBNi4tpDkiWUyYKrJNj8Kif6q3Ba5zp/8jnfPy3pQE+4XcTj6h3eZM5SYVUyDNX9Zk69Isr/dx0I+78aJUaQ== - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -matchit@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/matchit/-/matchit-1.0.8.tgz#9a129e38f79b2053dd75339215b19e1f6bb88efb" - integrity sha512-CwPPICzozd/ezCzpVwGYG5bMVieaapnA0vvHDQnmQ2u2vZtVLynoPmvFsZjL67hFOvTBhhpqSR0bq3uloDP/Rw== - dependencies: - "@arr/every" "^1.0.0" - -math-interval-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-2.0.1.tgz#e22cd6d15a0a7f4c03aec560db76513da615bed4" - integrity sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -messageformat-formatters@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz#0492c1402a48775f751c9b17c0354e92be012b08" - integrity sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg== - -messageformat-parser@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-4.1.2.tgz#fd34ec39912a14868a1595eaeb742485ab8ab372" - integrity sha512-7dWuifeyldz7vhEuL96Kwq1fhZXBW+TUfbnHN4UCrCxoXQTYjHnR78eI66Gk9LaLLsAvzPNVJBaa66DRfFNaiA== - -messageformat@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-2.3.0.tgz#de263c49029d5eae65d7ee25e0754f57f425ad91" - integrity sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w== - dependencies: - make-plural "^4.3.0" - messageformat-formatters "^2.0.1" - messageformat-parser "^4.1.2" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - 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" - -mime-db@1.42.0: - version "1.42.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac" - integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.25" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437" - integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg== - dependencies: - mime-db "1.42.0" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mixin-object@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" - integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= - dependencies: - for-in "^0.1.3" - is-extendable "^0.1.1" - -mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mustache@*: - version "3.2.1" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" - integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -nconf@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.10.0.tgz#da1285ee95d0a922ca6cee75adcf861f48205ad2" - integrity sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q== - dependencies: - async "^1.4.0" - ini "^1.3.0" - secure-keys "^1.0.0" - yargs "^3.19.0" - -needle@^2.2.4, needle@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - -netmask@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" - integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-notifier@^5.4.2: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== - dependencies: - growly "^1.3.0" - is-wsl "^1.1.0" - semver "^5.5.0" - shellwords "^0.1.1" - which "^1.3.0" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-url@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nwsapi@^2.0.7: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-hash@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" - integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== - -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - 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-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - dependencies: - lcid "^1.0.0" - -os-name@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" - integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== - dependencies: - macos-release "^2.2.0" - windows-release "^3.1.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-each-series@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" - integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= - dependencies: - p-reduce "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-map@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-reduce@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" - integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pac-proxy-agent@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz#115b1e58f92576cac2eba718593ca7b0e37de2ad" - integrity sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ== - dependencies: - agent-base "^4.2.0" - debug "^4.1.1" - get-uri "^2.0.0" - http-proxy-agent "^2.1.0" - https-proxy-agent "^3.0.0" - pac-resolver "^3.0.0" - raw-body "^2.2.0" - socks-proxy-agent "^4.0.1" - -pac-resolver@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-3.0.0.tgz#6aea30787db0a891704deb7800a722a7615a6f26" - integrity sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA== - dependencies: - co "^4.6.0" - degenerator "^1.0.4" - ip "^1.1.5" - netmask "^1.0.6" - thunkify "^2.1.2" - -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -pako@~1.0.2: - version "1.0.10" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-path@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.1.tgz#0ec769704949778cb3b8eda5e994c32073a1adff" - integrity sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA== - dependencies: - is-ssh "^1.3.0" - protocols "^1.4.0" - -parse-url@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.1.tgz#99c4084fc11be14141efa41b3d117a96fcb9527f" - integrity sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg== - dependencies: - is-ssh "^1.3.0" - normalize-url "^3.3.0" - parse-path "^4.0.0" - protocols "^1.4.0" - -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -phin@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/phin/-/phin-3.4.1.tgz#b023d14fa86fc6e4b40b6d0dfd5fe478c9c1bbb8" - integrity sha512-NkBCNRPxeyrgaPlWx4DHTAdca3s2LkvIBiiG6RoSbykcOtW/pA/7rUP/67FPIinvbo7h+HENST/vJ17LdRNUdw== - dependencies: - centra "^2.2.1" - -picomatch@^2.0.7: - version "2.1.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" - integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - -polka@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/polka/-/polka-0.5.2.tgz#588bee0c5806dbc6c64958de3a1251860e9f2e26" - integrity sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw== - dependencies: - "@polka/url" "^0.5.0" - trouter "^2.0.1" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -prettier@^1.18.2: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -"promise@>=3.2 <8": - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prompts@^2.0.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" - integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.3" - -protocols@^1.1.0, protocols@^1.4.0: - version "1.4.7" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.7.tgz#95f788a4f0e979b291ffefcf5636ad113d037d32" - integrity sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg== - -proxy-agent@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-3.1.1.tgz#7e04e06bf36afa624a1540be247b47c970bd3014" - integrity sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw== - dependencies: - agent-base "^4.2.0" - debug "4" - http-proxy-agent "^2.1.0" - https-proxy-agent "^3.0.0" - lru-cache "^5.1.1" - pac-proxy-agent "^3.0.1" - proxy-from-env "^1.0.0" - socks-proxy-agent "^4.0.1" - -proxy-from-env@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.24, psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -raw-body@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@^1.0.1, rc@^1.1.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-is@^16.8.4: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" - integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== - -read-pkg-up@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" - integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== - dependencies: - find-up "^3.0.0" - read-pkg "^3.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@2, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - 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" - -readable-stream@^3.0.1, readable-stream@^3.1.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" - integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^3.1.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== - dependencies: - picomatch "^2.0.7" - -realpath-native@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" - integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== - dependencies: - util.promisify "^1.0.0" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -registry-auth-token@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= - dependencies: - rc "^1.0.1" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== - dependencies: - lodash "^4.17.15" - -request-promise-native@^1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== - dependencies: - request-promise-core "1.1.3" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.87.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - 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.0" - 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.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@^1.10.0, resolve@^1.3.2: - version "1.14.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff" - integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg== - dependencies: - path-parse "^1.0.6" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@^2.5.4, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - -rxjs@^6.4.0: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@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" - -sax@>=0.6.0, sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -secure-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca" - integrity sha1-8MgtmKOxOah3aogIBQuCRDEIf8o= - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= - dependencies: - semver "^5.0.3" - -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-immediate-shim@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -shallow-clone@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" - integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= - dependencies: - is-extendable "^0.1.1" - kind-of "^2.0.1" - lazy-cache "^0.2.3" - mixin-object "^2.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -sisteransi@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" - integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -smart-buffer@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" - integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -snyk-config@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-2.2.3.tgz#8e09bb98602ad044954d30a9fc1695ab5b6042fa" - integrity sha512-9NjxHVMd1U1LFw66Lya4LXgrsFUiuRiL4opxfTFo0LmMNzUoU5Bk/p0zDdg3FE5Wg61r4fP2D8w+QTl6M8CGiw== - dependencies: - debug "^3.1.0" - lodash "^4.17.15" - nconf "^0.10.0" - -snyk-docker-plugin@1.33.1: - version "1.33.1" - resolved "https://registry.yarnpkg.com/snyk-docker-plugin/-/snyk-docker-plugin-1.33.1.tgz#9fe0acf9964ed3bc49721163ed88de32b212ed05" - integrity sha512-xfs3DN1tPMTh6J8x2341wGK4HRr+pI5+i/YRuRmsslnBnwk/DkKYcbt8zOIWk6kzMoW8vo+9LqqXBQO/24szKg== - dependencies: - debug "^4.1.1" - dockerfile-ast "0.0.16" - semver "^6.1.0" - tar-stream "^2.1.0" - tslib "^1" - -snyk-go-parser@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/snyk-go-parser/-/snyk-go-parser-1.3.1.tgz#427387507578baf008a3e73828e0e53ed8c796f3" - integrity sha512-jrFRfIk6yGHFeipGD66WV9ei/A/w/lIiGqI80w1ndMbg6D6M5pVNbK7ngDTmo4GdHrZDYqx/VBGBsUm2bol3Rg== - dependencies: - toml "^3.0.0" - tslib "^1.9.3" - -snyk-go-plugin@1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/snyk-go-plugin/-/snyk-go-plugin-1.11.1.tgz#cd7c73c42bd3cf5faa2a90a54cd7c6db926fea5d" - integrity sha512-IsNi7TmpHoRHzONOWJTT8+VYozQJnaJpKgnYNQjzNm2JlV8bDGbdGQ1a8LcEoChxnJ8v8aMZy7GTiQyGGABtEQ== - dependencies: - debug "^4.1.1" - graphlib "^2.1.1" - snyk-go-parser "1.3.1" - tmp "0.0.33" - tslib "^1.10.0" - -snyk-gradle-plugin@3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/snyk-gradle-plugin/-/snyk-gradle-plugin-3.2.2.tgz#703484bec39390d8bd9ca89a408deb77fd63122a" - integrity sha512-ijIWsypbtpdTuRcYTFsnEWbaBnhCc7q0iIg0A4OcOW/xLyInPwyfBMnip4ubNfHAS/PrvzgfwwwJhttcQD0ZaQ== - dependencies: - "@snyk/cli-interface" "2.2.0" - "@types/debug" "^4.1.4" - chalk "^2.4.2" - clone-deep "^0.3.0" - debug "^4.1.1" - tmp "0.0.33" - tslib "^1.9.3" - -snyk-module@1.9.1, snyk-module@^1.6.0, snyk-module@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/snyk-module/-/snyk-module-1.9.1.tgz#b2a78f736600b0ab680f1703466ed7309c980804" - integrity sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA== - dependencies: - debug "^3.1.0" - hosted-git-info "^2.7.1" - -snyk-mvn-plugin@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/snyk-mvn-plugin/-/snyk-mvn-plugin-2.7.0.tgz#39996df2a878b16a7e3cbe5b63a7c43855031d49" - integrity sha512-DLBt+6ZvtoleXE7Si3wAa6gdPSWsXdIQEY6m2zW2InN9WiaRwIEKMCY822eFmRPZVNNmZNRUIeQsoHZwv/slqQ== - dependencies: - "@snyk/cli-interface" "2.2.0" - debug "^4.1.1" - lodash "^4.17.15" - needle "^2.4.0" - tmp "^0.1.0" - tslib "1.9.3" - -snyk-nodejs-lockfile-parser@1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.17.0.tgz#709e1d8c83faccae3bfdac5c10620dcedbf8c4ac" - integrity sha512-i4GAYFj9TJLOQ8F+FbIJuJWdGymi8w/XcrEX0FzXk7DpYUCY3mWibyKhw8RasfYBx5vLwUzEvRMaQuc2EwlyfA== - dependencies: - "@yarnpkg/lockfile" "^1.0.2" - graphlib "^2.1.5" - lodash "^4.17.14" - p-map "2.1.0" - source-map-support "^0.5.7" - tslib "^1.9.3" - uuid "^3.3.2" - -snyk-nuget-plugin@1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/snyk-nuget-plugin/-/snyk-nuget-plugin-1.16.0.tgz#241c6c8a417429c124c3ebf6db314a14eb8eed89" - integrity sha512-OEusK3JKKpR4Yto5KwuqjQGgb9wAhmDqBWSQomWdtKQVFrzn5B6BMzOFikUzmeMTnUGGON7gurQBLXeZZLhRqg== - dependencies: - debug "^3.1.0" - dotnet-deps-parser "4.9.0" - jszip "^3.1.5" - lodash "^4.17.14" - snyk-paket-parser "1.5.0" - tslib "^1.9.3" - xml2js "^0.4.17" - -snyk-paket-parser@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/snyk-paket-parser/-/snyk-paket-parser-1.5.0.tgz#a0e96888d9d304b1ae6203a0369971575f099548" - integrity sha512-1CYMPChJ9D9LBy3NLqHyv8TY7pR/LMISSr08LhfFw/FpfRZ+gTH8W6bbxCmybAYrOFNCqZkRprqOYDqZQFHipA== - dependencies: - tslib "^1.9.3" - -snyk-php-plugin@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/snyk-php-plugin/-/snyk-php-plugin-1.7.0.tgz#cf1906ed8a10db134c803be3d6e4be0cbdc5fe33" - integrity sha512-mDe90xkqSEVrpx1ZC7ItqCOc6fZCySbE+pHVI+dAPUmf1C1LSWZrZVmAVeo/Dw9sJzJfzmcdAFQl+jZP8/uV0A== - dependencies: - "@snyk/cli-interface" "2.2.0" - "@snyk/composer-lockfile-parser" "1.2.0" - tslib "1.9.3" - -snyk-policy@1.13.5: - version "1.13.5" - resolved "https://registry.yarnpkg.com/snyk-policy/-/snyk-policy-1.13.5.tgz#c5cf262f759879a65ab0810dd58d59c8ec7e9e47" - integrity sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ== - dependencies: - debug "^3.1.0" - email-validator "^2.0.4" - js-yaml "^3.13.1" - lodash.clonedeep "^4.5.0" - semver "^6.0.0" - snyk-module "^1.9.1" - snyk-resolve "^1.0.1" - snyk-try-require "^1.3.1" - then-fs "^2.0.0" - -snyk-python-plugin@1.16.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/snyk-python-plugin/-/snyk-python-plugin-1.16.0.tgz#0eae3c085a87b7d91f8097f598571104c01e0f08" - integrity sha512-IA53xOcy1s881tbIrIXNqIuCNozd4PAVWN8oF0xgRn2NQbq0e7EWt7kFPJbmZodpLCDpXaKKqV2MHbXruFIsrw== - dependencies: - "@snyk/cli-interface" "^2.0.3" - tmp "0.0.33" - -snyk-resolve-deps@4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/snyk-resolve-deps/-/snyk-resolve-deps-4.4.0.tgz#ef20fb578a4c920cc262fb73dd292ff21215f52d" - integrity sha512-aFPtN8WLqIk4E1ulMyzvV5reY1Iksz+3oPnUVib1jKdyTHymmOIYF7z8QZ4UUr52UsgmrD9EA/dq7jpytwFoOQ== - dependencies: - "@types/node" "^6.14.4" - "@types/semver" "^5.5.0" - ansicolors "^0.3.2" - debug "^3.2.5" - lodash.assign "^4.2.0" - lodash.assignin "^4.2.0" - lodash.clone "^4.5.0" - lodash.flatten "^4.4.0" - lodash.get "^4.4.2" - lodash.set "^4.3.2" - lru-cache "^4.0.0" - semver "^5.5.1" - snyk-module "^1.6.0" - snyk-resolve "^1.0.0" - snyk-tree "^1.0.0" - snyk-try-require "^1.1.1" - then-fs "^2.0.0" - -snyk-resolve@1.0.1, snyk-resolve@^1.0.0, snyk-resolve@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/snyk-resolve/-/snyk-resolve-1.0.1.tgz#eaa4a275cf7e2b579f18da5b188fe601b8eed9ab" - integrity sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw== - dependencies: - debug "^3.1.0" - then-fs "^2.0.0" - -snyk-sbt-plugin@2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/snyk-sbt-plugin/-/snyk-sbt-plugin-2.11.0.tgz#f5469dcf5589e34575fc901e2064475582cc3e48" - integrity sha512-wUqHLAa3MzV6sVO+05MnV+lwc+T6o87FZZaY+43tQPytBI2Wq23O3j4POREM4fa2iFfiQJoEYD6c7xmhiEUsSA== - dependencies: - debug "^4.1.1" - semver "^6.1.2" - tmp "^0.1.0" - tree-kill "^1.2.2" - tslib "^1.10.0" - -snyk-tree@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/snyk-tree/-/snyk-tree-1.0.0.tgz#0fb73176dbf32e782f19100294160448f9111cc8" - integrity sha1-D7cxdtvzLngvGRAClBYESPkRHMg= - dependencies: - archy "^1.0.0" - -snyk-try-require@1.3.1, snyk-try-require@^1.1.1, snyk-try-require@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/snyk-try-require/-/snyk-try-require-1.3.1.tgz#6e026f92e64af7fcccea1ee53d524841e418a212" - integrity sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI= - dependencies: - debug "^3.1.0" - lodash.clonedeep "^4.3.0" - lru-cache "^4.0.0" - then-fs "^2.0.0" - -snyk@^1.226.1: - version "1.272.0" - resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.272.0.tgz#854a545ed14a415560a57b36b065023dd590e621" - integrity sha512-fs2i8rj0gf+azC/8YOLIM9lrKZKtu5JYkL065Hge95KDWzzSQMpZWdec1qqN/uTvzZ0b89303Lh/+MuY//br1Q== - dependencies: - "@snyk/cli-interface" "2.3.0" - "@snyk/dep-graph" "1.13.1" - "@snyk/gemfile" "1.2.0" - "@snyk/snyk-cocoapods-plugin" "2.0.1" - "@types/agent-base" "^4.2.0" - "@types/restify" "^4.3.6" - abbrev "^1.1.1" - ansi-escapes "3.2.0" - chalk "^2.4.2" - cli-spinner "0.2.10" - configstore "^3.1.2" - debug "^3.1.0" - diff "^4.0.1" - git-url-parse "11.1.2" - glob "^7.1.3" - inquirer "^6.2.2" - lodash "^4.17.14" - needle "^2.2.4" - opn "^5.5.0" - os-name "^3.0.0" - proxy-agent "^3.1.1" - proxy-from-env "^1.0.0" - semver "^6.0.0" - snyk-config "^2.2.1" - snyk-docker-plugin "1.33.1" - snyk-go-plugin "1.11.1" - snyk-gradle-plugin "3.2.2" - snyk-module "1.9.1" - snyk-mvn-plugin "2.7.0" - snyk-nodejs-lockfile-parser "1.17.0" - snyk-nuget-plugin "1.16.0" - snyk-php-plugin "1.7.0" - snyk-policy "1.13.5" - snyk-python-plugin "1.16.0" - snyk-resolve "1.0.1" - snyk-resolve-deps "4.4.0" - snyk-sbt-plugin "2.11.0" - snyk-tree "^1.0.0" - snyk-try-require "1.3.1" - source-map-support "^0.5.11" - strip-ansi "^5.2.0" - tempfile "^2.0.0" - then-fs "^2.0.0" - update-notifier "^2.5.0" - uuid "^3.3.2" - wrap-ansi "^5.1.0" - -socks-proxy-agent@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" - integrity sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg== - dependencies: - agent-base "~4.2.1" - socks "~2.3.2" - -socks@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" - integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== - dependencies: - ip "1.1.5" - smart-buffer "^4.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.11, source-map-support@^0.5.6, source-map-support@^0.5.7: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - 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" - -stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== - dependencies: - define-properties "^1.1.3" - function-bind "^1.1.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -symbol-tree@^3.2.2: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -tar-stream@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" - integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== - dependencies: - bl "^3.0.0" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= - -tempfile@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265" - integrity sha1-awRGhWqbERTRhW/8vlCczLCXcmU= - dependencies: - temp-dir "^1.0.0" - uuid "^3.0.1" - -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" - -test-exclude@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" - integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - read-pkg-up "^4.0.0" - require-main-filename "^2.0.0" - -then-fs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/then-fs/-/then-fs-2.0.0.tgz#72f792dd9d31705a91ae19ebfcf8b3f968c81da2" - integrity sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI= - dependencies: - promise ">=3.2 <8" - -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -thunkify@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d" - integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0= - -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - -tmp@0.0.33, tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmp@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== - dependencies: - rimraf "^2.6.3" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -toml@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" - integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - -tough-cookie@^2.3.3, tough-cookie@^2.3.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -trouter@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/trouter/-/trouter-2.0.1.tgz#2726a5f8558e090d24c3a393f09eaab1df232df6" - integrity sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ== - dependencies: - matchit "^1.0.0" - -tslib@1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== - -tslib@^1, tslib@^1.10.0, tslib@^1.9.0, tslib@^1.9.3: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -uglify-js@^3.1.4: - version "3.7.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.3.tgz#f918fce9182f466d5140f24bb0ff35c2d32dcc6a" - integrity sha512-7tINm46/3puUA4hCkKYo4Xdts+JDaVC9ZPRcG8Xw9R4nhO/gZgUM3TENq8IF4Vatk8qCig4MzP/c8G4u2BkVQg== - dependencies: - commander "~2.20.3" - source-map "~0.6.1" - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - dependencies: - crypto-random-string "^1.0.0" - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - -update-notifier@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -uuid@^3.0.1, uuid@^3.3.2, uuid@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" - integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== - -valid-url@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" - integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vscode-languageserver-types@^3.5.0: - version "3.14.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz#d3b5952246d30e5241592b6dde8280e03942e743" - integrity sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A== - -w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= - dependencies: - browser-process-hrtime "^0.1.2" - -walker@^1.0.7, walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9, which@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== - dependencies: - string-width "^2.1.1" - -window-size@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= - -windows-release@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" - integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== - dependencies: - execa "^1.0.0" - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" - integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^2.0.0: - version "2.4.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== - dependencies: - async-limiter "~1.0.0" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xml2js@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== - dependencies: - sax ">=0.6.0" - xmlbuilder "~9.0.1" - -xml2js@^0.4.17: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - -xmlbuilder@~9.0.1: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= - -xmldom@^0.1.22: - version "0.1.31" - resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" - integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== - -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= - -y18n@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.1" - -yargs@^3.19.0: - version "3.32.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" - integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= - dependencies: - camelcase "^2.0.1" - cliui "^3.0.3" - decamelize "^1.1.1" - os-locale "^1.4.0" - string-width "^1.0.1" - window-size "^0.1.4" - y18n "^3.2.0" From 9162001b6c43f43c97c94ae038911581f8e2f36b Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 27 Jan 2020 10:20:47 -0800 Subject: [PATCH 173/936] Remove last of metric (#21) --- manifest.schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.schema.json b/manifest.schema.json index 61ad7a6e..e63be732 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -427,7 +427,7 @@ "type": "string" }, "default": { - "$id": "#/properties/capability/audit-log-events-hook/templates/metric", + "$id": "#/properties/capability/audit-log-events-hook/templates/default", "title": "default template", "description": "Template to use if the event does not have a corresponding named template", "type": "string" From 2e31ed2a3cfab675ae5801db901abe6a2a51a41b Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 27 Jan 2020 16:17:52 -0800 Subject: [PATCH 174/936] rollback readme (#22) --- README.md | 732 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 374 insertions(+), 358 deletions(-) diff --git a/README.md b/README.md index e2d47428..9a05e2d5 100644 --- a/README.md +++ b/README.md @@ -1,358 +1,374 @@ -# README - -## Top-level Schemas - -- [Abstract](./abstract.md "This is an abstract schema") – `https://example.com/schemas/abstract` -- [Abstract](./abstract-1.md "This is an abstract schema") – `https://example.com/schemas/abstract` -- [Abstract](./abstract-2.md "This is an abstract schema") – `https://example.com/schemas/abstract` -- [Abstract](./abstract-3.md "This is an abstract schema") – `https://example.com/schemas/abstract` -- [Abstract](./abstract-4.md "This is an abstract schema") – `https://example.com/schemas/abstract` -- [Abstract](./abstract-5.md "This is an abstract schema") – `https://example.com/schemas/abstract` -- [Arrays](./arrays.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` -- [Arrays](./tuple.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` -- [Arrays](./arrays-1.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` -- [Arrays](./arrays-2.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` -- [Arrays](./arrays-3.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` -- [Arrays](./tuple-1.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` -- [Arrays](./arrays-4.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` -- [Arrays](./arrays-5.md "This is an example schema with examples for multiple array types and their constraints") – `https://example.com/schemas/arrays` -- [Button](./button.md "Renders a Button") – `http://www.example.com/schemas/components/Button.json` -- [Button](./button-1.md "Renders a Button") – `http://www.example.com/schemas/components/Button.json` -- [Complex References](./complex.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` -- [Complex References](./complex-1.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` -- [Complex References](./complex-2.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` -- [Complex References](./complex-3.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` -- [Complex References](./complex-4.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` -- [Complex References](./complex-5.md "This is an example schema that uses types defined in other schemas") – `https://example.com/schemas/complex` -- [Constant Types](./constants.md "This is an example schema with examples for properties with constant values") – `https://example.com/schemas/constants` -- [Constant Types](./constants-1.md "This is an example schema with examples for properties with constant values") – `https://example.com/schemas/constants` -- [Constant Types](./constants-2.md "This is an example schema with examples for properties with constant values") – `https://example.com/schemas/constants` -- [Constant Types](./constants-3.md "This is an example schema with examples for properties with constant values") – `https://example.com/schemas/constants` -- [Custom](./custom.md "This is an extensible schema") – `https://example.com/schemas/custom` -- [Custom](./custom-1.md "This is an extensible schema") – `https://example.com/schemas/custom` -- [Custom](./custom-2.md "This is an extensible schema") – `https://example.com/schemas/custom` -- [Custom](./custom-3.md "This is an extensible schema") – `https://example.com/schemas/custom` -- [Deeply Extending](./deepextending.md "This is an extending schema") – `https://example.com/schemas/deepextending` -- [Deeply Extending](./deepextending-1.md "This is an extending schema") – `https://example.com/schemas/deepextending` -- [Deeply Extending](./deepextending-2.md "This is an extending schema") – `https://example.com/schemas/deepextending` -- [Deeply Extending](./deepextending-3.md "This is an extending schema") – `https://example.com/schemas/deepextending` -- [Definitions](./definitions.md "This is an example of using a definitions object within a schema") – `https://example.com/schemas/definitions` -- [Definitions](./definitions-1.md "This is an example of using a definitions object within a schema") – `https://example.com/schemas/definitions` -- [Definitions](./definitions-2.md "This is an example of using a definitions object within a schema") – `https://example.com/schemas/definitions` -- [Definitions](./definitions-3.md "This is an example of using a definitions object within a schema") – `https://example.com/schemas/definitions` -- [Enumerated ](./enums.md "This is an example schema with examples for properties with enum values") – `https://example.com/schemas/enums` -- [Enumerated ](./enums-1.md "This is an example schema with examples for properties with enum values") – `https://example.com/schemas/enums` -- [Enumerated ](./enums-2.md "This is an example schema with examples for properties with enum values") – `https://example.com/schemas/enums` -- [Enumerated ](./enums-3.md "This is an example schema with examples for properties with enum values") – `https://example.com/schemas/enums` -- [Example](./example.md "This is an example schema with examples") – `https://example.com/schemas/example` -- [Example](./example-1.md "This is an example schema with examples") – `https://example.com/schemas/example` -- [Example](./example-2.md "This is an example schema with examples") – `https://example.com/schemas/example` -- [Example](./example-3.md "This is an example schema with examples") – `https://example.com/schemas/example` -- [Examples](./examples.md "This is an example schema with multiple examples") – `https://example.com/schemas/examples` -- [Examples](./examples-1.md "This is an example schema with multiple examples") – `https://example.com/schemas/examples` -- [Examples](./examples-2.md "This is an example schema with multiple examples") – `https://example.com/schemas/examples` -- [Examples](./examples-3.md "This is an example schema with multiple examples") – `https://example.com/schemas/examples` -- [Extending](./extending.md "This is an extending schema") – `https://example.com/schemas/extending` -- [Extending](./extending-1.md "This is an extending schema") – `https://example.com/schemas/extending` -- [Extending](./extending-2.md "This is an extending schema") – `https://example.com/schemas/extending` -- [Extending](./extending-3.md "This is an extending schema") – `https://example.com/schemas/extending` -- [Extensible](./extensible.md "This is an extensible schema") – `https://example.com/schemas/extensible` -- [Extensible](./extensible-1.md "This is an extensible schema") – `https://example.com/schemas/extensible` -- [Extensible](./extensible-2.md "This is an extensible schema") – `https://example.com/schemas/extensible` -- [Extensible](./extensible-3.md "This is an extensible schema") – `https://example.com/schemas/extensible` -- [HTML](./html.md) – `-` -- [HTML](./html-1.md) – `-` -- [Identifiable](./identifiable.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` -- [Identifiable](./identifiable-1.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` -- [Identifiable](./identifiable-2.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` -- [Identifiable](./identifiable-3.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` -- [Identifiable](./identifiable-4.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` -- [Identifiable](./identifiable-5.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/identifiable` -- [JWT](./jwt.md) – `-` -- [JWT](./jwt-1.md) – `-` -- [Join Types](./join.md "This is an example of a JSON schema with only a join type key") – `https://example.com/schemas/join` -- [Join Types](./join-1.md "This is an example of a JSON schema with only a join type key") – `https://example.com/schemas/join` -- [Join Types](./join-2.md "This is an example of a JSON schema with only a join type key") – `https://example.com/schemas/join` -- [Join Types](./join-3.md "This is an example of a JSON schema with only a join type key") – `https://example.com/schemas/join` -- [LaunchDarkly Integrations Manifest](./manifest.md "Describes the capabilities and intent of a LaunchDarkly integration") – `https://launchdarkly.com/schemas/v1.0/integrations` -- [LaunchDarkly Integrations Manifest](./manifest-1.md "Describes the capabilities and intent of a LaunchDarkly integration") – `https://launchdarkly.com/schemas/v1.0/integrations` -- [Meta](./meta.md "Content and Section Metadata Properties") – `https://ns.adobe.com/helix/pipeline/meta` -- [Meta](./meta-1.md "Content and Section Metadata Properties") – `https://ns.adobe.com/helix/pipeline/meta` -- [Nested Object](./nestedobj.md) – `https://example.com/schemas/nestedobject` -- [Nested Object](./nestedobj-1.md) – `https://example.com/schemas/nestedobject` -- [Nested Object](./nestedobj-2.md) – `https://example.com/schemas/nestedobject` -- [Nested Object](./nestedobj-3.md) – `https://example.com/schemas/nestedobject` -- [Not true](./not.md) – `-` -- [Not true](./not-1.md) – `-` -- [PNG](./png.md) – `-` -- [PNG](./png-1.md) – `-` -- [Pattern Properties](./pattern.md "This is an example of a JSON schema with only a patternProperties key") – `https://example.com/schemas/pattern` -- [Pattern Properties](./pattern-1.md "This is an example of a JSON schema with only a patternProperties key") – `https://example.com/schemas/pattern` -- [Pattern Properties](./pattern-2.md "This is an example of a JSON schema with only a patternProperties key") – `https://example.com/schemas/pattern` -- [Pattern Properties](./pattern-3.md "This is an example of a JSON schema with only a patternProperties key") – `https://example.com/schemas/pattern` -- [Properties](./type.md "Properties of Button") – `-` -- [Properties](./format.md "Properties of Datepicker") – `-` -- [Properties](./type-1.md "Properties of Button") – `-` -- [Properties](./format-1.md "Properties of Datepicker") – `-` -- [Simple](./simple.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` -- [Simple](./simple-1.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` -- [Simple](./simple-2.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` -- [Simple](./simple-3.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` -- [Simple](./simple-4.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` -- [Simple](./simple-5.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple` -- [Simple Types](./simpletypes.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` -- [Simple Types](./simpletypes-1.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` -- [Simple Types](./simpletypes-2.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` -- [Simple Types](./simpletypes-3.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` -- [Simple Types](./simpletypes-4.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` -- [Simple Types](./simpletypes-5.md "This is an example schema with examples for multiple types and their constraints") – `https://example.com/schemas/simpletypes` -- [Stabilizing](./stabilizing.md "This is a schema which is currently in the stabilizing status") – `https://example.com/schemas/stabilizing` -- [Stabilizing](./stabilizing-1.md "This is a schema which is currently in the stabilizing status") – `https://example.com/schemas/stabilizing` -- [Stabilizing](./stabilizing-2.md "This is a schema which is currently in the stabilizing status") – `https://example.com/schemas/stabilizing` -- [Stabilizing](./stabilizing-3.md "This is a schema which is currently in the stabilizing status") – `https://example.com/schemas/stabilizing` -- [Subdir](./subdir.md "A schema in a sub directory") – `https://example.com/schemas/subdir/subdir` -- [Subdir](./subdir-1.md "A schema in a sub directory") – `https://example.com/schemas/subdir/subdir` -- [Subdir](./subdir-2.md "A schema in a sub directory") – `https://example.com/schemas/subdir/subdir` -- [Subdir](./subdir-3.md "A schema in a sub directory") – `https://example.com/schemas/subdir/subdir` -- [Type Arrays](./typearrays.md "This schema test type arrays and nullable types") – `https://example.com/schemas/typearrays` -- [Type Arrays](./typearrays-1.md "This schema test type arrays and nullable types") – `https://example.com/schemas/typearrays` -- [Type Arrays](./typearrays-2.md "This schema test type arrays and nullable types") – `https://example.com/schemas/typearrays` -- [Type Arrays](./typearrays-3.md "This schema test type arrays and nullable types") – `https://example.com/schemas/typearrays` -- [Untitled array in undefined](./arrays-6.md) – `-` -- [Untitled array in undefined](./arrays-7.md) – `-` -- [Untitled object in undefined](./object.md) – `-` -- [Untitled object in undefined](./null.md) – `-` -- [Untitled object in undefined](./enums-4.md) – `-` -- [Untitled object in undefined](./deadref.md) – `-` -- [Untitled object in undefined](./one.md "The first schema in the cycle (or is it the last?)") – `http://example.com/schemas/one` -- [Untitled object in undefined](./three.md) – `http://example.com/schemas/three` -- [Untitled object in undefined](./two.md) – `http://example.com/schemas/two` -- [Untitled object in undefined](./additionalprops.md) – `-` -- [Untitled object in undefined](./object-1.md) – `-` -- [Untitled object in undefined](./null-1.md) – `-` -- [Untitled object in undefined](./enums-5.md) – `-` -- [Untitled object in undefined](./deadref-1.md) – `-` -- [Untitled object in undefined](./one-1.md "The first schema in the cycle (or is it the last?)") – `http://example.com/schemas/one` -- [Untitled object in undefined](./three-1.md) – `http://example.com/schemas/three` -- [Untitled object in undefined](./two-1.md) – `http://example.com/schemas/two` -- [Untitled object in undefined](./additionalprops-1.md) – `-` -- [Untitled schema](./merged.md) – `-` -- [Untitled schema](./objectorarray.md) – `-` -- [Untitled schema](./wrong.md) – `https://example.com/ns/wrong` -- [Untitled schema](./merged-1.md) – `-` -- [Untitled schema](./objectorarray-1.md) – `-` -- [Untitled schema](./wrong-1.md) – `https://example.com/ns/wrong` -- [You don't know what I am](./undefined.md) – `-` -- [You don't know what I am](./undefined-1.md) – `-` - -## Other Schemas - -### Objects - -- [Audit Log Events Hook](./manifest-properties-capabilities-properties-audit-log-events-hook.md "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint") – `#/properties/capability/audit-log-events-hook#/properties/capabilities/properties/auditLogEventsHook` -- [Capabilities](./manifest-properties-capabilities.md "Specify which capabilities you'd like your integration to have") – `#/properties/capabilities#/properties/capabilities` -- [Endpoint](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-endpoint.md "Properties that describe the HTTP endpoint LaunchDarkly will send hooks to") – `#/properties/capability/audit-log-events-hook/receiving-endpoint#/properties/capabilities/properties/auditLogEventsHook/properties/endpoint` -- [Enumerated (Nested)](./enums-properties-enumerated-nested.md "This is an example schema with examples for properties of nested objects with enum values") – `https://example.com/schemas/enums#/properties/nested` -- [Enumerated (Nested)](./enums-1-properties-enumerated-nested.md "This is an example schema with examples for properties of nested objects with enum values") – `https://example.com/schemas/enums#/properties/nested` -- [Enumerated (Nested)](./enums-2-properties-enumerated-nested.md "This is an example schema with examples for properties of nested objects with enum values") – `https://example.com/schemas/enums#/properties/nested` -- [Enumerated (Nested)](./enums-3-properties-enumerated-nested.md "This is an example schema with examples for properties of nested objects with enum values") – `https://example.com/schemas/enums#/properties/nested` -- [Form variable](./manifest-properties-form-variables-form-variable.md "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration") – `#/properties/formVariables/variable#/properties/formVariables/items` -- [Header items](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-endpoint-properties-http-headers-header-items.md "A name and value pair to send as headers with the hook request") – `#/properties/capability/audit-log-events-hook/header/items#/properties/capabilities/properties/auditLogEventsHook/properties/endpoint/properties/headers/items` -- [Icons](./manifest-properties-icons.md "Logos describing your integration in SVG format") – `#/properties/icons#/properties/icons` -- [Links](./manifest-properties-links.md "A set of reference links supporting your integration") – `#/properties/links#/properties/links` -- [Policy](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy-policy.md "A LaunchDarkly policy") – `#/properties/capability/audit-log-events-hook/policy#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy/items` -- [Properties](./button-properties-properties.md "Properties of Button") – `http://www.example.com/schemas/components/Button.json#/properties/properties` -- [Properties](./button-1-properties-properties.md "Properties of Button") – `http://www.example.com/schemas/components/Button.json#/properties/properties` -- [Simple](./complex-properties-simple.md "This is a very simple example of a JSON schema") – `https://example.com/schemas/simple#/properties/refnamed` -- [Untitled object in Abstract](./abstract-defs-first.md) – `https://example.com/schemas/abstract#/$defs/first` -- [Untitled object in Abstract](./abstract-defs-second.md) – `https://example.com/schemas/abstract#/$defs/second` -- [Untitled object in Abstract](./abstract-1-definitions-first.md) – `https://example.com/schemas/abstract#/definitions/first` -- [Untitled object in Abstract](./abstract-1-definitions-second.md) – `https://example.com/schemas/abstract#/definitions/second` -- [Untitled object in Abstract](./abstract-2-definitions-first.md) – `https://example.com/schemas/abstract#/definitions/first` -- [Untitled object in Abstract](./abstract-2-definitions-second.md) – `https://example.com/schemas/abstract#/definitions/second` -- [Untitled object in Abstract](./abstract-3-defs-first.md) – `https://example.com/schemas/abstract#/$defs/first` -- [Untitled object in Abstract](./abstract-3-defs-second.md) – `https://example.com/schemas/abstract#/$defs/second` -- [Untitled object in Abstract](./abstract-4-definitions-first.md) – `https://example.com/schemas/abstract#/definitions/first` -- [Untitled object in Abstract](./abstract-4-definitions-second.md) – `https://example.com/schemas/abstract#/definitions/second` -- [Untitled object in Abstract](./abstract-5-definitions-first.md) – `https://example.com/schemas/abstract#/definitions/first` -- [Untitled object in Abstract](./abstract-5-definitions-second.md) – `https://example.com/schemas/abstract#/definitions/second` -- [Untitled object in Arrays](./arrays-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` -- [Untitled object in Arrays](./arrays-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` -- [Untitled object in Arrays](./arrays-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` -- [Untitled object in Arrays](./arrays-1-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` -- [Untitled object in Arrays](./arrays-1-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` -- [Untitled object in Arrays](./arrays-1-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` -- [Untitled object in Arrays](./arrays-2-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` -- [Untitled object in Arrays](./arrays-2-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` -- [Untitled object in Arrays](./arrays-2-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` -- [Untitled object in Arrays](./arrays-3-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` -- [Untitled object in Arrays](./arrays-3-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` -- [Untitled object in Arrays](./arrays-3-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` -- [Untitled object in Arrays](./arrays-4-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` -- [Untitled object in Arrays](./arrays-4-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` -- [Untitled object in Arrays](./arrays-4-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` -- [Untitled object in Arrays](./arrays-5-properties-objectlist-items.md) – `https://example.com/schemas/arrays#/properties/objectlist/items` -- [Untitled object in Arrays](./arrays-5-properties-jointypelist-items-oneof-0.md "A simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/0` -- [Untitled object in Arrays](./arrays-5-properties-jointypelist-items-oneof-1.md "Another simple string") – `https://example.com/schemas/arrays#/properties/JoinTypelist/items/oneOf/1` -- [Untitled object in Complex References](./complex-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` -- [Untitled object in Complex References](./complex-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` -- [Untitled object in Complex References](./complex-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` -- [Untitled object in Complex References](./complex-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` -- [Untitled object in Complex References](./complex-1-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` -- [Untitled object in Complex References](./complex-1-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` -- [Untitled object in Complex References](./complex-1-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` -- [Untitled object in Complex References](./complex-1-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` -- [Untitled object in Complex References](./complex-2-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` -- [Untitled object in Complex References](./complex-2-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` -- [Untitled object in Complex References](./complex-2-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` -- [Untitled object in Complex References](./complex-2-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` -- [Untitled object in Complex References](./complex-3-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` -- [Untitled object in Complex References](./complex-3-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` -- [Untitled object in Complex References](./complex-3-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` -- [Untitled object in Complex References](./complex-3-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` -- [Untitled object in Complex References](./complex-4-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` -- [Untitled object in Complex References](./complex-4-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` -- [Untitled object in Complex References](./complex-4-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` -- [Untitled object in Complex References](./complex-4-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` -- [Untitled object in Complex References](./complex-5-properties-refabstract.md) – `https://example.com/schemas/complex#/properties/refabstract` -- [Untitled object in Complex References](./complex-5-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refobj` -- [Untitled object in Complex References](./complex-5-properties-refnestedobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj` -- [Untitled object in Complex References](./complex-5-properties-refnestedobj-properties-refobj.md) – `https://example.com/schemas/complex#/properties/refnestedobj/properties/refobj` -- [Untitled object in JWT](./jwt-json-web-token-items-1.md) – `undefined#/contentSchema/items/1` -- [Untitled object in JWT](./jwt-1-json-web-token-items-1.md) – `undefined#/contentSchema/items/1` -- [Untitled object in Join Types](./join-oneof-0-not-oneof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/0` -- [Untitled object in Join Types](./join-oneof-0-not-oneof-1.md "Another simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/1` -- [Untitled object in Join Types](./join-oneof-1-allof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/1/allOf/0` -- [Untitled object in Join Types](./join-oneof-2-anyof-0.md "Another simple string") – `https://example.com/schemas/join#/oneOf/2/anyOf/0` -- [Untitled object in Join Types](./join-1-oneof-0-not-oneof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/0` -- [Untitled object in Join Types](./join-1-oneof-0-not-oneof-1.md "Another simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/1` -- [Untitled object in Join Types](./join-1-oneof-1-allof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/1/allOf/0` -- [Untitled object in Join Types](./join-1-oneof-2-anyof-0.md "Another simple string") – `https://example.com/schemas/join#/oneOf/2/anyOf/0` -- [Untitled object in Join Types](./join-2-oneof-0-not-oneof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/0` -- [Untitled object in Join Types](./join-2-oneof-0-not-oneof-1.md "Another simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/1` -- [Untitled object in Join Types](./join-2-oneof-1-allof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/1/allOf/0` -- [Untitled object in Join Types](./join-2-oneof-2-anyof-0.md "Another simple string") – `https://example.com/schemas/join#/oneOf/2/anyOf/0` -- [Untitled object in Join Types](./join-3-oneof-0-not-oneof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/0` -- [Untitled object in Join Types](./join-3-oneof-0-not-oneof-1.md "Another simple string") – `https://example.com/schemas/join#/oneOf/0/not/oneOf/1` -- [Untitled object in Join Types](./join-3-oneof-1-allof-0.md "A simple string") – `https://example.com/schemas/join#/oneOf/1/allOf/0` -- [Untitled object in Join Types](./join-3-oneof-2-anyof-0.md "Another simple string") – `https://example.com/schemas/join#/oneOf/2/anyOf/0` -- [Untitled object in Nested Object](./nestedobj-properties-settings.md "settings") – `https://example.com/schemas/nestedobject#/properties/settings` -- [Untitled object in Nested Object](./nestedobj-properties-settings-properties-collaborators.md "collaborators") – `https://example.com/schemas/nestedobject#/properties/settings/properties/collaborators` -- [Untitled object in Nested Object](./nestedobj-1-properties-settings.md "settings") – `https://example.com/schemas/nestedobject#/properties/settings` -- [Untitled object in Nested Object](./nestedobj-1-properties-settings-properties-collaborators.md "collaborators") – `https://example.com/schemas/nestedobject#/properties/settings/properties/collaborators` -- [Untitled object in Nested Object](./nestedobj-2-properties-settings.md "settings") – `https://example.com/schemas/nestedobject#/properties/settings` -- [Untitled object in Nested Object](./nestedobj-2-properties-settings-properties-collaborators.md "collaborators") – `https://example.com/schemas/nestedobject#/properties/settings/properties/collaborators` -- [Untitled object in Nested Object](./nestedobj-3-properties-settings.md "settings") – `https://example.com/schemas/nestedobject#/properties/settings` -- [Untitled object in Nested Object](./nestedobj-3-properties-settings-properties-collaborators.md "collaborators") – `https://example.com/schemas/nestedobject#/properties/settings/properties/collaborators` -- [Untitled object in undefined](./one-properties-children-items-anyof-0.md) – `http://example.com/schemas/three#/properties/children/items/anyOf/0` -- [Untitled object in undefined](./three-1-properties-children-items-anyof-1.md) – `http://example.com/schemas/two#/properties/children/items/anyOf/1` -- [Webhook body template](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-webhook-body-template.md "Templates to use for body of the webhook request") – `#/properties/capability/audit-log-events-hook/templates#/properties/capabilities/properties/auditLogEventsHook/properties/templates` - -### Arrays - -- [Actions](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy-policy-properties-actions.md "A list of action specifiers defining the actions to which the statement applies") – `#/properties/capability/audit-log-events-hook/policy/actions#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy/items/properties/actions` -- [Categories](./manifest-properties-categories.md "Categories that describe your integration") – `#/properties/categories#/properties/categories` -- [Default Policy](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy.md "LaunchDarkly policy that allows you to filter events sent to your webhook") – `#/properties/capability/audit-log-events-hook/default-policy#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy` -- [Form variables](./manifest-properties-form-variables.md "Form variables will be rendered on the integration configuration page") – `#/properties/formVariables#/properties/formVariables` -- [HTTP headers](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-endpoint-properties-http-headers.md "Headers to send with the webhook request") – `#/properties/capability/audit-log-events-hook/headers#/properties/capabilities/properties/auditLogEventsHook/properties/endpoint/properties/headers` -- [JSON Web Token](./jwt-json-web-token.md) – `undefined#/contentSchema` -- [JSON Web Token](./jwt-1-json-web-token.md) – `undefined#/contentSchema` -- [Not actions](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy-policy-properties-not-actions.md "A list of action specifiers defining the actions to which the statement does not apply") – `#/properties/capability/audit-log-events-hook/policy/not-actions#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy/items/properties/notActions` -- [Not resources](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy-policy-properties-not-resources.md "A list of resource specifiers defining the resources to which the statement does not apply") – `#/properties/capability/audit-log-events-hook/policy/not-resources#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy/items/properties/notResources` -- [Resources](./manifest-properties-capabilities-properties-audit-log-events-hook-properties-default-policy-policy-properties-resources.md "A list of resource specifiers defining the resources to which the statement applies") – `#/properties/capability/audit-log-events-hook/policy/resources#/properties/capabilities/properties/auditLogEventsHook/properties/defaultPolicy/items/properties/resources` -- [Untitled array in Arrays](./arrays-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` -- [Untitled array in Arrays](./arrays-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` -- [Untitled array in Arrays](./arrays-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` -- [Untitled array in Arrays](./arrays-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` -- [Untitled array in Arrays](./arrays-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` -- [Untitled array in Arrays](./arrays-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` -- [Untitled array in Arrays](./arrays-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` -- [Untitled array in Arrays](./arrays-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` -- [Untitled array in Arrays](./arrays-properties-truefalseanylist.md) – `https://example.com/schemas/arrays#/properties/truefalseanylist` -- [Untitled array in Arrays](./arrays-properties-truefalsewronglist.md) – `https://example.com/schemas/arrays#/properties/truefalsewronglist` -- [Untitled array in Arrays](./arrays-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` -- [Untitled array in Arrays](./arrays-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` -- [Untitled array in Arrays](./arrays-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` -- [Untitled array in Arrays](./arrays-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` -- [Untitled array in Arrays](./arrays-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` -- [Untitled array in Arrays](./tuple-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` -- [Untitled array in Arrays](./arrays-1-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` -- [Untitled array in Arrays](./arrays-1-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` -- [Untitled array in Arrays](./arrays-1-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` -- [Untitled array in Arrays](./arrays-1-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` -- [Untitled array in Arrays](./arrays-1-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` -- [Untitled array in Arrays](./arrays-1-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` -- [Untitled array in Arrays](./arrays-1-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` -- [Untitled array in Arrays](./arrays-1-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` -- [Untitled array in Arrays](./arrays-1-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` -- [Untitled array in Arrays](./arrays-1-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` -- [Untitled array in Arrays](./arrays-1-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` -- [Untitled array in Arrays](./arrays-1-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` -- [Untitled array in Arrays](./arrays-1-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` -- [Untitled array in Arrays](./arrays-2-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` -- [Untitled array in Arrays](./arrays-2-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` -- [Untitled array in Arrays](./arrays-2-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` -- [Untitled array in Arrays](./arrays-2-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` -- [Untitled array in Arrays](./arrays-2-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` -- [Untitled array in Arrays](./arrays-2-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` -- [Untitled array in Arrays](./arrays-2-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` -- [Untitled array in Arrays](./arrays-2-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` -- [Untitled array in Arrays](./arrays-2-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` -- [Untitled array in Arrays](./arrays-2-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` -- [Untitled array in Arrays](./arrays-2-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` -- [Untitled array in Arrays](./arrays-2-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` -- [Untitled array in Arrays](./arrays-2-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` -- [Untitled array in Arrays](./arrays-3-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` -- [Untitled array in Arrays](./arrays-3-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` -- [Untitled array in Arrays](./arrays-3-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` -- [Untitled array in Arrays](./arrays-3-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` -- [Untitled array in Arrays](./arrays-3-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` -- [Untitled array in Arrays](./arrays-3-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` -- [Untitled array in Arrays](./arrays-3-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` -- [Untitled array in Arrays](./arrays-3-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` -- [Untitled array in Arrays](./arrays-3-properties-truefalseanylist.md) – `https://example.com/schemas/arrays#/properties/truefalseanylist` -- [Untitled array in Arrays](./arrays-3-properties-truefalsewronglist.md) – `https://example.com/schemas/arrays#/properties/truefalsewronglist` -- [Untitled array in Arrays](./arrays-3-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` -- [Untitled array in Arrays](./arrays-3-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` -- [Untitled array in Arrays](./arrays-3-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` -- [Untitled array in Arrays](./arrays-3-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` -- [Untitled array in Arrays](./arrays-3-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` -- [Untitled array in Arrays](./tuple-1-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` -- [Untitled array in Arrays](./arrays-4-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` -- [Untitled array in Arrays](./arrays-4-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` -- [Untitled array in Arrays](./arrays-4-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` -- [Untitled array in Arrays](./arrays-4-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` -- [Untitled array in Arrays](./arrays-4-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` -- [Untitled array in Arrays](./arrays-4-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` -- [Untitled array in Arrays](./arrays-4-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` -- [Untitled array in Arrays](./arrays-4-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` -- [Untitled array in Arrays](./arrays-4-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` -- [Untitled array in Arrays](./arrays-4-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` -- [Untitled array in Arrays](./arrays-4-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` -- [Untitled array in Arrays](./arrays-4-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` -- [Untitled array in Arrays](./arrays-4-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` -- [Untitled array in Arrays](./arrays-5-properties-tuple.md "This is an array of two values, one positive, one negative") – `https://example.com/schemas/arrays#/properties/tuple` -- [Untitled array in Arrays](./arrays-5-properties-list.md "This is an array") – `https://example.com/schemas/arrays#/properties/list` -- [Untitled array in Arrays](./arrays-5-properties-listlist.md "This is an array of arrays") – `https://example.com/schemas/arrays#/properties/listlist` -- [Untitled array in Arrays](./arrays-5-properties-listlist-items.md) – `https://example.com/schemas/arrays#/properties/listlist/items` -- [Untitled array in Arrays](./arrays-5-properties-stringlistlist.md "This is an array of arrays of strings") – `https://example.com/schemas/arrays#/properties/stringlistlist` -- [Untitled array in Arrays](./arrays-5-properties-stringlistlist-items.md) – `https://example.com/schemas/arrays#/properties/stringlistlist/items` -- [Untitled array in Arrays](./arrays-5-properties-intlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/intlist` -- [Untitled array in Arrays](./arrays-5-properties-boollist.md "This is an array") – `https://example.com/schemas/arrays#/properties/boollist` -- [Untitled array in Arrays](./arrays-5-properties-numlist.md "This is an array") – `https://example.com/schemas/arrays#/properties/numlist` -- [Untitled array in Arrays](./arrays-5-properties-coordinatelist.md "This is an array of coordinates in three-dimensional space") – `https://example.com/schemas/arrays#/properties/coordinatelist` -- [Untitled array in Arrays](./arrays-5-properties-coordinatelist-items.md "A coordinate, specified by x, y, and z values") – `https://example.com/schemas/arrays#/properties/coordinatelist/items` -- [Untitled array in Arrays](./arrays-5-properties-objectlist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/objectlist` -- [Untitled array in Arrays](./arrays-5-properties-jointypelist.md "An array of simple objects") – `https://example.com/schemas/arrays#/properties/JoinTypelist` -- [Untitled array in Meta](./meta-definitions-meta-properties-types.md "The inferred class names for the section") – `https://ns.adobe.com/helix/pipeline/meta#/definitions/meta/properties/types` -- [Untitled array in Meta](./meta-1-definitions-meta-properties-types.md "The inferred class names for the section") – `https://ns.adobe.com/helix/pipeline/meta#/definitions/meta/properties/types` -- [Untitled array in undefined](./merged-oneof-1.md) – `undefined#/oneOf/1` -- [Untitled array in undefined](./one-properties-children.md) – `http://example.com/schemas/one#/properties/children` -- [Untitled array in undefined](./three-1-properties-children.md) – `http://example.com/schemas/three#/properties/children` -- [Untitled array in undefined](./two-1-properties-children.md) – `http://example.com/schemas/two#/properties/children` -- [Untitled array in undefined](./three-properties-children.md) – `http://example.com/schemas/three#/properties/children` -- [Untitled array in undefined](./two-properties-children.md) – `http://example.com/schemas/two#/properties/children` -- [Untitled array in undefined](./merged-1-oneof-1.md) – `undefined#/oneOf/1` -- [Untitled array in undefined](./one-1-properties-children.md) – `http://example.com/schemas/one#/properties/children` -- [Untitled array in undefined](./three-1-properties-children.md) – `http://example.com/schemas/three#/properties/children` -- [Untitled array in undefined](./two-1-properties-children.md) – `http://example.com/schemas/two#/properties/children` +# LaunchDarkly integrations + +[![CircleCI](https://circleci.com/gh/launchdarkly/ld-integrations.svg?style=svg&circle-token=c12dfaa51d070b8bbc8dea0c0adf4c402b5b9123)](https://circleci.com/gh/launchdarkly/ld-integrations) + +Feature flags not only provide you control over your deployment and rollout but +also provides context to other related systems -- giving your team visibility +into how your services react due to changes to flags. This repository contains +LaunchDarkly integrations built by our community. Most of these integrations +consume events from LaunchDarkly to provide their users with more context. + +## Getting started + +There are several steps to creating an integration with LaunchDarkly. + +### Step 0: Replicate your desired behavior with `curl` + +Prior to connecting LaunchDarkly with a third-party service, you should replicate your integration's desired behavior in an isolated environment (standalone from LaunchDarkly). The easiest way to do this is by using [`curl`](https://curl.haxx.se/docs/manpage.html). A lot of API documentation has `curl` example commands provided for developers to use. Find the API documentation for your third-party service and execute sample commands against it. Take note of the request semantics. This will help streamline your manifest and template definitions. + +### Step 1: Fork this Repository + +You will need to fork this repository to your own GitHub account. When you've +completed your integration, you can [submit a pull request to +LaunchDarkly](#step-7-submitting-your-integration) for it to get approved and +deployed. + +### Step 2: Create a new directory inside `./integrations` + +Create a new directory inside the [integrations](./integrations) directory named +after your organization or integration's name (e.g., `example-dot-com`). Make +sure the directory has no spaces and uses +[kebab-casing](https://wiki.c2.com/?KebabCase). + +You should only change files and directories inside your new directory. Our +validation process will reject any pull requests that attempt to modify content +outside of your directory. + +### Step 3: Create your integration manifest + +Create an empty +[`manifest.json`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#launchdarkly-integrations-manifest-properties) +file inside your new directory. The `manifest.json` file will describe your +integration's information and capabilities. + +The properties of LaunchDarkly's integration manifest are defined through a +[JSON schema](./manifest.schema.json) and has a [corresponding schema +documentation](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md). +Many IDEs can provide you inline help and validation while editing your +manifest. To enable this you can register the [JSON +schema](./manifest.schema.json) in your IDE. If you use +[VSCode](https://code.visualstudio.com/), VSCode will detect the settings in +this repository and apply the schema validation without any additional +configuration. + +![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) + +### Step 4: Describe your integration's basic information inside the manifest + +The first part of the manifest describes your organization, contacts, URLs, and +a few things we need to list your integration properly: + +``` +{ + "name": "Sample Integration", + "version": "1.0.0", + "overview": "Short one-liner describing your integration", + "description": "Send flag data to space. Markdown based description.", + "author": "Example Dot Com", + "supportEmail": "support@example.com", + "links": { + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + ... +} +``` + +The example above describes the basic information about your integration. We +will use most of the information above when rendering your integration +configuration form inside the LaunchDarkly UI. + +There are a few properties in the manifest that can accept simple +[markdown](https://daringfireball.net/projects/markdown/). One of them is the +[`description`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#description). +This markdown format will get converted to HTML in LaunchDarkly's UI. Only use +simple markdown structures like links and basic text formatting. + +Notice that the +[`icons`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#icons) +described above are in SVG format. This is intentional. Your organization's (or +integration's) logo will be used in the LaunchDarkly UI but also inside a public +facing integrations listing on +[launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG +files allow your logo to scale nicely on different devices. We do not accept +other image formats. + +Also, notice that the `icon.square` and `icon.horizontal` properties point to a +relative path. This path is relative to your integration's directory. You are +free to create any directories and files that support your integration. + +You can also create a `README.md` inside your integration's directory that +provides additional information about your integration. If provided, we may use +your `README.md` as documentation to your integration. + +### Step 5: Collecting integration configuration data from LaunchDarkly users + +Most integrations will need to collect one or more pieces of configuration data +that supports the integration. Some examples include: + +- API token +- Webhook endpoint +- URLs + +To support these configurations, you can describe a set of +[`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) +that define these configuration properties. Here's an example: + +``` +{ + ... + "formVariables": [ + { + "key": "endpointUrl", + "name": "Webhook endpoint URL", + "description": "Enter the URL to the webhook endpoint", + "default": "https://example.com/inbound_webhook", + "type": "url", + "isSecret": false + }, + { + "key": "apiToken", + "name": "API Key", + "description": "Enter your [API key](https://example.com/api) here", + "type": "string", + "isSecret": true + } + ], + ... +} +``` + +The +[`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) +entry above will yield the following UI inside of the [LaunchDarkly Integration +page](https://app.launchdarkly.com/default/integrations): + +![Example configuration +form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) + +The `formVariables[].description` will be used as a field label on the UI. You +can use simple markdown to link a word or phrase to an external URL. + +### Step 6: Define your integration's capabilities + +The third part of defining your LaunchDarkly integration is describing its +[capabilities](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#capabilities). + +As of today, we support only one capability, [Audit Log Event +Hook](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook). +An Audit Log Event Hook is a webhook that's sent by LaunchDarkly whenever an +event happens inside of LaunchDarkly. This capability can be used to trigger an +event in another service. + +Here's an example of an Audit Log Event Hook capability that subscribes to flag +events in a LaunchDarkly account: + +``` +{ + ... + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, + "templates": { + "flag": "templates/flag.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } + ... +} +``` + +The +[`auditLogEventsHook`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook) +has three properties: + +1. [`endpoint`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#endpoint): + Describes the HTTP handler that will receive the webhook. In the example + above, you'll notice that a few of the properties (`endpoint.url` and + `endpoint.headers[].value`) will accept template variables. These template + variables can reference any `formVariables` you've defined in your manifest. + The templating language we use is based off of + [Handlebars](https://handlebarsjs.com/) syntax. +2. [`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates): + A map of template paths relative to your integration's directory. These + templates can be any file type. +3. [`defaultPolicy`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#defaultpolicy): + An array of [LaunchDarkly + policies](https://docs.launchdarkly.com/docs/policies-in-custom-roles) that + act as a filter for which events to send to your webhook endpoint. These + policies can be overriden by users subscribing to your integration. We recommend the following default policy which specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects: + +```json + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] +``` + +#### Endpoint template variables + +There are a few properties that allow template variables to be substituted at +runtime. The main ones are the `endpoint.url` and the +`endpoint.headers[].value`. This will allow you to configure a dynamic endpoint +based on the `formVariables` your integration collects from the user. Here are +some examples: + +``` +This first example will utilize the `endpointUrl` formVariable as the URL of the endpoint and use the `apiToken` as a `Bearer` token in the `Authorization` header. +... + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, +... + +This next example uses the `apiToken` formVariable as a query parameter on the URL. +... + "endpoint": { + "url": "https://example.com/apiToken?={{apiToken}}", + "method": "POST" + }, +... + +``` + +#### Template files + +Before the `auditLogEventsHook` capability sends the request to the endpoint +handling your webhook, you have the option to transform the body of the request +sent to your handler. If you don't provide one or more templates, LaunchDarkly +will send you a default JSON payload that looks like this: + +``` +{ + "_links": { + "canonical": { + "href": "/api/v2/flags/always-snippet/example-test", + "type": "application/json" + }, + "parent": { + "href": "/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", + "type": "application/json" + }, + "site": { + "href": "/always-snippet/production/features/example-test", + "type": "text/html" + } + }, + "_id": "5defebd006121dd9f7ea90d0", + "_accountId": "", + "timestamp": { + "milliseconds": 1576004560130, + "seconds": 1576004560, + }, + "kind": "flag", + "name": "Example test", + "description": "", + "shortDescription": "", + "comment": "This is just a test", + "member": { + "_links": { + "parent": { + "href": "/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@example.com", + "firstName": "Henry", + "lastName": "Barrow" + }, + "titleVerb": "", + "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", + "title": "Henrietta Powell turned on the flag Example test in 'Production'", + "target": { + "_links": null, + "name": "" + } +} +``` + +However, if you choose to provide one or more +[`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates), +LaunchDarkly will render your template using the context data above. Your +template can be any text based format, but make sure you specify the appropriate +`Content-Type` header in your `endpoint.headers` property to match the content +type of your template body. + +We use basic [Handlerbars](https://handlebarsjs.com/) template syntax to render +your template. Check out [Handlebars' Language +Guide](https://handlebarsjs.com/guide/) for more information on its syntax. In +addition to the basic language syntax, we support the following [built-in +helpers](https://github.com/aymerick/raymond#built-in-helpers): `if`, `unless`, +`each`, `with`, `lookup`, and `equal`. + +To test your templates, you can use the [Handlebars +Sandbox](http://tryhandlebarsjs.com/). + +### Step 7: Validating your integration + +Run `npm install` to install the validation dependencies. Run `npm test` to run the validation suite. In addition, we +recommend install pre-commit hooks with `pre-commit install` to have the validation suite run before every commit. + +Run `npm run preview YOUR_INTEGRATION_DIR_NAME` to preview your integration's templates with sample data. + +### Step 8: Submitting your integration + +Once you're done with your integration, [submit a pull request against this +repo](https://github.com/launchdarkly/ld-integrations/pull/new/master). Your +branch will run through some automated validations and will be reviewed by +someone on our team. Once everything checks out, we'll publish your integration +when you give us the green light. + +## Comments, suggestions, bug reports? + +Visit us in our Slack channel +[#ext-integrations](https://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQhttps://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQ) +or log an issue or request +[here](https://github.com/launchdarkly/ld-integrations/issues). From 1eb6036fd2942c9e46a5efbd8c282378f7fd2e42 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 28 Jan 2020 12:04:03 -0800 Subject: [PATCH 175/936] Fix npm build steps on Circle CI (#24) * Switch back to yarn * Disable yarn in ci * Remove yarn.lock Co-authored-by: Rich Manalang --- .circleci/config.yml | 13 +-- MANIFEST.md | 2 +- package-lock.json | 201 ++++++++++++++++++++++++++++--------------- 3 files changed, 137 insertions(+), 79 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4ce35a4b..8806bbf4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,21 +9,12 @@ jobs: - image: circleci/node:latest steps: - checkout - - restore_cache: - name: Restore Yarn Package Cache - keys: - - yarn-packages-{{ checksum "yarn.lock" }} - run: name: Install Dependencies - command: yarn install --frozen-lockfile - - save_cache: - name: Save Yarn Package Cache - key: yarn-packages-{{ checksum "yarn.lock" }} - paths: - - ~/.cache/yarn + command: npm ci - run: name: Run tests - command: yarn test + command: npm test deploy-to-s3: machine: enabled: true diff --git a/MANIFEST.md b/MANIFEST.md index 5275f97a..864d0cb5 100644 --- a/MANIFEST.md +++ b/MANIFEST.md @@ -562,7 +562,7 @@ Default value for variable. Can be overridden by user in the UI ##### defaultValue Type -- type: `boolean,string`. +Unknown type `boolean,string`. ```json { diff --git a/package-lock.json b/package-lock.json index c1a69453..e3e4fedd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2246,25 +2246,29 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "optional": true }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, "requires": { @@ -2274,13 +2278,15 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "optional": true, "requires": { @@ -2290,37 +2296,43 @@ }, "chownr": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", "dev": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true, "optional": true }, "debug": { "version": "3.2.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "optional": true, "requires": { @@ -2329,25 +2341,29 @@ }, "deep-extend": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "optional": true, "requires": { @@ -2356,13 +2372,15 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "optional": true, "requires": { @@ -2378,7 +2396,8 @@ }, "glob": { "version": "7.1.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "optional": true, "requires": { @@ -2392,13 +2411,15 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "bundled": true, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, "requires": { @@ -2407,7 +2428,8 @@ }, "ignore-walk": { "version": "3.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "optional": true, "requires": { @@ -2416,7 +2438,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "optional": true, "requires": { @@ -2426,19 +2449,22 @@ }, "inherits": { "version": "2.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "optional": true }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "optional": true, "requires": { @@ -2447,13 +2473,15 @@ }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "optional": true, "requires": { @@ -2462,13 +2490,15 @@ }, "minimist": { "version": "0.0.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true, "optional": true }, "minipass": { "version": "2.9.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, "requires": { @@ -2478,7 +2508,8 @@ }, "minizlib": { "version": "1.3.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "optional": true, "requires": { @@ -2487,7 +2518,8 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "optional": true, "requires": { @@ -2496,13 +2528,15 @@ }, "ms": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "optional": true }, "needle": { "version": "2.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", "dev": true, "optional": true, "requires": { @@ -2513,7 +2547,8 @@ }, "node-pre-gyp": { "version": "0.14.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "dev": true, "optional": true, "requires": { @@ -2531,7 +2566,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "optional": true, "requires": { @@ -2541,7 +2577,8 @@ }, "npm-bundled": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "optional": true, "requires": { @@ -2550,13 +2587,15 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true, "optional": true }, "npm-packlist": { "version": "1.4.7", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", + "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", "dev": true, "optional": true, "requires": { @@ -2566,7 +2605,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "optional": true, "requires": { @@ -2578,19 +2618,22 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "optional": true, "requires": { @@ -2599,19 +2642,22 @@ }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true, "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "optional": true, "requires": { @@ -2621,19 +2667,22 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "bundled": true, + "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, "optional": true }, "rc": { "version": "1.2.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, "requires": { @@ -2645,7 +2694,8 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true, "optional": true } @@ -2653,7 +2703,8 @@ }, "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "optional": true, "requires": { @@ -2668,7 +2719,8 @@ }, "rimraf": { "version": "2.7.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "optional": true, "requires": { @@ -2677,43 +2729,50 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true, "optional": true }, "semver": { "version": "5.7.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true, "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "optional": true, "requires": { @@ -2724,7 +2783,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "optional": true, "requires": { @@ -2733,7 +2793,8 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "optional": true, "requires": { @@ -2742,13 +2803,15 @@ }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true, "optional": true }, "tar": { "version": "4.4.13", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, "requires": { @@ -2763,13 +2826,15 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, "optional": true }, "wide-align": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, "requires": { @@ -2778,13 +2843,15 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true, "optional": true }, "yallist": { "version": "3.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true } From 08e0c74193f6a6d44b39f3bc733f97a6c5a551b1 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 28 Jan 2020 16:09:30 -0800 Subject: [PATCH 176/936] Stop using depricated fields (#25) --- integrations/appdynamics/templates/template.json | 2 +- integrations/appoptics/templates/flag.json | 2 +- integrations/dynatrace/templates/template.json | 2 +- integrations/grafana/templates/template.json | 2 +- integrations/honeycomb/templates/flag.json | 4 ++-- integrations/logdna/templates/template.json | 4 ++-- integrations/msteams/templates/template.json | 4 ++-- integrations/new-relic/templates/flag.json | 2 +- integrations/sample-integration/templates/template.json | 2 +- integrations/sentry/templates/template.json | 6 +++--- integrations/signalfx/templates/template.json.hbs | 2 +- integrations/splunk/templates/template.json | 2 +- integrations/splunk/templates/template.txt | 1 - sample-context/flag-update.client-side-sdk.json | 3 --- sample-context/flag-update.toggle.json | 3 --- 15 files changed, 17 insertions(+), 24 deletions(-) delete mode 100644 integrations/splunk/templates/template.txt diff --git a/integrations/appdynamics/templates/template.json b/integrations/appdynamics/templates/template.json index 651e2b71..8b901d9e 100644 --- a/integrations/appdynamics/templates/template.json +++ b/integrations/appdynamics/templates/template.json @@ -1,7 +1,7 @@ [ { "application_id": "LaunchDarkly", - "summary": "{{title}}", + "summary": "{{titleObj.plainText}}", "comment": "{{#if comment}}{{comment}}{{/if}}", "eventtype": "APPLICATION_DEPLOYMENT", "severity": "INFO" diff --git a/integrations/appoptics/templates/flag.json b/integrations/appoptics/templates/flag.json index b056fdb1..847ad904 100644 --- a/integrations/appoptics/templates/flag.json +++ b/integrations/appoptics/templates/flag.json @@ -1,5 +1,5 @@ { - "title": "{{{title}}}", + "title": "{{{titleObj.plainText}}}", "source": "LaunchDarkly", "links": [ { diff --git a/integrations/dynatrace/templates/template.json b/integrations/dynatrace/templates/template.json index fdbbc6ae..2299dff1 100644 --- a/integrations/dynatrace/templates/template.json +++ b/integrations/dynatrace/templates/template.json @@ -15,5 +15,5 @@ }, "source": "LaunchDarkly", "annotationType": "Feature flag", - "annotationDescription": "{{{title}}}" + "annotationDescription": "{{{titleObj.plainText}}}" } diff --git a/integrations/grafana/templates/template.json b/integrations/grafana/templates/template.json index 8ee04195..60b5160f 100644 --- a/integrations/grafana/templates/template.json +++ b/integrations/grafana/templates/template.json @@ -1,5 +1,5 @@ { "time":{{ timestamp.milliseconds }}, "tags":["launchdarkly","{{ kind }}","{{ name }}"], - "text":"{{ title }}" + "text":"{{ titleObj.plainText }}" } diff --git a/integrations/honeycomb/templates/flag.json b/integrations/honeycomb/templates/flag.json index 1433f02d..63e227c3 100644 --- a/integrations/honeycomb/templates/flag.json +++ b/integrations/honeycomb/templates/flag.json @@ -1,5 +1,5 @@ { - "message": "{{{title}}}", + "message": "{{{titleObj.plainText}}}", "type": "LaunchDarkly", "url": "https://ld-stg.launchdarkly.com{{_links.site.href}}" -} \ No newline at end of file +} diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json index 1bcf5031..4aff3a36 100644 --- a/integrations/logdna/templates/template.json +++ b/integrations/logdna/templates/template.json @@ -1,10 +1,10 @@ { "lines": [ { - "line": "{{{title}}}{{#if comment}}, Comment: {{comment}}{{/if}}", + "line": "{{{titleObj.plainText}}}{{#if comment}}, Comment: {{comment}}{{/if}}", "app": "{{formVariables.app}}", "level": "INFO", "env": "{{project.environment.key}}" } ] -} \ No newline at end of file +} diff --git a/integrations/msteams/templates/template.json b/integrations/msteams/templates/template.json index 7b414454..a1bbd673 100644 --- a/integrations/msteams/templates/template.json +++ b/integrations/msteams/templates/template.json @@ -2,10 +2,10 @@ "@type": "MessageCard", "@context": "http://schema.org/extensions", "themeColor": "0076D7", - "summary": "{{title}}", + "summary": "{{titleObj.plainText}}", "sections": [ { - "activityTitle": "{{markdownTitle}}", + "activityTitle": "{{titleObj.markdown}}", "text": "{{#if comment}}> {{comment}}\n{{/if}}{{#if description}}{{description}}{{/if}}", "markdown": true } diff --git a/integrations/new-relic/templates/flag.json b/integrations/new-relic/templates/flag.json index f426b60a..f6d295ab 100644 --- a/integrations/new-relic/templates/flag.json +++ b/integrations/new-relic/templates/flag.json @@ -1,5 +1,5 @@ { - "message": "{{{title}}}", + "message": "{{{titleObj.plainText}}}", "eventType": "LaunchDarkly", "url": "https://app.launchdarkly.com{{_links.site.href}}", "timestamp": "{{timestamp.milliseconds}}", diff --git a/integrations/sample-integration/templates/template.json b/integrations/sample-integration/templates/template.json index b0dfd303..525e3c64 100644 --- a/integrations/sample-integration/templates/template.json +++ b/integrations/sample-integration/templates/template.json @@ -1,5 +1,5 @@ { - "title": "{{title}}", + "title": "{{titleObj.markdown}}", "text": "{{details.plainText}}", "date_happened": "{{timestamp.seconds}}", "tags": ["any", "arbitrary", "tag"], diff --git a/integrations/sentry/templates/template.json b/integrations/sentry/templates/template.json index bce09ffa..5dcd9539 100644 --- a/integrations/sentry/templates/template.json +++ b/integrations/sentry/templates/template.json @@ -4,13 +4,13 @@ "logger": "launchdarkly.integration", "platform": "other", "level": "info", - "transaction": "{{ title }}", + "transaction": "{{ titleObj.plainText }}", "server_name": "app.launchdarkly.com", "fingerprint": [ "{{ _links.site.href }}", "{{ kind }}", "{{ name }}", - "{{ title }}" + "{{ titleObj.plainText }}" ], "tags": { @@ -20,7 +20,7 @@ }, "message": { - "formatted": "{{ title }}\n{{ description }}{{#if comment}}\n\n{{ comment }}{{/if}}" + "formatted": "{{ titleObj.markdown }}\n{{ details.markdown }}{{#if comment}}\n\n{{ comment }}{{/if}}" }, "user": { "id": "launchdarkly/member/{{ member._id }}", diff --git a/integrations/signalfx/templates/template.json.hbs b/integrations/signalfx/templates/template.json.hbs index b8b17011..3720cd13 100644 --- a/integrations/signalfx/templates/template.json.hbs +++ b/integrations/signalfx/templates/template.json.hbs @@ -5,7 +5,7 @@ "project": "{{project.key}}", "flag": "{{name}}", "kind": "{{kind}}", - "event": "{{{title}}}", + "event": "{{{titleObj.plainText}}}", "comment": "{{#if comment}}{{comment}}{{/if}}" }, "eventType": "LaunchDarkly {{kind}} change", diff --git a/integrations/splunk/templates/template.json b/integrations/splunk/templates/template.json index 5ad62a42..9bc6e5d2 100644 --- a/integrations/splunk/templates/template.json +++ b/integrations/splunk/templates/template.json @@ -7,7 +7,7 @@ "member_email": "{{member.email}}", "member_name": "{{member.firstName}} {{member.lastName}}", "verb": "{{titleVerb}}", - "message": "{{title}}", + "message": "{{titleObj.plainText}}", "comment": "{{#if comment}}{{{comment}}}{{/if}}" } } diff --git a/integrations/splunk/templates/template.txt b/integrations/splunk/templates/template.txt deleted file mode 100644 index 97308a19..00000000 --- a/integrations/splunk/templates/template.txt +++ /dev/null @@ -1 +0,0 @@ -{"sourcetype":"launchdarkly","time":"{{date}}","event":"kind={{kind}}&name={{name}}&member_email={{member.email}}&verb={{titleVerb}}&message={{title}}&comment={{{comment}}}"} diff --git a/sample-context/flag-update.client-side-sdk.json b/sample-context/flag-update.client-side-sdk.json index 55e5df38..eb045529 100644 --- a/sample-context/flag-update.client-side-sdk.json +++ b/sample-context/flag-update.client-side-sdk.json @@ -30,7 +30,6 @@ "plainText": "Changed the flag to be available to client-side SDKs", "markdown": "* Changed the flag to be available to client\\-side SDKs\n" }, - "description": "* Changed the flag to be available to client\\-side SDKs\n", "project": { "name": "Default Project", "key": "default", @@ -60,8 +59,6 @@ "lastName": "Powell" }, "titleVerb": "updated the flag", - "markdownTitle": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [Demo flag](http://localhost/default/~/features/demo-flag)", - "title": "Henrietta Powell updated the flag Demo flag", "titleObj": { "plainText": "Henrietta Powell updated the flag Demo flag", "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [Demo flag](http://localhost/default/~/features/demo-flag)" diff --git a/sample-context/flag-update.toggle.json b/sample-context/flag-update.toggle.json index 87fddb6e..aa99c0da 100644 --- a/sample-context/flag-update.toggle.json +++ b/sample-context/flag-update.toggle.json @@ -30,7 +30,6 @@ "plainText": "added testing@example.com to the variation true", "markdown": "- added [testing@example.com](mailto:testing@example.com) to the variation *true*" }, - "description": "", "comment": "This is just a test", "member": { "_links": { @@ -61,8 +60,6 @@ "key": "test-key", "tags": ["flag_tag", "flag_tag2"], "titleVerb": "", - "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in 'Production'", - "title": "Henrietta Powell turned on the flag Example test in 'Production'", "titleObj": { "plainText": "Henrietta Powell turned on the flag Example test in 'Production'", "markdown": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in 'Production'" From 6feecf37ec67d6a73bd31da9d5fe9fe6faab349f Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 29 Jan 2020 16:02:39 -0800 Subject: [PATCH 177/936] modify dynatrace template (#23) --- integrations/dynatrace/manifest.json | 8 +++--- integrations/dynatrace/templates/flag.json | 28 +++++++++++++++++++ .../dynatrace/templates/template.json | 19 ------------- 3 files changed, 32 insertions(+), 23 deletions(-) create mode 100644 integrations/dynatrace/templates/flag.json delete mode 100644 integrations/dynatrace/templates/template.json diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 0f7a5bdb..9be85e58 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -17,16 +17,16 @@ "formVariables": [ { "key": "apiToken", - "name": "ApiToken", + "name": "Dynatrace API Token", "type": "string", - "description": "Your Dynatrace API token. The 'access problem and event feed, metrics, and topology' scope is required", + "description": "Enter your Dynatrace API token. [Learn more](https://www.dynatrace.com/support/help/shortlink/api-authentication#generate-a-token) about generating tokens. The 'access problem and event feed, metrics, and topology' scope is required.", "isSecret": true }, { "key": "url", "name": "Dynatrace URL", "type": "uri", - "description": "Your Dynatrace URL (Managed or SaaS)", + "description": "Enter the URL used to access your Dynatrace (managed or hosted) service. Follow the pattern shown in the placeholder text.", "placeholder": "https://{your-environment-id}.live.dynatrace.com", "isSecret": false } @@ -48,7 +48,7 @@ ] }, "templates": { - "flag": "templates/template.json" + "flag": "templates/flag.json" }, "defaultPolicy": [ { diff --git a/integrations/dynatrace/templates/flag.json b/integrations/dynatrace/templates/flag.json new file mode 100644 index 00000000..6c4dff21 --- /dev/null +++ b/integrations/dynatrace/templates/flag.json @@ -0,0 +1,28 @@ +{ + "eventType": "CUSTOM_CONFIGURATION", + "attachRules": { + "tagRule": [ + { + "meTypes": ["APPLICATION"], + "tags": [ + { + "context": "CONTEXTLESS", + "key": "LaunchDarkly" + } + ] + } + ] + }, + "configuration": "Feature flag \"{{name}}\"", + "customProperties": { + "Flag name": "{{name}}", + "Flag key": "{{key}}", + "Project name": "{{project.name}}", + "Project key": "{{project.key}}", + "Environment name": "{{project.environment.name}}", + "Environment key": "{{project.environment.key}}" + }, + "start": {{ timestamp.milliseconds }}, + "source": "LaunchDarkly", + "description": "{{{titleObj.plainText}}}" +} diff --git a/integrations/dynatrace/templates/template.json b/integrations/dynatrace/templates/template.json deleted file mode 100644 index 2299dff1..00000000 --- a/integrations/dynatrace/templates/template.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "eventType": "CUSTOM_ANNOTATION", - "attachRules": { - "tagRule": [ - { - "meTypes": ["APPLICATION"], - "tags": [ - { - "context": "CONTEXTLESS", - "key": "LaunchDarkly" - } - ] - } - ] - }, - "source": "LaunchDarkly", - "annotationType": "Feature flag", - "annotationDescription": "{{{titleObj.plainText}}}" -} From d530cfe905f084111aa87ea7017cc40096292781 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 31 Jan 2020 09:08:37 -0800 Subject: [PATCH 178/936] Update sample context (#26) --- integrations/msteams/templates/template.json | 6 +- .../flag-update.client-side-sdk.json | 126 +++++++++------- sample-context/flag-update.toggle.json | 139 ++++++++++-------- 3 files changed, 147 insertions(+), 124 deletions(-) diff --git a/integrations/msteams/templates/template.json b/integrations/msteams/templates/template.json index a1bbd673..95a14c54 100644 --- a/integrations/msteams/templates/template.json +++ b/integrations/msteams/templates/template.json @@ -5,9 +5,9 @@ "summary": "{{titleObj.plainText}}", "sections": [ { - "activityTitle": "{{titleObj.markdown}}", - "text": "{{#if comment}}> {{comment}}\n{{/if}}{{#if description}}{{description}}{{/if}}", - "markdown": true + "activityTitle": "{{{titleObj.html}}}", + "text": "{{#if details}}{{{details.html}}}{{/if}}{{#if comment}}\nComment: {{{comment}}}\n{{/if}}", + "xml": true } ] } diff --git a/sample-context/flag-update.client-side-sdk.json b/sample-context/flag-update.client-side-sdk.json index eb045529..4b2ef03f 100644 --- a/sample-context/flag-update.client-side-sdk.json +++ b/sample-context/flag-update.client-side-sdk.json @@ -1,70 +1,82 @@ { + "_links": { + "canonical": { + "href": "/api/v2/flags/default/a-new-flag", + "type": "application/json" + }, + "parent": { + "href": "/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "/api/v2/auditlog/5e33891d06121d53a82ad9f7", + "type": "application/json" + }, + "site": { + "href": "/default/~/features/a-new-flag", + "type": "text/html" + } + }, + "_id": "5e33891d06121d53a82ad9f7", + "_accountId": "569f514156e003339cfd3917", + "date": 0, + "timestamp": { + "milliseconds": 1580435741366, + "seconds": 1580435741 + }, + "kind": "flag", + "name": "A new flag", + "details": { + "plainText": "Changed the flag to be available to client-side SDKs", + "markdown": "* Changed the flag to be available to client\\-side SDKs\n", + "html": "
  • Changed the flag to be available to client-side SDKs
" + }, + "comment": "Making it available to the front end.", + "project": { + "name": "The big project", + "key": "default", + "tags": [], + "environment": { + "name": "Test", + "key": "test", + "tags": [] + } + }, + "key": "a-new-flag", + "tags": [], + "member": { "_links": { - "canonical": { - "href": "/api/v2/flags/default/demo-flag", - "type": "application/json" - }, "parent": { - "href": "/api/v2/auditlog", + "href": "/api/v2/members", "type": "application/json" }, "self": { - "href": "/api/v2/auditlog/5e28dbea06121d71dd129e79", + "href": "/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "updated the flag", + "titleObj": { + "plainText": "Henrietta Powell updated the flag A new flag", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [A new flag](http://localhost/default/~/features/a-new-flag)", + "html": "Henrietta Powell updated the flag A new flag" + }, + "target": { + "_links": { + "canonical": { + "href": "/api/v2/flags/default/a-new-flag", "type": "application/json" }, "site": { - "href": "/default/~/features/demo-flag", + "href": "/default/~/features/a-new-flag", "type": "text/html" } }, - "_id": "5e28dbea06121d71dd129e79", - "_accountId": "", - "date": 0, - "timestamp": { - "milliseconds": 1579736042409, - "seconds": 1579736042 - }, - "kind": "flag", - "name": "Demo flag", - "details": { - "plainText": "Changed the flag to be available to client-side SDKs", - "markdown": "* Changed the flag to be available to client\\-side SDKs\n" - }, - "project": { - "name": "Default Project", - "key": "default", - "tags": [], - "environment": { - "name": "Test", - "key": "test", - "tags": [] - } - }, - "key": "demo-flag", - "tags": [], - "member": { - "_links": { - "parent": { - "href": "/api/v2/members", - "type": "application/json" - }, - "self": { - "href": "/api/v2/members/569f514183f2164430000002", - "type": "application/json" - } - }, - "_id": "569f514183f2164430000002", - "email": "testing@launchdarkly.com", - "firstName": "Henrietta", - "lastName": "Powell" - }, - "titleVerb": "updated the flag", - "titleObj": { - "plainText": "Henrietta Powell updated the flag Demo flag", - "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [Demo flag](http://localhost/default/~/features/demo-flag)" - }, - "target": { - "_links": null, - "name": "" - } + "name": "A new flag" } +} diff --git a/sample-context/flag-update.toggle.json b/sample-context/flag-update.toggle.json index aa99c0da..37de36e2 100644 --- a/sample-context/flag-update.toggle.json +++ b/sample-context/flag-update.toggle.json @@ -1,71 +1,82 @@ { - "_links": { - "canonical": { - "href": "/api/v2/flags/always-snippet/example-test", - "type": "application/json" - }, - "parent": { - "href": "/api/v2/auditlog", - "type": "application/json" - }, - "self": { - "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", - "type": "application/json" - }, - "site": { - "href": "/always-snippet/production/features/example-test", - "type": "text/html" - } - }, - "_id": "5defebd006121dd9f7ea90d0", - "_accountId": "xyz123", - "date": 1576004560130, - "timestamp": { - "milliseconds": 1576004560130, - "seconds": 1576004560 + "_links": { + "canonical": { + "href": "/api/v2/flags/default/demo-flag", + "type": "application/json" }, - "kind": "flag", - "name": "Example test", - "details": { - "plainText": "added testing@example.com to the variation true", - "markdown": "- added [testing@example.com](mailto:testing@example.com) to the variation *true*" + "parent": { + "href": "/api/v2/auditlog", + "type": "application/json" }, - "comment": "This is just a test", - "member": { - "_links": { - "parent": { - "href": "/api/v2/members", - "type": "application/json" - }, - "self": { - "href": "/api/v2/members/569f514183f2164430000002", - "type": "application/json" - } - }, - "_id": "569f514183f2164430000002", - "email": "testing@example.com", - "firstName": "Henrietta", - "lastName": "Powell" + "self": { + "href": "/api/v2/auditlog/5e33896006121d53a82ad9fb", + "type": "application/json" }, - "project": { - "name": "test project", - "key": "test-project", - "tags": ["project_tag"], - "environment": { - "name": "test environment", - "key": "test-environment", - "tags": ["env_tag", "env_tag2"] - } + "site": { + "href": "/default/production/features/demo-flag", + "type": "text/html" + } + }, + "_id": "5e33896006121d53a82ad9fb", + "_accountId": "569f514156e003339cfd3917", + "date": 0, + "timestamp": { + "milliseconds": 1580435808417, + "seconds": 1580435808 + }, + "kind": "flag", + "name": "Demo flag", + "details": { + "plainText": "", + "markdown": "", + "html": "" + }, + "comment": "Turn it on!", + "project": { + "name": "The big project", + "key": "default", + "tags": [], + "environment": { + "name": "Production", + "key": "production", + "tags": [] + } + }, + "key": "demo-flag", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } }, - "key": "test-key", - "tags": ["flag_tag", "flag_tag2"], - "titleVerb": "", - "titleObj": { - "plainText": "Henrietta Powell turned on the flag Example test in 'Production'", - "markdown": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in 'Production'" + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "turned on the flag", + "titleObj": { + "plainText": "Henrietta Powell turned on the flag Demo flag in 'Production'", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) turned on the flag [Demo flag](http://localhost/default/production/features/demo-flag) in `Production`", + "html": "Henrietta Powell turned on the flag Demo flag in Production" + }, + "target": { + "_links": { + "canonical": { + "href": "/api/v2/flags/default/demo-flag", + "type": "application/json" + }, + "site": { + "href": "/default/production/features/demo-flag", + "type": "text/html" + } }, - "target": { - "_links": null, - "name": "" - } + "name": "Demo flag" + } } From 714a72956d680acd4a15ca9dd7df70ee82a02672 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 31 Jan 2020 09:39:41 -0800 Subject: [PATCH 179/936] Adding a form variable for a dynatrace tag (#27) --- integrations/dynatrace/manifest.json | 8 ++++++++ integrations/dynatrace/templates/flag.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 9be85e58..abd77a91 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -29,6 +29,14 @@ "description": "Enter the URL used to access your Dynatrace (managed or hosted) service. Follow the pattern shown in the placeholder text.", "placeholder": "https://{your-environment-id}.live.dynatrace.com", "isSecret": false + }, + { + "key": "tag", + "name": "Entity tag", + "type": "string", + "description": "Enter the tag associated with your Dynatrace entity. This tag will associate LaunchDarkly data with the corresponding Dynatrace entity. [Learn more](https://www.dynatrace.com/support/help/shortlink/tagging) about tagging.", + "placeholder": "LaunchDarkly", + "isSecret": false } ], "capabilities": { diff --git a/integrations/dynatrace/templates/flag.json b/integrations/dynatrace/templates/flag.json index 6c4dff21..5cf35878 100644 --- a/integrations/dynatrace/templates/flag.json +++ b/integrations/dynatrace/templates/flag.json @@ -7,7 +7,7 @@ "tags": [ { "context": "CONTEXTLESS", - "key": "LaunchDarkly" + "key": "{{formVariables.tag}}" } ] } From 224caf4cb6f912d288c412d161e12d353dad54ef Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 31 Jan 2020 13:09:14 -0800 Subject: [PATCH 180/936] Update sample context and prometheous (#29) --- integrations/prometheus-pushgateway/templates/template | 2 +- sample-context/flag-update.client-side-sdk.json | 1 - sample-context/flag-update.toggle.json | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/integrations/prometheus-pushgateway/templates/template b/integrations/prometheus-pushgateway/templates/template index 18bf1c31..0618145d 100644 --- a/integrations/prometheus-pushgateway/templates/template +++ b/integrations/prometheus-pushgateway/templates/template @@ -1,3 +1,3 @@ # HELP launchdarkly_object_update_ms Help string goes here # TYPE launchdarkly_object_update_ms gauge -launchdarkly_object_update_ms{kind="{{ kind }}", name="{{ name }}"} {{ date }} +launchdarkly_object_update_ms{kind="{{ kind }}", name="{{ name }}"} {{ timestamp.milliseconds }} diff --git a/sample-context/flag-update.client-side-sdk.json b/sample-context/flag-update.client-side-sdk.json index 4b2ef03f..e5d781e2 100644 --- a/sample-context/flag-update.client-side-sdk.json +++ b/sample-context/flag-update.client-side-sdk.json @@ -19,7 +19,6 @@ }, "_id": "5e33891d06121d53a82ad9f7", "_accountId": "569f514156e003339cfd3917", - "date": 0, "timestamp": { "milliseconds": 1580435741366, "seconds": 1580435741 diff --git a/sample-context/flag-update.toggle.json b/sample-context/flag-update.toggle.json index 37de36e2..f14b14d4 100644 --- a/sample-context/flag-update.toggle.json +++ b/sample-context/flag-update.toggle.json @@ -19,7 +19,6 @@ }, "_id": "5e33896006121d53a82ad9fb", "_accountId": "569f514156e003339cfd3917", - "date": 0, "timestamp": { "milliseconds": 1580435808417, "seconds": 1580435808 From 8d90f6ba70a4ce522c6464e9626b70da23b79ffd Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 31 Jan 2020 14:18:32 -0800 Subject: [PATCH 181/936] add curl generator (#30) --- README.md | 2 +- package.json | 3 ++- preview.js | 75 +++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 59 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 9a05e2d5..bc3f09b2 100644 --- a/README.md +++ b/README.md @@ -356,7 +356,7 @@ Sandbox](http://tryhandlebarsjs.com/). Run `npm install` to install the validation dependencies. Run `npm test` to run the validation suite. In addition, we recommend install pre-commit hooks with `pre-commit install` to have the validation suite run before every commit. -Run `npm run preview YOUR_INTEGRATION_DIR_NAME` to preview your integration's templates with sample data. +Run `npm run preview YOUR_INTEGRATION_DIR_NAME` to preview your integration's templates with sample data. Alternatively run `npm run curl YOUR_INTEGRATION_DIR_NAME` to produce a sample `curl` command to send data with your integration's service. ### Step 8: Submitting your integration diff --git a/package.json b/package.json index 28c6b152..d3c14020 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md && echo '' >> manifest.schema.json", "test": "jest", - "preview": "node preview.js" + "preview": "node preview.js", + "curl": "node preview.js --curl" }, "jest": { "setupFilesAfterEnv": [ diff --git a/preview.js b/preview.js index c3a20a1c..59c8e7ac 100644 --- a/preview.js +++ b/preview.js @@ -4,7 +4,8 @@ const _ = require('lodash'); const jsonEscape = require('./utils/json-escape'); -const flagUpdateContext = require('./sample-context/flag-update.client-side-sdk'); +const testFileName = 'flag-update.client-side-sdk.json'; +const flagUpdateContext = require(`./sample-context/${testFileName}`); const args = process.argv; @@ -12,15 +13,16 @@ const getFormVariableContext = formVariables => { const endpointContext = {}; if (formVariables) { formVariables.forEach(formVariable => { + const unsubstitutedKey = '$' + _.toUpper(formVariable.key); switch (formVariable.type) { case 'string': - endpointContext[formVariable.key] = formVariable.key; + endpointContext[formVariable.key] = unsubstitutedKey; break; case 'boolean': endpointContext[formVariable.key] = true; break; case 'uri': - endpointContext[formVariable.key] = `https://${formVariable.key}.com`; + endpointContext[formVariable.key] = unsubstitutedKey; break; } }); @@ -28,14 +30,25 @@ const getFormVariableContext = formVariables => { return endpointContext; }; -if (args.length <= 2) { - console.log('please provide an integration directory name'); +const curl = _.includes(args, '--curl'); +const integrationNameIndex = curl ? 3 : 2; + +if (args.length <= integrationNameIndex) { + console.log('Provide an integration directory name:'); + console.log(' npm run preview '); + console.log(' npm run curl \n'); process.exit(1); } -const integrationName = args[2]; +const integrationName = args[integrationNameIndex]; -const manifest = require(`./integrations/${integrationName}/manifest.json`); +let manifest; +try { + manifest = require(`./integrations/${integrationName}/manifest.json`); +} catch (e) { + console.log(`The "${integrationName}" integration does not exist.\n`); + process.exit(1); +} const formVariables = _.get(manifest, 'formVariables', null); const endpoint = _.get( manifest, @@ -49,14 +62,6 @@ if (endpoint) { const urlTemplate = Handlebars.compile(endpoint.url, { strict: true, }); - console.log('URL: ', urlTemplate(endpointContext)); - console.log('METHOD:', endpoint.method); - endpoint.headers.forEach(header => { - const headerTemplate = Handlebars.compile(header.value, { - strict: true, - }); - console.log(`HEADER: ${header.name}: ${headerTemplate(endpointContext)}`); - }); const flagTemplatePath = _.get( manifest, @@ -65,11 +70,43 @@ if (endpoint) { ); const path = `./integrations/${integrationName}/${flagTemplatePath}`; - const templateString = readFileSync(path, { encoding: 'utf-8' }); - const flagTemplate = Handlebars.compile(templateString, { strict: true }); + const headers = endpoint.headers.map(header => { + const headerTemplate = Handlebars.compile(header.value, { + strict: true, + }); + return { + name: header.name, + value: headerTemplate(endpointContext) + }; + }); const fullContext = jsonEscape(Object.assign({}, flagUpdateContext)); fullContext.formVariables = getFormVariableContext(formVariables); - console.log('BODY:\tflag-update.client-side-sdk.json'); - console.log(flagTemplate(fullContext)); + + const templateString = readFileSync(path, { encoding: 'utf-8' }); + const flagTemplate = Handlebars.compile(templateString, { strict: true }); + const body = flagTemplate(fullContext); + + if (curl) { + let command = `curl -X ${endpoint.method} \\\n` + ` ${urlTemplate(endpointContext)} \\\n`; + headers.forEach(header => { + command += ` -H '${header.name}: ${header.value}' \\\n`; + }); + command += ` -d '${_.trimEnd(body)}'`; + + console.log('Before running the following curl command, be sure to replace all variables denoted with $.'); + console.log(`The following command was generated with the test file ${testFileName}.\n`); + console.log(command); + } else { + console.log('URL: ', urlTemplate(endpointContext)); + console.log('METHOD:', endpoint.method); + headers.forEach(header => { + console.log(`HEADER: ${header.name}: ${header.value}`); + }); + console.log(`BODY:\t${testFileName}.json`); + console.log(body); + } +} else { + console.log(`The "${integrationName}" integration does not make any outbound requests from LaunchDarkly.\n`); + process.exit(0); } From 4aa600c81722b73c85951b7afb5a235a78e886ab Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 31 Jan 2020 15:14:29 -0800 Subject: [PATCH 182/936] Consistent readmes (#32) --- integrations/adfs/README.md | 1 - integrations/ansible/README.md | 1 - integrations/appdynamics/README.md | 8 +++++++- integrations/appoptics/README.md | 7 +++++++ integrations/azure-sso/README.md | 1 - integrations/bitbucket-flags/README.md | 6 ------ integrations/circleci-coderefs/README.md | 1 - integrations/dynatrace/README.md | 8 ++++++-- integrations/gitlab-coderefs/README.md | 1 - integrations/googleapps-sso/README.md | 1 - integrations/grafana/README.md | 7 +++++++ integrations/heap/README.md | 1 - integrations/honeycomb/README.md | 7 +++++++ integrations/jira/README.md | 1 - integrations/logdna/README.md | 8 +++++++- integrations/msteams/README.md | 7 +++++++ integrations/new-relic/README.md | 14 +++++++------- integrations/okta/README.md | 1 - integrations/onelogin/README.md | 1 - integrations/pendo/README.md | 1 - integrations/prometheus-pushgateway/README.md | 8 +++++++- integrations/sample-integration/README.md | 7 +++++++ integrations/sentry/README.md | 7 +++++++ integrations/signalfx/README.md | 8 +++++++- integrations/splunk/README.md | 7 +++++++ integrations/terraform/README.md | 1 - integrations/trello/README.md | 1 - integrations/vscode/README.md | 1 - 28 files changed, 90 insertions(+), 33 deletions(-) delete mode 100644 integrations/adfs/README.md delete mode 100644 integrations/ansible/README.md delete mode 100644 integrations/azure-sso/README.md delete mode 100644 integrations/bitbucket-flags/README.md delete mode 100644 integrations/circleci-coderefs/README.md delete mode 100644 integrations/gitlab-coderefs/README.md delete mode 100644 integrations/googleapps-sso/README.md create mode 100644 integrations/grafana/README.md delete mode 100644 integrations/heap/README.md delete mode 100644 integrations/jira/README.md delete mode 100644 integrations/okta/README.md delete mode 100644 integrations/onelogin/README.md delete mode 100644 integrations/pendo/README.md create mode 100644 integrations/sentry/README.md delete mode 100644 integrations/terraform/README.md delete mode 100644 integrations/trello/README.md delete mode 100644 integrations/vscode/README.md diff --git a/integrations/adfs/README.md b/integrations/adfs/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/adfs/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/ansible/README.md b/integrations/ansible/README.md deleted file mode 100644 index a802ae2d..00000000 --- a/integrations/ansible/README.md +++ /dev/null @@ -1 +0,0 @@ -Ansible Collection to manage LaunchDarkly resources. This allows you to use Ansible playbooks to configure and control feature flags, environments, projects, and more. diff --git a/integrations/appdynamics/README.md b/integrations/appdynamics/README.md index 483e10bf..022a34ff 100644 --- a/integrations/appdynamics/README.md +++ b/integrations/appdynamics/README.md @@ -1 +1,7 @@ -Some AppDynamics readme text will go here. \ No newline at end of file +# AppDynamics + +[User documentation](https://example.com) + +[API documentation](https://example.com) + +Run `npm run curl appdynamics` in the root repository directory to generate a `curl` command to send data to AppDynamics. diff --git a/integrations/appoptics/README.md b/integrations/appoptics/README.md index e69de29b..9b9e50d1 100644 --- a/integrations/appoptics/README.md +++ b/integrations/appoptics/README.md @@ -0,0 +1,7 @@ +# AppOptics + +[User documentation](https://example.com) + +[API documentation](https://docs.appoptics.com/api/#create-an-annotation) + +Run `npm run curl appoptics` in the root repository directory to generate a `curl` command to send data to AppOptics. diff --git a/integrations/azure-sso/README.md b/integrations/azure-sso/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/azure-sso/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/bitbucket-flags/README.md b/integrations/bitbucket-flags/README.md deleted file mode 100644 index 9fcbeefc..00000000 --- a/integrations/bitbucket-flags/README.md +++ /dev/null @@ -1,6 +0,0 @@ -The LaunchDarkly integration lets you insert feature flag actions directly into your Pipeline's continuous delivery flow. Bitbucket Pipelines is a continuous delivery platform that lets your team build, test, and deploy from Bitbucket. It exists within Bitbucket, giving you end-to-end visibility from coding to deployment. - -We provide two scripts you can add to your pipelines: - -- Create feature flags in your Pipelines build: This lets you create feature flags within a specified project. The feature flag will be created in all environments for that project. -- Enable a feature flag in your Pipelines build: This lets you turn on a specific feature flag for a specific environment within a project. \ No newline at end of file diff --git a/integrations/circleci-coderefs/README.md b/integrations/circleci-coderefs/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/circleci-coderefs/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/dynatrace/README.md b/integrations/dynatrace/README.md index e96a1b21..613e9b66 100644 --- a/integrations/dynatrace/README.md +++ b/integrations/dynatrace/README.md @@ -1,3 +1,7 @@ -Dynatrace is a software-intelligence monitoring platform that simplifies enterprise cloud complexity and accelerates digital transformation. With Davis (the Dynatrace AI causation engine) and complete automation, the Dynatrace all-in-one platform provides answers, not just data, about the performance of your applications, their underlying infrastructure, and the experience of your end users. Dynatrace is used to modernize and automate enterprise cloud operations, release higher-quality software faster, and deliver optimum digital experiences to your organization's customers. +# Dynatrace -Dynatrace seamlessly brings infrastructure and cloud, application performance, and digital experience monitoring into an all-in-one, automated solution that's powered by artificial intelligence. Dynatrace assists in driving performance results by providing development, operations, and business teams with a shared platform, metrics. In this way, Dynatrace can serve as your organization's single "source of truth." +[User documentation](https://example.com) + +[API documentation](https://www.dynatrace.com/support/help/extend-dynatrace/dynatrace-api/environment-api/events/post-event/) + +Run `npm run curl dynatrace` in the root repository directory to generate a `curl` command to send data to Dynatrace. diff --git a/integrations/gitlab-coderefs/README.md b/integrations/gitlab-coderefs/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/gitlab-coderefs/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/googleapps-sso/README.md b/integrations/googleapps-sso/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/googleapps-sso/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/grafana/README.md b/integrations/grafana/README.md new file mode 100644 index 00000000..2b43043e --- /dev/null +++ b/integrations/grafana/README.md @@ -0,0 +1,7 @@ +# Grafana + +[User documentation](https://example.com) + +[API documentation](https://grafana.com/docs/grafana/latest/http_api/annotations/#create-annotation) + +Run `npm run curl grafana` in the root repository directory to generate a `curl` command to send data to Grafana. diff --git a/integrations/heap/README.md b/integrations/heap/README.md deleted file mode 100644 index 0a9d57cf..00000000 --- a/integrations/heap/README.md +++ /dev/null @@ -1 +0,0 @@ -Heap Analytics is a web analytics tool that allows you to capture and measure every user action on your website or mobile app including clicks, taps, swipes, page views, form submissions, and more \ No newline at end of file diff --git a/integrations/honeycomb/README.md b/integrations/honeycomb/README.md index e69de29b..1e983580 100644 --- a/integrations/honeycomb/README.md +++ b/integrations/honeycomb/README.md @@ -0,0 +1,7 @@ +# Honeycomb + +[User documentation](https://example.com) + +[API documentation](https://docs.honeycomb.io/api/markers/) + +Run `npm run curl honeycomb` in the root repository directory to generate a `curl` command to send data to Honeycomb. diff --git a/integrations/jira/README.md b/integrations/jira/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/jira/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/logdna/README.md b/integrations/logdna/README.md index 985546e6..53a55e07 100644 --- a/integrations/logdna/README.md +++ b/integrations/logdna/README.md @@ -1 +1,7 @@ -Some LogDNA readme text will go here. \ No newline at end of file +# LogDNA + +[User documentation](https://example.com) + +[API documentation](https://docs.logdna.com/reference#api) + +Run `npm run curl logdna` in the root repository directory to generate a `curl` command to send data to LogDNA. diff --git a/integrations/msteams/README.md b/integrations/msteams/README.md index e69de29b..fdce1a5c 100644 --- a/integrations/msteams/README.md +++ b/integrations/msteams/README.md @@ -0,0 +1,7 @@ +# Microsoft Teams + +[User documentation](https://example.com) + +[API documentation](https://example.com) + +Run `npm run curl msteams` in the root repository directory to generate a `curl` command to send data to Teams. diff --git a/integrations/new-relic/README.md b/integrations/new-relic/README.md index f7ca8a1a..8a1a8089 100644 --- a/integrations/new-relic/README.md +++ b/integrations/new-relic/README.md @@ -1,12 +1,12 @@ -# LaunchDarkly New Relic Flag Events Integration -Please note that this integration requires a New Relic Pro account to function. -You should be able to see all LaunchDarkly flag events by running `SELECT * FROM LaunchDarkly` in your New Relic Insights Data Explorer. +# New Relic -If you want to see all the Event Types that have been posted in the last day, run `SHOW EVENT TYPES SINCE 1 day ago` +[User documentation](https://example.com) +[API documentation](https://docs.newrelic.com/docs/insights/insights-data-sources/custom-data/introduction-event-api) -## Troubleshooting the New Relic Events API -curl -X POST -d '{"eventType": "test", "message": "testing testing 123"}' -H "Content-Type:application/json" -H "X-Insert-Key: " https://insights-collector.newrelic.com/v1/accounts//events +Run `npm run curl new-relic` in the root repository directory to generate a `curl` command to send data to New Relic. -run `SELECT * FROM test` in New Relic Insights Data Explorer to see if your test event showed up! +Please note that this integration requires a New Relic Pro account to function. +You should be able to see all LaunchDarkly flag events by running `SELECT * FROM LaunchDarkly` in your New Relic Insights Data Explorer. +If you want to see all the Event Types that have been posted in the last day, run `SHOW EVENT TYPES SINCE 1 day ago` diff --git a/integrations/okta/README.md b/integrations/okta/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/okta/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/onelogin/README.md b/integrations/onelogin/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/onelogin/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/pendo/README.md b/integrations/pendo/README.md deleted file mode 100644 index 626b87c1..00000000 --- a/integrations/pendo/README.md +++ /dev/null @@ -1 +0,0 @@ -Product teams often want to roll out new features iteratively, measuring adoption and collecting feedback from a subset of users before making the feature generally available. Pendo and LaunchDarkly have partnered to help our joint customers use Pendo to better target and engage users during this process. Pendo data such as product adoption, renewal data, and ARR can help target the rollout of features through LaunchDarkly. \ No newline at end of file diff --git a/integrations/prometheus-pushgateway/README.md b/integrations/prometheus-pushgateway/README.md index 03f1dbf1..292c05c6 100644 --- a/integrations/prometheus-pushgateway/README.md +++ b/integrations/prometheus-pushgateway/README.md @@ -1 +1,7 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file +# Prometheus + +[User documentation](https://example.com) + +[API documentation](https://prometheus.io/docs/instrumenting/pushing/) + +Run `npm run curl prometheus-pushgateway` in the root repository directory to generate a `curl` command to send data to Prometheus. diff --git a/integrations/sample-integration/README.md b/integrations/sample-integration/README.md index e69de29b..fa8b813d 100644 --- a/integrations/sample-integration/README.md +++ b/integrations/sample-integration/README.md @@ -0,0 +1,7 @@ +# Sample Integration + +[User documentation](https://example.com) + +[API documentation](https://example.com) + +Run `npm run curl sample-integration` in the root repository directory to generate a `curl` command to send data to Sample Integration. diff --git a/integrations/sentry/README.md b/integrations/sentry/README.md new file mode 100644 index 00000000..e5d22588 --- /dev/null +++ b/integrations/sentry/README.md @@ -0,0 +1,7 @@ +# Sentry + +[User documentation](https://example.com) + +[API documentation](https://example.com) + +Run `npm run curl sentry` in the root repository directory to generate a `curl` command to send data to Sentry. diff --git a/integrations/signalfx/README.md b/integrations/signalfx/README.md index 945f67b5..6a7dbedc 100644 --- a/integrations/signalfx/README.md +++ b/integrations/signalfx/README.md @@ -1 +1,7 @@ -Some SignalFX readme text will go here. \ No newline at end of file +# SignalFx + +[User documentation](https://docs.launchdarkly.com/docs/signalfx) + +[API documentation](https://developers.signalfx.com/ingest_data_reference.html#operation/Send%20Custom%20Events) + +Run `npm run curl signalfx` in the root repository directory to generate a `curl` command to send data to SignalFx. diff --git a/integrations/splunk/README.md b/integrations/splunk/README.md index e69de29b..1baff988 100644 --- a/integrations/splunk/README.md +++ b/integrations/splunk/README.md @@ -0,0 +1,7 @@ +# Splunk + +[User documentation](https://example.com) + +[API documentation](https://example.com) + +Run `npm run curl splunk` in the root repository directory to generate a `curl` command to send data to Splunk. diff --git a/integrations/terraform/README.md b/integrations/terraform/README.md deleted file mode 100644 index f3af4ae2..00000000 --- a/integrations/terraform/README.md +++ /dev/null @@ -1 +0,0 @@ -Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more. \ No newline at end of file diff --git a/integrations/trello/README.md b/integrations/trello/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/trello/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file diff --git a/integrations/vscode/README.md b/integrations/vscode/README.md deleted file mode 100644 index 03f1dbf1..00000000 --- a/integrations/vscode/README.md +++ /dev/null @@ -1 +0,0 @@ -This is an example of an integration that only generates a Learn More button. \ No newline at end of file From 46d3102e38ad21b8d783eacf8a24d526cd037f9b Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 31 Jan 2020 15:49:22 -0800 Subject: [PATCH 183/936] Switch to using absolute URLs (#31) --- integrations/appoptics/templates/flag.json | 2 +- integrations/honeycomb/templates/flag.json | 2 +- integrations/new-relic/templates/flag.json | 12 ++++++------ integrations/sentry/templates/template.json | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/integrations/appoptics/templates/flag.json b/integrations/appoptics/templates/flag.json index 847ad904..2a25f91c 100644 --- a/integrations/appoptics/templates/flag.json +++ b/integrations/appoptics/templates/flag.json @@ -4,7 +4,7 @@ "links": [ { "label": "{{name}}", - "href": "https://ld-stg.launchdarkly.com{{_links.site.href}}", + "href": "{{_links.site.href}}", "rel": "launchdarkly" } ] diff --git a/integrations/honeycomb/templates/flag.json b/integrations/honeycomb/templates/flag.json index 63e227c3..f432121f 100644 --- a/integrations/honeycomb/templates/flag.json +++ b/integrations/honeycomb/templates/flag.json @@ -1,5 +1,5 @@ { "message": "{{{titleObj.plainText}}}", "type": "LaunchDarkly", - "url": "https://ld-stg.launchdarkly.com{{_links.site.href}}" + "url": "{{_links.site.href}}" } diff --git a/integrations/new-relic/templates/flag.json b/integrations/new-relic/templates/flag.json index f6d295ab..a6759b33 100644 --- a/integrations/new-relic/templates/flag.json +++ b/integrations/new-relic/templates/flag.json @@ -1,8 +1,8 @@ { - "message": "{{{titleObj.plainText}}}", - "eventType": "LaunchDarkly", - "url": "https://app.launchdarkly.com{{_links.site.href}}", - "timestamp": "{{timestamp.milliseconds}}", - "name": "{{name}}", - "project": "{{project.name}}" + "message": "{{{titleObj.plainText}}}", + "eventType": "LaunchDarkly", + "url": "{{_links.site.href}}", + "timestamp": "{{timestamp.milliseconds}}", + "name": "{{name}}", + "project": "{{project.name}}" } diff --git a/integrations/sentry/templates/template.json b/integrations/sentry/templates/template.json index 5dcd9539..c9021b6b 100644 --- a/integrations/sentry/templates/template.json +++ b/integrations/sentry/templates/template.json @@ -1,6 +1,6 @@ { "event_id": "{{ _id }}00000000", - "culprit": "https://app.launchdarkly.com{{ _links.site.href }}", + "culprit": "{{ _links.site.href }}", "logger": "launchdarkly.integration", "platform": "other", "level": "info", From afa415add4e36403a4de650c0ab467d36fff5518 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 31 Jan 2020 16:32:23 -0800 Subject: [PATCH 184/936] Update verbiage (#34) --- integrations/appdynamics/manifest.json | 12 ++++++------ integrations/appoptics/manifest.json | 10 +++++----- integrations/dynatrace/manifest.json | 4 ++-- integrations/grafana/manifest.json | 14 +++++++------- integrations/honeycomb/manifest.json | 9 +++++---- integrations/logdna/manifest.json | 9 +++++---- integrations/msteams/manifest.json | 4 ++-- integrations/new-relic/manifest.json | 9 +++++---- .../prometheus-pushgateway/manifest.json | 2 +- integrations/sentry/manifest.json | 17 ++++++++--------- integrations/sentry/templates/template.json | 4 ++-- integrations/signalfx/manifest.json | 2 +- integrations/splunk/manifest.json | 9 +++++---- integrations/splunk/templates/template.json | 2 +- 14 files changed, 55 insertions(+), 52 deletions(-) diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 1f7e7b3c..933188fa 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -17,22 +17,22 @@ "formVariables": [ { "key": "account", - "name": "Account", - "description": "Enter your AppDynamics Account as noted on your [License Management](https://docs.appdynamics.com/display/PRO45/License+Management) page", + "name": "Account name", + "description": "Enter your AppDynamics account name as noted on your [License Management](https://docs.appdynamics.com/display/PRO45/License+Management) page.", "type": "string", "isSecret": false }, { "key": "username", - "name": "AppDynamics User", - "description": "Enter your [AppDynamics username](https://docs.appdynamics.com/display/PRO45/API+Clients) here", + "name": "AppDynamics account username", + "description": "Enter your [AppDynamics username](https://docs.appdynamics.com/display/PRO45/API+Clients).", "type": "string", "isSecret": false }, { "key": "password", - "name": "AppDynamics user password", - "description": "Enter your [AppDynamics user password](https://docs.appdynamics.com/display/PRO45/API+Clients) here", + "name": "AppDynamics account password", + "description": "Enter your [AppDynamics user password](https://docs.appdynamics.com/display/PRO45/API+Clients).", "type": "string", "isSecret": true } diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index da9c4e13..8a0dff87 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -18,21 +18,21 @@ { "key": "streamName", "name": "AppOptics annotation stream name", - "description": "Enter the Annotation stream Name that will be used for the request to the [Annotation API](http://www.AppOptics.com/docs/api/?python#create-an-annotation).", + "description": "Enter the Annotation stream Name that will be used for the request to the [Annotation API](https://docs.appoptics.com/api/?shell#create-an-annotation).", "type": "string", "isSecret": false }, { "key": "username", - "name": "AppOptics username/email", - "description": "Enter your AppOptics username/email.", + "name": "AppOptics username", + "description": "Enter your AppOptics username.", "type": "string", "isSecret": false }, { "key": "apiKey", - "name": "AppOptics API Key", - "description": "Enter your AppOptics API Key here", + "name": "AppOptics API key", + "description": "Enter your AppOptics API Key as shown on your [account page](https://my.appoptics.com/organization/tokens).", "type": "string", "isSecret": true } diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index abd77a91..fee83568 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -17,7 +17,7 @@ "formVariables": [ { "key": "apiToken", - "name": "Dynatrace API Token", + "name": "Dynatrace API token", "type": "string", "description": "Enter your Dynatrace API token. [Learn more](https://www.dynatrace.com/support/help/shortlink/api-authentication#generate-a-token) about generating tokens. The 'access problem and event feed, metrics, and topology' scope is required.", "isSecret": true @@ -34,7 +34,7 @@ "key": "tag", "name": "Entity tag", "type": "string", - "description": "Enter the tag associated with your Dynatrace entity. This tag will associate LaunchDarkly data with the corresponding Dynatrace entity. [Learn more](https://www.dynatrace.com/support/help/shortlink/tagging) about tagging.", + "description": "Enter the tag associated with your Dynatrace entity. This value will associate LaunchDarkly data with the corresponding Dynatrace entity. [Learn more](https://www.dynatrace.com/support/help/shortlink/tagging) about tagging.", "placeholder": "LaunchDarkly", "isSecret": false } diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 3c2f8eb4..7bd3d556 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -1,7 +1,7 @@ { "name": "Grafana", "version": "0.0.1", - "overview": "Annotate your Grafana dashboards with Launch Darkly events", + "overview": "Annotate your Grafana dashboards with LaunchDarkly events", "description": "Send flag, environment, and project updates to Grafana to add context to your graphs.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -17,16 +17,16 @@ "formVariables": [ { "key": "endpointUrl", - "name": "API URL", - "description": "The URL of your Grafana instance's API", - "placeholder": "https://grafana.example.org/api", + "name": "Grafana URL", + "description": "Enter your Grafana instance's URL. This instance must be accessible to LaunchDarkly's servers.", + "placeholder": "https://grafana.example.org", "type": "uri", "isSecret": false }, { "key": "apiKey", - "name": "API Key", - "description": "An API key with editor privileges to your Grafana instance", + "name": "API key", + "description": "Enter an API key to your Grafana instance. This API key must have editor privileges.", "placeholder": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk=", "type": "string", "isSecret": true @@ -35,7 +35,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "{{ endpointUrl }}/annotations", + "url": "{{ endpointUrl }}/api/annotations", "method": "POST", "headers": [ { diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 8657408b..c1150098 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -17,15 +17,16 @@ "formVariables": [ { "key": "datasetName", - "name": "Honeycomb Dataset Name", - "description": "Enter the Dataset Name that will be used for the request to the [Marker API](https://docs.honeycomb.io/api/markers/).", + "name": "Honeycomb dataset name", + "description": "Enter the name of your Honeycomb dataset. This value will associate LaunchDarkly data with the corresponding Honeycomb dataset.", "type": "string", + "placeholder": "production", "isSecret": false }, { "key": "apiKey", - "name": "Honeycomb API Key", - "description": "Enter your [Honeycomb API key](https://ui.honeycomb.io/teams) here", + "name": "Honeycomb API key", + "description": "Enter your [Honeycomb API key](https://ui.honeycomb.io/teams).", "type": "string", "isSecret": true } diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 4a7c377e..5826e62c 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -18,17 +18,18 @@ { "key": "ingestionKey", "name": "LogDNA ingestion key", - "description": "Enter your [LogDNA ingestion key](https://app.logdna.com/manage/profile) here.", + "description": "Enter your [LogDNA ingestion key](https://app.logdna.com/manage/profile).", "type": "string", + "placeholder": "1234567890abcdef1234567890abcdef", "isSecret": true }, { "key": "app", - "name": "App", - "description": "Enter the App for which events are being generated. If you have multiple apps using LaunchDarkly, you might want to change this to include your LaunchDarkly project name.", + "name": "LogDNA app", + "description": "Enter the name of your LogDNA app. This value will associate LaunchDarkly data with the corresponding LogDNA app.", "type": "string", "isSecret": false, - "defaultValue": "LaunchDarkly" + "placeholder": "LaunchDarkly" }, { "key": "hostname", diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 35addd19..b1364d84 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -17,9 +17,9 @@ "formVariables": [ { "key": "url", - "name": "Incoming Webhook URL", + "name": "Incoming webhook URL", "type": "uri", - "description": "[Incoming Webhook URL](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using#creating-messages-through-office-365-connectors) from Microsoft Teams", + "description": "Enter your Microsoft Teams [incoming webhook URL](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using#creating-messages-through-office-365-connectors).", "isSecret": false } ], diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index d00b8368..d4062f05 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -21,13 +21,14 @@ "formVariables": [ { "key": "accountId", - "name": "New Relic Account ID", - "description": "Enter your 6-digit [New Relic Account ID](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/account-id) found in the URL of your New Relic account.", - "type": "string" + "name": "New Relic account ID", + "description": "Enter your [New Relic account ID](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/account-id).", + "type": "string", + "placeholder": "123456" }, { "key": "apiKey", - "name": "New Relic API Key", + "name": "New Relic API key", "description": "Enter your [New Relic API key](https://docs.newrelic.com/docs/insights/insights-data-sources/custom-data/introduction-event-api#register).", "type": "string", "isSecret": true diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index 7ccaa16a..29b7aa6b 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -18,7 +18,7 @@ { "key": "metricsUrl", "name": "Metrics URL", - "description": "The URL to which Launch Darkly should POST metrics", + "description": "Enter the URL to which LaunchDarkly should send metrics.", "placeholder": "http://pushgateway.example.org:9091/metrics/job/launch_darkly", "type": "uri", "isSecret": false diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index 8b4b981a..a3594551 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -16,24 +16,23 @@ }, "formVariables": [ { - "key": "domain", - "name": "Sentry API Domain", - "description": "The Domain part of your Sentry DSN", - "placeholder": "sentry.io", - "defaultValue": "sentry.io", + "key": "host", + "name": "Sentry API host", + "description": "Enter the host used to access your Sentry account.", + "placeholder": "https://sentry.io", "type": "string" }, { "key": "publicKey", - "name": "Sentry Public Key", - "description": "Public key part of your Sentry DSN", + "name": "Sentry public key", + "description": "Enter the public key associated with your Sentry account.", "placeholder": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk=", "type": "string" }, { "key": "projectId", "name": "Project ID", - "description": "Sentry Project ID you'd like to associate with LaunchDarkly events", + "description": "Enter the ID associated with your Sentry project. This ID will associate LaunchDarkly data with the corresponding Sentry project.", "placeholder": "123", "type": "string" } @@ -41,7 +40,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "https://{{domain}}/api/{{projectId}}/store/", + "url": "{{host}}/api/{{projectId}}/store/", "method": "POST", "headers": [ { diff --git a/integrations/sentry/templates/template.json b/integrations/sentry/templates/template.json index c9021b6b..b8cc0740 100644 --- a/integrations/sentry/templates/template.json +++ b/integrations/sentry/templates/template.json @@ -1,7 +1,7 @@ { "event_id": "{{ _id }}00000000", "culprit": "{{ _links.site.href }}", - "logger": "launchdarkly.integration", + "logger": "launchdarkly", "platform": "other", "level": "info", "transaction": "{{ titleObj.plainText }}", @@ -14,7 +14,7 @@ ], "tags": { - "source": "launchdarkly", + "source": "LaunchDarkly", "launchdarkly_kind": "{{ kind }}", "launchdarkly_name": "{{ name }}" }, diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 242b7363..c58f6a13 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -18,7 +18,7 @@ { "key": "accessToken", "name": "SignalFx access token", - "description": "Enter your [SignalFx access token](https://docs.signalfx.com/en/latest/admin-guide/tokens.html#working-with-access-tokens) here.", + "description": "Enter your [SignalFx access token](https://docs.signalfx.com/en/latest/admin-guide/tokens.html#working-with-access-tokens).", "type": "string", "isSecret": true }, diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index dc6b8efd..7b813691 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -17,15 +17,16 @@ "formVariables": [ { "key": "base-url", - "name": "HTTP Event Collector base URL", + "name": "HTTP event collector base URL", "type": "string", - "description": "[Splunk HTTP Event Collector base URL](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector)", - "isSecret": false + "description": "Enter your [Splunk HTTP event collector base URL](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector).", + "isSecret": false, + "placeholder": "https://todo/reasonable/placeholder/will/go/here" }, { "key": "token", "name": "Token", - "description": "HTTP Event Collector token value", + "description": "Enter your HTTP event collector token value.", "type": "string", "isSecret": true, "isOptional": false diff --git a/integrations/splunk/templates/template.json b/integrations/splunk/templates/template.json index 9bc6e5d2..59e4cc3e 100644 --- a/integrations/splunk/templates/template.json +++ b/integrations/splunk/templates/template.json @@ -1,5 +1,5 @@ { - "sourcetype": "launchdarkly", + "sourcetype": "LaunchDarkly", "time": "{{timestamp.milliseconds}}", "event": { "kind": "{{kind}}", From 634a623633377df0739250a39fe34806b40d3f00 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 31 Jan 2020 16:40:40 -0800 Subject: [PATCH 185/936] update manifests to use default and add more sample templates (#35) --- integrations/appdynamics/manifest.json | 3 --- integrations/grafana/manifest.json | 3 --- integrations/logdna/manifest.json | 3 --- integrations/msteams/manifest.json | 3 --- integrations/prometheus-pushgateway/manifest.json | 3 --- integrations/sample-integration/manifest.json | 8 ++++---- .../templates/{template.json => default.json} | 0 .../sample-integration/templates/environment.html | 4 ++++ integrations/sample-integration/templates/flag.json | 8 ++++++++ integrations/sample-integration/templates/project.txt | 1 + integrations/sentry/manifest.json | 3 --- integrations/signalfx/manifest.json | 3 --- integrations/splunk/manifest.json | 3 --- 13 files changed, 17 insertions(+), 28 deletions(-) rename integrations/sample-integration/templates/{template.json => default.json} (100%) create mode 100644 integrations/sample-integration/templates/environment.html create mode 100644 integrations/sample-integration/templates/flag.json create mode 100644 integrations/sample-integration/templates/project.txt diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 933188fa..4a39440d 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -54,9 +54,6 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 7bd3d556..10ba9e42 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -49,9 +49,6 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 5826e62c..a9d891d8 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -57,9 +57,6 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index b1364d84..f0cd0073 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -36,9 +36,6 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index 29b7aa6b..5e13a4aa 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -32,9 +32,6 @@ "headers": [] }, "templates": { - "flag": "templates/template", - "project": "templates/template", - "environment": "templates/template", "default": "templates/template" }, "defaultPolicy": [ diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 780a81d8..b24bb2dc 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -80,10 +80,10 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "default": "templates/template.json" + "flag": "templates/flag.json", + "environment": "templates/environment.html", + "project": "templates/project.txt", + "default": "templates/default.json" }, "defaultPolicy": [ { diff --git a/integrations/sample-integration/templates/template.json b/integrations/sample-integration/templates/default.json similarity index 100% rename from integrations/sample-integration/templates/template.json rename to integrations/sample-integration/templates/default.json diff --git a/integrations/sample-integration/templates/environment.html b/integrations/sample-integration/templates/environment.html new file mode 100644 index 00000000..d7a46343 --- /dev/null +++ b/integrations/sample-integration/templates/environment.html @@ -0,0 +1,4 @@ +

+

Something happened to the environment

+

{{{title.html}}}

+

diff --git a/integrations/sample-integration/templates/flag.json b/integrations/sample-integration/templates/flag.json new file mode 100644 index 00000000..e44bca25 --- /dev/null +++ b/integrations/sample-integration/templates/flag.json @@ -0,0 +1,8 @@ +{ + "title": "{{titleObj.markdown}}", + "text": "{{details.plainText}}", + "date_happened": "{{timestamp.seconds}}", + "tags": ["any", "arbitrary", "tag"], + "source_type_name": "example.com", + "extra": "This is a feature flag" + } diff --git a/integrations/sample-integration/templates/project.txt b/integrations/sample-integration/templates/project.txt new file mode 100644 index 00000000..0e182ddd --- /dev/null +++ b/integrations/sample-integration/templates/project.txt @@ -0,0 +1 @@ +Something happened to a project: {{{ title.plainText }}} diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index a3594551..df49f38a 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -54,9 +54,6 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index c58f6a13..5cf30029 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -47,9 +47,6 @@ ] }, "templates": { - "flag": "templates/template.json.hbs", - "project": "templates/template.json.hbs", - "environment": "templates/template.json.hbs", "default": "templates/template.json.hbs" }, "defaultPolicy": [ diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 7b813691..9871feac 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -49,9 +49,6 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ From 1ce336275c6e379d15cdfc2e0987d3a2d975a8fe Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 31 Jan 2020 16:58:37 -0800 Subject: [PATCH 186/936] Revert "update manifests to use default and add more sample templates (#35)" (#36) This reverts commit 634a623633377df0739250a39fe34806b40d3f00. --- integrations/appdynamics/manifest.json | 3 +++ integrations/grafana/manifest.json | 3 +++ integrations/logdna/manifest.json | 3 +++ integrations/msteams/manifest.json | 3 +++ integrations/prometheus-pushgateway/manifest.json | 3 +++ integrations/sample-integration/manifest.json | 8 ++++---- .../sample-integration/templates/environment.html | 4 ---- integrations/sample-integration/templates/flag.json | 8 -------- integrations/sample-integration/templates/project.txt | 1 - .../templates/{default.json => template.json} | 0 integrations/sentry/manifest.json | 3 +++ integrations/signalfx/manifest.json | 3 +++ integrations/splunk/manifest.json | 3 +++ 13 files changed, 28 insertions(+), 17 deletions(-) delete mode 100644 integrations/sample-integration/templates/environment.html delete mode 100644 integrations/sample-integration/templates/flag.json delete mode 100644 integrations/sample-integration/templates/project.txt rename integrations/sample-integration/templates/{default.json => template.json} (100%) diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 4a39440d..933188fa 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -54,6 +54,9 @@ ] }, "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 10ba9e42..7bd3d556 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -49,6 +49,9 @@ ] }, "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index a9d891d8..5826e62c 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -57,6 +57,9 @@ ] }, "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index f0cd0073..b1364d84 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -36,6 +36,9 @@ ] }, "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json index 5e13a4aa..29b7aa6b 100644 --- a/integrations/prometheus-pushgateway/manifest.json +++ b/integrations/prometheus-pushgateway/manifest.json @@ -32,6 +32,9 @@ "headers": [] }, "templates": { + "flag": "templates/template", + "project": "templates/template", + "environment": "templates/template", "default": "templates/template" }, "defaultPolicy": [ diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index b24bb2dc..780a81d8 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -80,10 +80,10 @@ ] }, "templates": { - "flag": "templates/flag.json", - "environment": "templates/environment.html", - "project": "templates/project.txt", - "default": "templates/default.json" + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", + "default": "templates/template.json" }, "defaultPolicy": [ { diff --git a/integrations/sample-integration/templates/environment.html b/integrations/sample-integration/templates/environment.html deleted file mode 100644 index d7a46343..00000000 --- a/integrations/sample-integration/templates/environment.html +++ /dev/null @@ -1,4 +0,0 @@ -

-

Something happened to the environment

-

{{{title.html}}}

-

diff --git a/integrations/sample-integration/templates/flag.json b/integrations/sample-integration/templates/flag.json deleted file mode 100644 index e44bca25..00000000 --- a/integrations/sample-integration/templates/flag.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "title": "{{titleObj.markdown}}", - "text": "{{details.plainText}}", - "date_happened": "{{timestamp.seconds}}", - "tags": ["any", "arbitrary", "tag"], - "source_type_name": "example.com", - "extra": "This is a feature flag" - } diff --git a/integrations/sample-integration/templates/project.txt b/integrations/sample-integration/templates/project.txt deleted file mode 100644 index 0e182ddd..00000000 --- a/integrations/sample-integration/templates/project.txt +++ /dev/null @@ -1 +0,0 @@ -Something happened to a project: {{{ title.plainText }}} diff --git a/integrations/sample-integration/templates/default.json b/integrations/sample-integration/templates/template.json similarity index 100% rename from integrations/sample-integration/templates/default.json rename to integrations/sample-integration/templates/template.json diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index df49f38a..a3594551 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -54,6 +54,9 @@ ] }, "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 5cf30029..c58f6a13 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -47,6 +47,9 @@ ] }, "templates": { + "flag": "templates/template.json.hbs", + "project": "templates/template.json.hbs", + "environment": "templates/template.json.hbs", "default": "templates/template.json.hbs" }, "defaultPolicy": [ diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 9871feac..7b813691 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -49,6 +49,9 @@ ] }, "templates": { + "flag": "templates/template.json", + "project": "templates/template.json", + "environment": "templates/template.json", "default": "templates/template.json" }, "defaultPolicy": [ From 64f9cdad703f5cdddc3537c2b6ffb917a4eba631 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Mon, 3 Feb 2020 10:17:46 -0800 Subject: [PATCH 187/936] don't escape plaintext summaries (#28) --- integrations/appdynamics/templates/template.json | 2 +- integrations/grafana/templates/template.json | 2 +- integrations/msteams/templates/template.json | 2 +- integrations/sentry/templates/template.json | 2 +- integrations/splunk/templates/template.json | 2 +- sample-context/flag-update.client-side-sdk.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/integrations/appdynamics/templates/template.json b/integrations/appdynamics/templates/template.json index 8b901d9e..8aa744c5 100644 --- a/integrations/appdynamics/templates/template.json +++ b/integrations/appdynamics/templates/template.json @@ -1,7 +1,7 @@ [ { "application_id": "LaunchDarkly", - "summary": "{{titleObj.plainText}}", + "summary": "{{{titleObj.plainText}}}", "comment": "{{#if comment}}{{comment}}{{/if}}", "eventtype": "APPLICATION_DEPLOYMENT", "severity": "INFO" diff --git a/integrations/grafana/templates/template.json b/integrations/grafana/templates/template.json index 60b5160f..d5c6034f 100644 --- a/integrations/grafana/templates/template.json +++ b/integrations/grafana/templates/template.json @@ -1,5 +1,5 @@ { "time":{{ timestamp.milliseconds }}, "tags":["launchdarkly","{{ kind }}","{{ name }}"], - "text":"{{ titleObj.plainText }}" + "text":"{{{ titleObj.plainText }}}" } diff --git a/integrations/msteams/templates/template.json b/integrations/msteams/templates/template.json index 95a14c54..f1e63fe0 100644 --- a/integrations/msteams/templates/template.json +++ b/integrations/msteams/templates/template.json @@ -2,7 +2,7 @@ "@type": "MessageCard", "@context": "http://schema.org/extensions", "themeColor": "0076D7", - "summary": "{{titleObj.plainText}}", + "summary": "{{{titleObj.plainText}}}", "sections": [ { "activityTitle": "{{{titleObj.html}}}", diff --git a/integrations/sentry/templates/template.json b/integrations/sentry/templates/template.json index b8cc0740..8f393b21 100644 --- a/integrations/sentry/templates/template.json +++ b/integrations/sentry/templates/template.json @@ -4,7 +4,7 @@ "logger": "launchdarkly", "platform": "other", "level": "info", - "transaction": "{{ titleObj.plainText }}", + "transaction": "{{{ titleObj.plainText }}}", "server_name": "app.launchdarkly.com", "fingerprint": [ "{{ _links.site.href }}", diff --git a/integrations/splunk/templates/template.json b/integrations/splunk/templates/template.json index 59e4cc3e..c7fdc939 100644 --- a/integrations/splunk/templates/template.json +++ b/integrations/splunk/templates/template.json @@ -7,7 +7,7 @@ "member_email": "{{member.email}}", "member_name": "{{member.firstName}} {{member.lastName}}", "verb": "{{titleVerb}}", - "message": "{{titleObj.plainText}}", + "message": "{{{titleObj.plainText}}}", "comment": "{{#if comment}}{{{comment}}}{{/if}}" } } diff --git a/sample-context/flag-update.client-side-sdk.json b/sample-context/flag-update.client-side-sdk.json index e5d781e2..f447bdbb 100644 --- a/sample-context/flag-update.client-side-sdk.json +++ b/sample-context/flag-update.client-side-sdk.json @@ -61,7 +61,7 @@ }, "titleVerb": "updated the flag", "titleObj": { - "plainText": "Henrietta Powell updated the flag A new flag", + "plainText": "Henrietta Powell updated the flag 'A new flag'", "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [A new flag](http://localhost/default/~/features/a-new-flag)", "html": "Henrietta Powell updated the flag A new flag" }, From eda32cc929af4cc8c4b8fe5ea1f6fe879db6e755 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 3 Feb 2020 18:27:16 +0000 Subject: [PATCH 188/936] change templates from .json to .json.hbs for formatting purposes --- .../appdynamics/templates/{template.json => template.json.hbs} | 0 integrations/appoptics/templates/{flag.json => flag.json.hbs} | 0 integrations/dynatrace/templates/{flag.json => flag.json.hbs} | 0 .../grafana/templates/{template.json => template.json.hbs} | 0 integrations/honeycomb/templates/{flag.json => flag.json.hbs} | 0 .../logdna/templates/{template.json => template.json.hbs} | 0 .../msteams/templates/{template.json => template.json.hbs} | 0 integrations/new-relic/templates/{flag.json => flag.json.hbs} | 0 .../templates/{template.json => template.json.hbs} | 0 .../sentry/templates/{template.json => template.json.hbs} | 0 .../splunk/templates/{template.json => template.json.hbs} | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename integrations/appdynamics/templates/{template.json => template.json.hbs} (100%) rename integrations/appoptics/templates/{flag.json => flag.json.hbs} (100%) rename integrations/dynatrace/templates/{flag.json => flag.json.hbs} (100%) rename integrations/grafana/templates/{template.json => template.json.hbs} (100%) rename integrations/honeycomb/templates/{flag.json => flag.json.hbs} (100%) rename integrations/logdna/templates/{template.json => template.json.hbs} (100%) rename integrations/msteams/templates/{template.json => template.json.hbs} (100%) rename integrations/new-relic/templates/{flag.json => flag.json.hbs} (100%) rename integrations/sample-integration/templates/{template.json => template.json.hbs} (100%) rename integrations/sentry/templates/{template.json => template.json.hbs} (100%) rename integrations/splunk/templates/{template.json => template.json.hbs} (100%) diff --git a/integrations/appdynamics/templates/template.json b/integrations/appdynamics/templates/template.json.hbs similarity index 100% rename from integrations/appdynamics/templates/template.json rename to integrations/appdynamics/templates/template.json.hbs diff --git a/integrations/appoptics/templates/flag.json b/integrations/appoptics/templates/flag.json.hbs similarity index 100% rename from integrations/appoptics/templates/flag.json rename to integrations/appoptics/templates/flag.json.hbs diff --git a/integrations/dynatrace/templates/flag.json b/integrations/dynatrace/templates/flag.json.hbs similarity index 100% rename from integrations/dynatrace/templates/flag.json rename to integrations/dynatrace/templates/flag.json.hbs diff --git a/integrations/grafana/templates/template.json b/integrations/grafana/templates/template.json.hbs similarity index 100% rename from integrations/grafana/templates/template.json rename to integrations/grafana/templates/template.json.hbs diff --git a/integrations/honeycomb/templates/flag.json b/integrations/honeycomb/templates/flag.json.hbs similarity index 100% rename from integrations/honeycomb/templates/flag.json rename to integrations/honeycomb/templates/flag.json.hbs diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json.hbs similarity index 100% rename from integrations/logdna/templates/template.json rename to integrations/logdna/templates/template.json.hbs diff --git a/integrations/msteams/templates/template.json b/integrations/msteams/templates/template.json.hbs similarity index 100% rename from integrations/msteams/templates/template.json rename to integrations/msteams/templates/template.json.hbs diff --git a/integrations/new-relic/templates/flag.json b/integrations/new-relic/templates/flag.json.hbs similarity index 100% rename from integrations/new-relic/templates/flag.json rename to integrations/new-relic/templates/flag.json.hbs diff --git a/integrations/sample-integration/templates/template.json b/integrations/sample-integration/templates/template.json.hbs similarity index 100% rename from integrations/sample-integration/templates/template.json rename to integrations/sample-integration/templates/template.json.hbs diff --git a/integrations/sentry/templates/template.json b/integrations/sentry/templates/template.json.hbs similarity index 100% rename from integrations/sentry/templates/template.json rename to integrations/sentry/templates/template.json.hbs diff --git a/integrations/splunk/templates/template.json b/integrations/splunk/templates/template.json.hbs similarity index 100% rename from integrations/splunk/templates/template.json rename to integrations/splunk/templates/template.json.hbs From 7747df83efc45f3d3645173694e403b9885601e8 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Mon, 3 Feb 2020 10:41:27 -0800 Subject: [PATCH 189/936] deleting prometheus integration (#38) --- integrations/prometheus-pushgateway/README.md | 7 --- .../assets/images/prometheus-square.svg | 50 ------------------- .../prometheus-pushgateway/manifest.json | 49 ------------------ .../prometheus-pushgateway/templates/template | 3 -- 4 files changed, 109 deletions(-) delete mode 100644 integrations/prometheus-pushgateway/README.md delete mode 100644 integrations/prometheus-pushgateway/assets/images/prometheus-square.svg delete mode 100644 integrations/prometheus-pushgateway/manifest.json delete mode 100644 integrations/prometheus-pushgateway/templates/template diff --git a/integrations/prometheus-pushgateway/README.md b/integrations/prometheus-pushgateway/README.md deleted file mode 100644 index 292c05c6..00000000 --- a/integrations/prometheus-pushgateway/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Prometheus - -[User documentation](https://example.com) - -[API documentation](https://prometheus.io/docs/instrumenting/pushing/) - -Run `npm run curl prometheus-pushgateway` in the root repository directory to generate a `curl` command to send data to Prometheus. diff --git a/integrations/prometheus-pushgateway/assets/images/prometheus-square.svg b/integrations/prometheus-pushgateway/assets/images/prometheus-square.svg deleted file mode 100644 index 5c51f66d..00000000 --- a/integrations/prometheus-pushgateway/assets/images/prometheus-square.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/integrations/prometheus-pushgateway/manifest.json b/integrations/prometheus-pushgateway/manifest.json deleted file mode 100644 index 29b7aa6b..00000000 --- a/integrations/prometheus-pushgateway/manifest.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "Prometheus", - "version": "0.0.1", - "overview": "Sends events to a Prometheus Pushgateway", - "description": "Sends events to a Prometheus Pushgateway or other endpoint that speaks the Prometheus line protocol.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://prometheus.io", - "privacyPolicy": "https://prometheus.io" - }, - "categories": ["monitoring"], - "icons": { - "square": "assets/images/prometheus-square.svg", - "horizontal": "assets/images/prometheus-square.svg" - }, - "formVariables": [ - { - "key": "metricsUrl", - "name": "Metrics URL", - "description": "Enter the URL to which LaunchDarkly should send metrics.", - "placeholder": "http://pushgateway.example.org:9091/metrics/job/launch_darkly", - "type": "uri", - "isSecret": false - } - ], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "{{metricsUrl}}", - "method": "POST", - "headers": [] - }, - "templates": { - "flag": "templates/template", - "project": "templates/template", - "environment": "templates/template", - "default": "templates/template" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } -} diff --git a/integrations/prometheus-pushgateway/templates/template b/integrations/prometheus-pushgateway/templates/template deleted file mode 100644 index 0618145d..00000000 --- a/integrations/prometheus-pushgateway/templates/template +++ /dev/null @@ -1,3 +0,0 @@ -# HELP launchdarkly_object_update_ms Help string goes here -# TYPE launchdarkly_object_update_ms gauge -launchdarkly_object_update_ms{kind="{{ kind }}", name="{{ name }}"} {{ timestamp.milliseconds }} From d5b1fff49b8104dc745cc8abe3d71a0782aa6c5a Mon Sep 17 00:00:00 2001 From: Ben Woskow Date: Mon, 3 Feb 2020 12:03:07 -0800 Subject: [PATCH 190/936] fix broken build --- integrations/appdynamics/manifest.json | 8 ++++---- integrations/appoptics/manifest.json | 2 +- integrations/dynatrace/manifest.json | 2 +- integrations/grafana/manifest.json | 8 ++++---- integrations/honeycomb/manifest.json | 2 +- integrations/logdna/manifest.json | 8 ++++---- integrations/msteams/manifest.json | 8 ++++---- integrations/new-relic/manifest.json | 4 ++-- integrations/sample-integration/manifest.json | 8 ++++---- integrations/sentry/manifest.json | 8 ++++---- integrations/splunk/manifest.json | 10 +++++----- 11 files changed, 34 insertions(+), 34 deletions(-) diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 933188fa..3a99a397 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -54,10 +54,10 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "default": "templates/template.json" + "flag": "templates/template.json.hbs", + "project": "templates/template.json.hbs", + "environment": "templates/template.json.hbs", + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index 8a0dff87..e7f3525c 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -50,7 +50,7 @@ ] }, "templates": { - "flag": "templates/flag.json" + "flag": "templates/flag.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index fee83568..0a7983f5 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -56,7 +56,7 @@ ] }, "templates": { - "flag": "templates/flag.json" + "flag": "templates/flag.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 7bd3d556..c95d7b39 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -49,10 +49,10 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "default": "templates/template.json" + "flag": "templates/template.json.hbs", + "project": "templates/template.json.hbs", + "environment": "templates/template.json.hbs", + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index c1150098..f3343e77 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -48,7 +48,7 @@ ] }, "templates": { - "flag": "templates/flag.json" + "flag": "templates/flag.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 5826e62c..6cf6ac4a 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -57,10 +57,10 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "default": "templates/template.json" + "flag": "templates/template.json.hbs", + "project": "templates/template.json.hbs", + "environment": "templates/template.json.hbs", + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index b1364d84..60d095a8 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -36,10 +36,10 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "default": "templates/template.json" + "flag": "templates/template.json.hbs", + "project": "templates/template.json.hbs", + "environment": "templates/template.json.hbs", + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index d4062f05..bbb95f67 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -51,7 +51,7 @@ ] }, "templates": { - "flag": "templates/flag.json" + "flag": "templates/flag.json.hbs" }, "defaultPolicy": [ { @@ -66,4 +66,4 @@ ] } } -} \ No newline at end of file +} diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 780a81d8..9a659d89 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -80,10 +80,10 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "default": "templates/template.json" + "flag": "templates/template.json.hbs", + "project": "templates/template.json.hbs", + "environment": "templates/template.json.hbs", + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index a3594551..3170e64f 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -54,10 +54,10 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "default": "templates/template.json" + "flag": "templates/template.json.hbs", + "project": "templates/template.json.hbs", + "environment": "templates/template.json.hbs", + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 7b813691..18e12ee3 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -21,7 +21,7 @@ "type": "string", "description": "Enter your [Splunk HTTP event collector base URL](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector).", "isSecret": false, - "placeholder": "https://todo/reasonable/placeholder/will/go/here" + "placeholder": "https://todo/reasonable/placeholder/will/go/here" }, { "key": "token", @@ -49,10 +49,10 @@ ] }, "templates": { - "flag": "templates/template.json", - "project": "templates/template.json", - "environment": "templates/template.json", - "default": "templates/template.json" + "flag": "templates/template.json.hbs", + "project": "templates/template.json.hbs", + "environment": "templates/template.json.hbs", + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { From b7eaa21392dd4756191e23a93f366a54b29dcd44 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 3 Feb 2020 16:17:34 -0800 Subject: [PATCH 191/936] Use title instead of titleObj (#33) --- integrations/appdynamics/templates/template.json | 2 +- integrations/appoptics/templates/flag.json | 2 +- integrations/dynatrace/templates/flag.json | 2 +- integrations/grafana/templates/template.json | 2 +- integrations/honeycomb/templates/flag.json | 2 +- integrations/logdna/templates/template.json | 2 +- integrations/msteams/templates/template.json | 4 ++-- integrations/new-relic/templates/flag.json | 2 +- integrations/sample-integration/templates/template.json | 2 +- integrations/sentry/templates/template.json | 6 +++--- integrations/signalfx/templates/template.json.hbs | 2 +- integrations/splunk/templates/template.json | 2 +- sample-context/flag-update.client-side-sdk.json | 4 ++-- sample-context/flag-update.toggle.json | 2 +- 14 files changed, 18 insertions(+), 18 deletions(-) diff --git a/integrations/appdynamics/templates/template.json b/integrations/appdynamics/templates/template.json index 8aa744c5..3042080c 100644 --- a/integrations/appdynamics/templates/template.json +++ b/integrations/appdynamics/templates/template.json @@ -1,7 +1,7 @@ [ { "application_id": "LaunchDarkly", - "summary": "{{{titleObj.plainText}}}", + "summary": "{{title.plainText}}", "comment": "{{#if comment}}{{comment}}{{/if}}", "eventtype": "APPLICATION_DEPLOYMENT", "severity": "INFO" diff --git a/integrations/appoptics/templates/flag.json b/integrations/appoptics/templates/flag.json index 2a25f91c..b5c5f2a3 100644 --- a/integrations/appoptics/templates/flag.json +++ b/integrations/appoptics/templates/flag.json @@ -1,5 +1,5 @@ { - "title": "{{{titleObj.plainText}}}", + "title": "{{{title.plainText}}}", "source": "LaunchDarkly", "links": [ { diff --git a/integrations/dynatrace/templates/flag.json b/integrations/dynatrace/templates/flag.json index 5cf35878..c43a5261 100644 --- a/integrations/dynatrace/templates/flag.json +++ b/integrations/dynatrace/templates/flag.json @@ -24,5 +24,5 @@ }, "start": {{ timestamp.milliseconds }}, "source": "LaunchDarkly", - "description": "{{{titleObj.plainText}}}" + "description": "{{{title.plainText}}}" } diff --git a/integrations/grafana/templates/template.json b/integrations/grafana/templates/template.json index d5c6034f..1cae8fb4 100644 --- a/integrations/grafana/templates/template.json +++ b/integrations/grafana/templates/template.json @@ -1,5 +1,5 @@ { "time":{{ timestamp.milliseconds }}, "tags":["launchdarkly","{{ kind }}","{{ name }}"], - "text":"{{{ titleObj.plainText }}}" + "text":"{{ title.plainText }}" } diff --git a/integrations/honeycomb/templates/flag.json b/integrations/honeycomb/templates/flag.json index f432121f..725cb806 100644 --- a/integrations/honeycomb/templates/flag.json +++ b/integrations/honeycomb/templates/flag.json @@ -1,5 +1,5 @@ { - "message": "{{{titleObj.plainText}}}", + "message": "{{{title.plainText}}}", "type": "LaunchDarkly", "url": "{{_links.site.href}}" } diff --git a/integrations/logdna/templates/template.json b/integrations/logdna/templates/template.json index 4aff3a36..4e0d7dfc 100644 --- a/integrations/logdna/templates/template.json +++ b/integrations/logdna/templates/template.json @@ -1,7 +1,7 @@ { "lines": [ { - "line": "{{{titleObj.plainText}}}{{#if comment}}, Comment: {{comment}}{{/if}}", + "line": "{{{title.plainText}}}{{#if comment}}, Comment: {{comment}}{{/if}}", "app": "{{formVariables.app}}", "level": "INFO", "env": "{{project.environment.key}}" diff --git a/integrations/msteams/templates/template.json b/integrations/msteams/templates/template.json index f1e63fe0..aae13490 100644 --- a/integrations/msteams/templates/template.json +++ b/integrations/msteams/templates/template.json @@ -2,10 +2,10 @@ "@type": "MessageCard", "@context": "http://schema.org/extensions", "themeColor": "0076D7", - "summary": "{{{titleObj.plainText}}}", + "summary": "{{title.plainText}}", "sections": [ { - "activityTitle": "{{{titleObj.html}}}", + "activityTitle": "{{{title.html}}}", "text": "{{#if details}}{{{details.html}}}{{/if}}{{#if comment}}\nComment: {{{comment}}}\n{{/if}}", "xml": true } diff --git a/integrations/new-relic/templates/flag.json b/integrations/new-relic/templates/flag.json index a6759b33..1ba379dd 100644 --- a/integrations/new-relic/templates/flag.json +++ b/integrations/new-relic/templates/flag.json @@ -1,5 +1,5 @@ { - "message": "{{{titleObj.plainText}}}", + "message": "{{{title.plainText}}}", "eventType": "LaunchDarkly", "url": "{{_links.site.href}}", "timestamp": "{{timestamp.milliseconds}}", diff --git a/integrations/sample-integration/templates/template.json b/integrations/sample-integration/templates/template.json index 525e3c64..aafe1e48 100644 --- a/integrations/sample-integration/templates/template.json +++ b/integrations/sample-integration/templates/template.json @@ -1,5 +1,5 @@ { - "title": "{{titleObj.markdown}}", + "title": "{{title.markdown}}", "text": "{{details.plainText}}", "date_happened": "{{timestamp.seconds}}", "tags": ["any", "arbitrary", "tag"], diff --git a/integrations/sentry/templates/template.json b/integrations/sentry/templates/template.json index 8f393b21..098ebeab 100644 --- a/integrations/sentry/templates/template.json +++ b/integrations/sentry/templates/template.json @@ -4,13 +4,13 @@ "logger": "launchdarkly", "platform": "other", "level": "info", - "transaction": "{{{ titleObj.plainText }}}", + "transaction": "{{ title.plainText }}", "server_name": "app.launchdarkly.com", "fingerprint": [ "{{ _links.site.href }}", "{{ kind }}", "{{ name }}", - "{{ titleObj.plainText }}" + "{{ title.plainText }}" ], "tags": { @@ -20,7 +20,7 @@ }, "message": { - "formatted": "{{ titleObj.markdown }}\n{{ details.markdown }}{{#if comment}}\n\n{{ comment }}{{/if}}" + "formatted": "{{ title.markdown }}\n{{ details.markdown }}{{#if comment}}\n\n{{ comment }}{{/if}}" }, "user": { "id": "launchdarkly/member/{{ member._id }}", diff --git a/integrations/signalfx/templates/template.json.hbs b/integrations/signalfx/templates/template.json.hbs index 3720cd13..8bdce5b8 100644 --- a/integrations/signalfx/templates/template.json.hbs +++ b/integrations/signalfx/templates/template.json.hbs @@ -5,7 +5,7 @@ "project": "{{project.key}}", "flag": "{{name}}", "kind": "{{kind}}", - "event": "{{{titleObj.plainText}}}", + "event": "{{{title.plainText}}}", "comment": "{{#if comment}}{{comment}}{{/if}}" }, "eventType": "LaunchDarkly {{kind}} change", diff --git a/integrations/splunk/templates/template.json b/integrations/splunk/templates/template.json index c7fdc939..fb792334 100644 --- a/integrations/splunk/templates/template.json +++ b/integrations/splunk/templates/template.json @@ -7,7 +7,7 @@ "member_email": "{{member.email}}", "member_name": "{{member.firstName}} {{member.lastName}}", "verb": "{{titleVerb}}", - "message": "{{{titleObj.plainText}}}", + "message": "{{title.plainText}}", "comment": "{{#if comment}}{{{comment}}}{{/if}}" } } diff --git a/sample-context/flag-update.client-side-sdk.json b/sample-context/flag-update.client-side-sdk.json index f447bdbb..55570507 100644 --- a/sample-context/flag-update.client-side-sdk.json +++ b/sample-context/flag-update.client-side-sdk.json @@ -60,8 +60,8 @@ "lastName": "Powell" }, "titleVerb": "updated the flag", - "titleObj": { - "plainText": "Henrietta Powell updated the flag 'A new flag'", + "title": { + "plainText": "Henrietta Powell updated the flag A new flag", "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [A new flag](http://localhost/default/~/features/a-new-flag)", "html": "Henrietta Powell updated the flag A new flag" }, diff --git a/sample-context/flag-update.toggle.json b/sample-context/flag-update.toggle.json index f14b14d4..a622ae65 100644 --- a/sample-context/flag-update.toggle.json +++ b/sample-context/flag-update.toggle.json @@ -60,7 +60,7 @@ "lastName": "Powell" }, "titleVerb": "turned on the flag", - "titleObj": { + "title": { "plainText": "Henrietta Powell turned on the flag Demo flag in 'Production'", "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) turned on the flag [Demo flag](http://localhost/default/production/features/demo-flag) in `Production`", "html": "Henrietta Powell turned on the flag Demo flag in Production" From ca985532160450cf847fa9a35a5dd8a3ff72aff5 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 4 Feb 2020 10:16:03 -0800 Subject: [PATCH 192/936] Use default template whenever possible (#39) --- integrations/appdynamics/manifest.json | 3 --- integrations/grafana/manifest.json | 3 --- integrations/logdna/manifest.json | 3 --- integrations/msteams/manifest.json | 3 --- integrations/sample-integration/manifest.json | 8 ++++---- .../templates/{template.json.hbs => default.json.hbs} | 0 .../sample-integration/templates/environment.html.hbs | 4 ++++ integrations/sample-integration/templates/flag.json.hbs | 8 ++++++++ integrations/sample-integration/templates/project.txt.hbs | 1 + integrations/sentry/manifest.json | 3 --- integrations/signalfx/manifest.json | 3 --- integrations/splunk/manifest.json | 3 --- 12 files changed, 17 insertions(+), 25 deletions(-) rename integrations/sample-integration/templates/{template.json.hbs => default.json.hbs} (100%) create mode 100644 integrations/sample-integration/templates/environment.html.hbs create mode 100644 integrations/sample-integration/templates/flag.json.hbs create mode 100644 integrations/sample-integration/templates/project.txt.hbs diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 3a99a397..55d86eba 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -54,9 +54,6 @@ ] }, "templates": { - "flag": "templates/template.json.hbs", - "project": "templates/template.json.hbs", - "environment": "templates/template.json.hbs", "default": "templates/template.json.hbs" }, "defaultPolicy": [ diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index c95d7b39..477843f1 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -49,9 +49,6 @@ ] }, "templates": { - "flag": "templates/template.json.hbs", - "project": "templates/template.json.hbs", - "environment": "templates/template.json.hbs", "default": "templates/template.json.hbs" }, "defaultPolicy": [ diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 6cf6ac4a..2473d9d0 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -57,9 +57,6 @@ ] }, "templates": { - "flag": "templates/template.json.hbs", - "project": "templates/template.json.hbs", - "environment": "templates/template.json.hbs", "default": "templates/template.json.hbs" }, "defaultPolicy": [ diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 60d095a8..c7292d71 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -36,9 +36,6 @@ ] }, "templates": { - "flag": "templates/template.json.hbs", - "project": "templates/template.json.hbs", - "environment": "templates/template.json.hbs", "default": "templates/template.json.hbs" }, "defaultPolicy": [ diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 9a659d89..ebc85376 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -80,10 +80,10 @@ ] }, "templates": { - "flag": "templates/template.json.hbs", - "project": "templates/template.json.hbs", - "environment": "templates/template.json.hbs", - "default": "templates/template.json.hbs" + "flag": "templates/flag.json.hbs", + "environment": "templates/environment.html.hbs", + "project": "templates/project.txt.hbs", + "default": "templates/default.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/sample-integration/templates/template.json.hbs b/integrations/sample-integration/templates/default.json.hbs similarity index 100% rename from integrations/sample-integration/templates/template.json.hbs rename to integrations/sample-integration/templates/default.json.hbs diff --git a/integrations/sample-integration/templates/environment.html.hbs b/integrations/sample-integration/templates/environment.html.hbs new file mode 100644 index 00000000..d7a46343 --- /dev/null +++ b/integrations/sample-integration/templates/environment.html.hbs @@ -0,0 +1,4 @@ +

+

Something happened to the environment

+

{{{title.html}}}

+

diff --git a/integrations/sample-integration/templates/flag.json.hbs b/integrations/sample-integration/templates/flag.json.hbs new file mode 100644 index 00000000..6e34bc9e --- /dev/null +++ b/integrations/sample-integration/templates/flag.json.hbs @@ -0,0 +1,8 @@ +{ + "title": "{{title.markdown}}", + "text": "{{details.plainText}}", + "date_happened": "{{timestamp.seconds}}", + "tags": ["any", "arbitrary", "tag"], + "source_type_name": "example.com", + "extra": "This is a feature flag" +} diff --git a/integrations/sample-integration/templates/project.txt.hbs b/integrations/sample-integration/templates/project.txt.hbs new file mode 100644 index 00000000..0e182ddd --- /dev/null +++ b/integrations/sample-integration/templates/project.txt.hbs @@ -0,0 +1 @@ +Something happened to a project: {{{ title.plainText }}} diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index 3170e64f..2326750a 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -54,9 +54,6 @@ ] }, "templates": { - "flag": "templates/template.json.hbs", - "project": "templates/template.json.hbs", - "environment": "templates/template.json.hbs", "default": "templates/template.json.hbs" }, "defaultPolicy": [ diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index c58f6a13..5cf30029 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -47,9 +47,6 @@ ] }, "templates": { - "flag": "templates/template.json.hbs", - "project": "templates/template.json.hbs", - "environment": "templates/template.json.hbs", "default": "templates/template.json.hbs" }, "defaultPolicy": [ diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 18e12ee3..2b1213fa 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -49,9 +49,6 @@ ] }, "templates": { - "flag": "templates/template.json.hbs", - "project": "templates/template.json.hbs", - "environment": "templates/template.json.hbs", "default": "templates/template.json.hbs" }, "defaultPolicy": [ From 719458398feb3da837b679b06325b6fced6770a3 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 4 Feb 2020 16:08:39 -0800 Subject: [PATCH 193/936] Add prettier pre-commit and circle checks and format all files (#42) * Run prettier and add pre-commit hook * add prettier check script and make changes to manifests * add prettier to circle and add .prettierignore * Fix circle config --- .circleci/config.yml | 3 + .pre-commit-config.yaml | 8 +- .prettierignore | 1 + __tests__/validate.js | 12 +- integrations/ansible/manifest.json | 32 ++--- integrations/circleci-coderefs/manifest.json | 6 +- integrations/gitlab-coderefs/manifest.json | 6 +- integrations/heap/manifest.json | 33 +++--- integrations/new-relic/manifest.json | 118 +++++++++---------- integrations/trello/manifest.json | 6 +- package.json | 1 + preview.js | 20 +++- 12 files changed, 134 insertions(+), 112 deletions(-) create mode 100644 .prettierignore diff --git a/.circleci/config.yml b/.circleci/config.yml index 8806bbf4..7dfa9f1c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,6 +12,9 @@ jobs: - run: name: Install Dependencies command: npm ci + - run: + name: prettier + command: npm run prettier:check - run: name: Run tests command: npm test diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 068eea0f..9d242036 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ repos: hooks: - id: check-merge-conflict - id: check-json - files: "integrations/*/manifest.json" + files: 'integrations/*/manifest.json' - id: check-symlinks - id: trailing-whitespace - id: end-of-file-fixer @@ -16,3 +16,9 @@ repos: entry: yarn test language: system pass_filenames: false + + - id: prettier + name: prettier + language: system + entry: npx prettier -l + files: '.*(js|json)$' diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..d4a73fe2 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +manifest.schema.json diff --git a/__tests__/validate.js b/__tests__/validate.js index f6abf515..b1b5889e 100644 --- a/__tests__/validate.js +++ b/__tests__/validate.js @@ -102,16 +102,16 @@ describe('All integrations', () => { if (formVariables) { formVariables.forEach(formVariable => { if (!_.isUndefined(formVariable.defaultValue)) { - if (formVariable.type === "string" || formVariable.type === "uri") { - expect(_.isString(formVariable.defaultValue)).toBe(true) - } else if (formVariable.type === "boolean") { - expect(_.isBoolean(formVariable.defaultValue)).toBe(true) + if (formVariable.type === 'string' || formVariable.type === 'uri') { + expect(_.isString(formVariable.defaultValue)).toBe(true); + } else if (formVariable.type === 'boolean') { + expect(_.isBoolean(formVariable.defaultValue)).toBe(true); } } - }) + }); } } - ) + ); test.each(manifests)( 'Templates can be successfully rendered for %s', diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json index f2928fcd..a170ecd8 100644 --- a/integrations/ansible/manifest.json +++ b/integrations/ansible/manifest.json @@ -1,18 +1,18 @@ { - "name": "Ansible Collection", - "version": "0.2.0", - "overview": "Manage your LaunchDarkly resources using Ansible", - "description": "LaunchDarkly Labs project to manage LaunchDarkly resources using Ansible. This allows you to use Ansible to configure and control feature flags, environments, projects, and more.", - "author": "LaunchDarkly Labs", - "supportEmail": "support@launchdarkly.com", - "links": { - "supportWebsite": "https://github.com/launchdarkly-labs/ansible-launchdarkly-collection/issues", - "site": "https://galaxy.ansible.com/launchdarkly_labs/collection", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["provisioning", "config-and-deployment", "orchestration"], - "icons": { - "square": "assets/square.svg", - "horizontal": "assets/horizontal.svg" - } + "name": "Ansible Collection", + "version": "0.2.0", + "overview": "Manage your LaunchDarkly resources using Ansible", + "description": "LaunchDarkly Labs project to manage LaunchDarkly resources using Ansible. This allows you to use Ansible to configure and control feature flags, environments, projects, and more.", + "author": "LaunchDarkly Labs", + "supportEmail": "support@launchdarkly.com", + "links": { + "supportWebsite": "https://github.com/launchdarkly-labs/ansible-launchdarkly-collection/issues", + "site": "https://galaxy.ansible.com/launchdarkly_labs/collection", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["provisioning", "config-and-deployment", "orchestration"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" } +} diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json index 0ff174a5..43374f45 100644 --- a/integrations/circleci-coderefs/manifest.json +++ b/integrations/circleci-coderefs/manifest.json @@ -9,7 +9,11 @@ "site": "https://docs.launchdarkly.com/docs/circleci-orbs", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["it-and-project-management", "config-and-deployment", "source-control"], + "categories": [ + "it-and-project-management", + "config-and-deployment", + "source-control" + ], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab-coderefs/manifest.json index 7d534dff..d0d2dccb 100644 --- a/integrations/gitlab-coderefs/manifest.json +++ b/integrations/gitlab-coderefs/manifest.json @@ -9,7 +9,11 @@ "site": "https://docs.launchdarkly.com/docs/gitlab-ci", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["it-and-project-management", "config-and-deployment", "source-control"], + "categories": [ + "it-and-project-management", + "config-and-deployment", + "source-control" + ], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index 72cf13f3..f349a414 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -1,19 +1,18 @@ { - "name": "Heap", - "version": "1.0.0", - "overview": "Heap and LaunchDarkly integration", - "description": "To set this up, attach LaunchDarkly's user key and feature flags as user and event properties in Heap.", - "author": "Pendo", - "supportEmail": "support@heap.io", - "links": { - "supportWebsite": "https://docs.oracle.com/en/cloud/saas/data-cloud/data-cloud-help-center/index.html", - "site": "https://docs.heap.io/docs/additional-sources#section-launch-darkly", - "privacyPolicy": "https://heap.io/privacy" - }, - "categories": ["analytics-and-reporting"], - "icons": { - "square": "assets/images/heapanalytics-square.svg", - "horizontal": "assets/images/heapanalytics-rect.svg" - } + "name": "Heap", + "version": "1.0.0", + "overview": "Heap and LaunchDarkly integration", + "description": "To set this up, attach LaunchDarkly's user key and feature flags as user and event properties in Heap.", + "author": "Pendo", + "supportEmail": "support@heap.io", + "links": { + "supportWebsite": "https://docs.oracle.com/en/cloud/saas/data-cloud/data-cloud-help-center/index.html", + "site": "https://docs.heap.io/docs/additional-sources#section-launch-darkly", + "privacyPolicy": "https://heap.io/privacy" + }, + "categories": ["analytics-and-reporting"], + "icons": { + "square": "assets/images/heapanalytics-square.svg", + "horizontal": "assets/images/heapanalytics-rect.svg" } - \ No newline at end of file +} diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index bbb95f67..7e3c9582 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -1,69 +1,61 @@ { - "name": "New Relic", - "version": "1.0.0", - "overview": "Send LaunchDarkly audit events to New Relic", - "description": "This integration sends LaunchDarkly audit events to New Relic. Please note that it requires a paid Insights subscription to function.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://newrelic.com/", - "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" + "name": "New Relic", + "version": "1.0.0", + "overview": "Send LaunchDarkly audit events to New Relic", + "description": "This integration sends LaunchDarkly audit events to New Relic. Please note that it requires a paid Insights subscription to function.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://newrelic.com/", + "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/new-relic-square.svg", + "horizontal": "assets/images/new-relic-horizontal.svg" + }, + "formVariables": [ + { + "key": "accountId", + "name": "New Relic account ID", + "description": "Enter your [New Relic account ID](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/account-id).", + "type": "string", + "placeholder": "123456" }, - "categories": [ - "apm", - "monitoring", - "alerts" - ], - "icons": { - "square": "assets/images/new-relic-square.svg", - "horizontal": "assets/images/new-relic-horizontal.svg" - }, - "formVariables": [ - { - "key": "accountId", - "name": "New Relic account ID", - "description": "Enter your [New Relic account ID](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/account-id).", - "type": "string", - "placeholder": "123456" - }, + { + "key": "apiKey", + "name": "New Relic API key", + "description": "Enter your [New Relic API key](https://docs.newrelic.com/docs/insights/insights-data-sources/custom-data/introduction-event-api#register).", + "type": "string", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "https://insights-collector.newrelic.com/v1/accounts/{{accountId}}/events", + "method": "POST", + "headers": [ + { + "name": "X-Insert-Key", + "value": "{{apiKey}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "flag": "templates/flag.json.hbs" + }, + "defaultPolicy": [ { - "key": "apiKey", - "name": "New Relic API key", - "description": "Enter your [New Relic API key](https://docs.newrelic.com/docs/insights/insights-data-sources/custom-data/introduction-event-api#register).", - "type": "string", - "isSecret": true - } - ], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "https://insights-collector.newrelic.com/v1/accounts/{{accountId}}/events", - "method": "POST", - "headers": [ - { - "name": "X-Insert-Key", - "value": "{{apiKey}}" - }, - { - "name": "Content-Type", - "value": "application/json" - } - ] - }, - "templates": { - "flag": "templates/flag.json.hbs" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": [ - "proj/*:env/production:flag/*" - ], - "actions": [ - "*" - ] - } - ] + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] } + ] } + } } diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index 0b378576..7dc9c122 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -9,7 +9,11 @@ "site": "https://trello.com/power-ups/5d795c43ef5f7d1dc307da46/launchdarkly", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["communication-and-collaboration", "issue-tracking", "it-and-project-management"], + "categories": [ + "communication-and-collaboration", + "issue-tracking", + "it-and-project-management" + ], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/package.json b/package.json index d3c14020..bdb767d5 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md && echo '' >> manifest.schema.json", "test": "jest", + "prettier:check": "prettier --list-different \"./**/*.{js,json}\"", "preview": "node preview.js", "curl": "node preview.js --curl" }, diff --git a/preview.js b/preview.js index 59c8e7ac..2c45334c 100644 --- a/preview.js +++ b/preview.js @@ -76,7 +76,7 @@ if (endpoint) { }); return { name: header.name, - value: headerTemplate(endpointContext) + value: headerTemplate(endpointContext), }; }); @@ -86,16 +86,22 @@ if (endpoint) { const templateString = readFileSync(path, { encoding: 'utf-8' }); const flagTemplate = Handlebars.compile(templateString, { strict: true }); const body = flagTemplate(fullContext); - + if (curl) { - let command = `curl -X ${endpoint.method} \\\n` + ` ${urlTemplate(endpointContext)} \\\n`; + let command = + `curl -X ${endpoint.method} \\\n` + + ` ${urlTemplate(endpointContext)} \\\n`; headers.forEach(header => { command += ` -H '${header.name}: ${header.value}' \\\n`; }); command += ` -d '${_.trimEnd(body)}'`; - console.log('Before running the following curl command, be sure to replace all variables denoted with $.'); - console.log(`The following command was generated with the test file ${testFileName}.\n`); + console.log( + 'Before running the following curl command, be sure to replace all variables denoted with $.' + ); + console.log( + `The following command was generated with the test file ${testFileName}.\n` + ); console.log(command); } else { console.log('URL: ', urlTemplate(endpointContext)); @@ -107,6 +113,8 @@ if (endpoint) { console.log(body); } } else { - console.log(`The "${integrationName}" integration does not make any outbound requests from LaunchDarkly.\n`); + console.log( + `The "${integrationName}" integration does not make any outbound requests from LaunchDarkly.\n` + ); process.exit(0); } From dfa993720cefaf4e660587fe3b37037211b3241e Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 5 Feb 2020 13:24:52 -0800 Subject: [PATCH 194/936] Update teams templates and add 'equal' helper (#41) --- __tests__/validate.js | 3 +++ helpers/index.js | 5 +++++ integrations/msteams/manifest.json | 4 +++- integrations/msteams/templates/default.json.hbs | 14 ++++++++++++++ .../msteams/templates/environment.json.hbs | 14 ++++++++++++++ .../{template.json.hbs => project.json.hbs} | 2 +- preview.js | 15 ++++++++++++++- 7 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 helpers/index.js create mode 100644 integrations/msteams/templates/default.json.hbs create mode 100644 integrations/msteams/templates/environment.json.hbs rename integrations/msteams/templates/{template.json.hbs => project.json.hbs} (89%) diff --git a/__tests__/validate.js b/__tests__/validate.js index b1b5889e..6e5fa75e 100644 --- a/__tests__/validate.js +++ b/__tests__/validate.js @@ -3,10 +3,13 @@ const Handlebars = require('handlebars'); const Ajv = require('ajv'); const _ = require('lodash'); +const helpers = require('../helpers'); const jsonEscape = require('../utils/json-escape'); const schema = require('../manifest.schema.json'); const flagUpdateContext = require('../sample-context/flag-update.client-side-sdk'); +Handlebars.registerHelper('equal', helpers.equal); + const getDirectories = source => readdirSync(source, { withFileTypes: true }) .filter(dir => dir.isDirectory()) diff --git a/helpers/index.js b/helpers/index.js new file mode 100644 index 00000000..5549ad56 --- /dev/null +++ b/helpers/index.js @@ -0,0 +1,5 @@ +const equal = (v1, v2) => { + return v1 === v2; +}; + +module.exports = { equal }; diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index c7292d71..a5339671 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -36,7 +36,9 @@ ] }, "templates": { - "default": "templates/template.json.hbs" + "project": "templates/project.json.hbs", + "environment": "templates/environment.json.hbs", + "default": "templates/default.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/msteams/templates/default.json.hbs b/integrations/msteams/templates/default.json.hbs new file mode 100644 index 00000000..74891314 --- /dev/null +++ b/integrations/msteams/templates/default.json.hbs @@ -0,0 +1,14 @@ +{ + "@type": "MessageCard", + "@context": "http://schema.org/extensions", + "themeColor": "0076D7", + "summary": "{{{title.plainText}}}", + "sections": [ + { + "activityTitle": "{{{title.html}}}{{#equal project.environment.key '~'}} in all environments{{/equal}}", + "activitySubtitle": "{{#if project.name}}{{project.name}}{{#if project.environment.name}} / {{project.environment.name}}{{/if}} / {{name}}{{/if}}", + "text": "{{#if details}}{{{details.html}}}{{/if}}{{#if comment}}\nComment: {{{comment}}}\n{{/if}}", + "xml": true + } + ] +} diff --git a/integrations/msteams/templates/environment.json.hbs b/integrations/msteams/templates/environment.json.hbs new file mode 100644 index 00000000..9c49a57e --- /dev/null +++ b/integrations/msteams/templates/environment.json.hbs @@ -0,0 +1,14 @@ +{ + "@type": "MessageCard", + "@context": "http://schema.org/extensions", + "themeColor": "0076D7", + "summary": "{{{title.plainText}}}", + "sections": [ + { + "activityTitle": "{{{title.html}}}", + "activitySubtitle": "{{project.name}} / {{name}}", + "text": "{{#if details}}{{{details.html}}}{{/if}}{{#if comment}}\nComment: {{{comment}}}\n{{/if}}", + "xml": true + } + ] +} diff --git a/integrations/msteams/templates/template.json.hbs b/integrations/msteams/templates/project.json.hbs similarity index 89% rename from integrations/msteams/templates/template.json.hbs rename to integrations/msteams/templates/project.json.hbs index aae13490..f59567c0 100644 --- a/integrations/msteams/templates/template.json.hbs +++ b/integrations/msteams/templates/project.json.hbs @@ -2,7 +2,7 @@ "@type": "MessageCard", "@context": "http://schema.org/extensions", "themeColor": "0076D7", - "summary": "{{title.plainText}}", + "summary": "{{{title.plainText}}}", "sections": [ { "activityTitle": "{{{title.html}}}", diff --git a/preview.js b/preview.js index 2c45334c..d1e94930 100644 --- a/preview.js +++ b/preview.js @@ -2,6 +2,7 @@ const { readFileSync } = require('fs'); const Handlebars = require('handlebars'); const _ = require('lodash'); +const helpers = require('./helpers'); const jsonEscape = require('./utils/json-escape'); const testFileName = 'flag-update.client-side-sdk.json'; @@ -30,6 +31,8 @@ const getFormVariableContext = formVariables => { return endpointContext; }; +Handlebars.registerHelper('equal', helpers.equal); + const curl = _.includes(args, '--curl'); const integrationNameIndex = curl ? 3 : 2; @@ -68,8 +71,18 @@ if (endpoint) { 'capabilities.auditLogEventsHook.templates.flag', null ); + const defaultTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.default', + null + ); + if (!(flagTemplatePath || defaultTemplatePath)) { + console.log('Could not find a flag/default template in manifest'); + process.exit(1); + } - const path = `./integrations/${integrationName}/${flagTemplatePath}`; + const path = `./integrations/${integrationName}/${flagTemplatePath || + defaultTemplatePath}`; const headers = endpoint.headers.map(header => { const headerTemplate = Handlebars.compile(header.value, { strict: true, From 9f2eaead03523989b14d6846e2ccb7129b14a062 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 7 Feb 2020 09:22:24 -0800 Subject: [PATCH 195/936] generate updated timestamps for preview and curl scripts (#43) --- preview.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/preview.js b/preview.js index d1e94930..27f08171 100644 --- a/preview.js +++ b/preview.js @@ -8,6 +8,13 @@ const jsonEscape = require('./utils/json-escape'); const testFileName = 'flag-update.client-side-sdk.json'; const flagUpdateContext = require(`./sample-context/${testFileName}`); +// Update the context to have a more recent timestamp. This is important +// because some third-party services reject event payloads which are +// identified as having happened in the more distant past. +const now = new Date().getTime(); +flagUpdateContext.timestamp.milliseconds = now; +flagUpdateContext.timestamp.seconds = Math.floor(now / 1000); + const args = process.argv; const getFormVariableContext = formVariables => { From 7b9cc94d16a968e2e1f161333810368b1673d2e8 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 7 Feb 2020 09:38:38 -0800 Subject: [PATCH 196/936] add comment field to dynatrace payload (#44) --- integrations/dynatrace/templates/flag.json.hbs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/dynatrace/templates/flag.json.hbs b/integrations/dynatrace/templates/flag.json.hbs index c43a5261..30e92432 100644 --- a/integrations/dynatrace/templates/flag.json.hbs +++ b/integrations/dynatrace/templates/flag.json.hbs @@ -20,7 +20,8 @@ "Project name": "{{project.name}}", "Project key": "{{project.key}}", "Environment name": "{{project.environment.name}}", - "Environment key": "{{project.environment.key}}" + "Environment key": "{{project.environment.key}}", + "Comment": "{{#if comment}}{{comment}}{{/if}}" }, "start": {{ timestamp.milliseconds }}, "source": "LaunchDarkly", From 69b8a6357c83ee49eada23f89daec8f7034babc9 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 7 Feb 2020 10:13:19 -0800 Subject: [PATCH 197/936] add more details to dynatrace (#45) --- integrations/dynatrace/templates/flag.json.hbs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/dynatrace/templates/flag.json.hbs b/integrations/dynatrace/templates/flag.json.hbs index 30e92432..43039653 100644 --- a/integrations/dynatrace/templates/flag.json.hbs +++ b/integrations/dynatrace/templates/flag.json.hbs @@ -21,7 +21,8 @@ "Project key": "{{project.key}}", "Environment name": "{{project.environment.name}}", "Environment key": "{{project.environment.key}}", - "Comment": "{{#if comment}}{{comment}}{{/if}}" + "Comment": "{{#if comment}}{{comment}}{{/if}}", + "More information": "{{details.plainText}}" }, "start": {{ timestamp.milliseconds }}, "source": "LaunchDarkly", From 8bc7517422bad701bd42d618268dd63cc42b7e63 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 7 Feb 2020 10:34:00 -0800 Subject: [PATCH 198/936] Revert adding more details to dynatrace (#46) --- integrations/dynatrace/templates/flag.json.hbs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/integrations/dynatrace/templates/flag.json.hbs b/integrations/dynatrace/templates/flag.json.hbs index 43039653..30e92432 100644 --- a/integrations/dynatrace/templates/flag.json.hbs +++ b/integrations/dynatrace/templates/flag.json.hbs @@ -21,8 +21,7 @@ "Project key": "{{project.key}}", "Environment name": "{{project.environment.name}}", "Environment key": "{{project.environment.key}}", - "Comment": "{{#if comment}}{{comment}}{{/if}}", - "More information": "{{details.plainText}}" + "Comment": "{{#if comment}}{{comment}}{{/if}}" }, "start": {{ timestamp.milliseconds }}, "source": "LaunchDarkly", From 6f2a4f8abf0a6890b765599f4a80b70bfcf2e61f Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 13 Feb 2020 09:21:26 -0800 Subject: [PATCH 199/936] ms teams link update (#47) --- integrations/msteams/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index a5339671..1340f379 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -19,7 +19,7 @@ "key": "url", "name": "Incoming webhook URL", "type": "uri", - "description": "Enter your Microsoft Teams [incoming webhook URL](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using#creating-messages-through-office-365-connectors).", + "description": "Enter your Microsoft Teams [incoming webhook URL](https://docs.launchdarkly.com/docs/microsoft-teams#section-setting-up-a-connector-in-microsoft-teams).", "isSecret": false } ], From 882ca1c6419e54efa19538cf5c6dac0bc65756c5 Mon Sep 17 00:00:00 2001 From: Yoz Grahame Date: Thu, 13 Feb 2020 22:10:07 -0800 Subject: [PATCH 200/936] Dynatrace: fix description, overview, links --- integrations/dynatrace/manifest.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 0a7983f5..c0688b11 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -1,13 +1,13 @@ { "name": "Dynatrace", "version": "1.0.0", - "overview": "Send audit log events to Dynatrace", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Dynatrace.", + "overview": "Send flag events to Dynatrace", + "description": "This integration sends LaunchDarkly flag events (including configuration changes) to Dynatrace.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/msteams", - "privacyPolicy": "https://privacy.microsoft.com/en-us" + "site": "https://docs.launchdarkly.com/integrations/dynatrace", + "privacyPolicy": "https://www.dynatrace.com/company/trust-center/privacy/" }, "categories": ["monitoring", "alerts", "apm"], "icons": { From 2e8993ab940ed2c11417043c7dd258b8215d8b9e Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 19 Feb 2020 17:15:48 -0800 Subject: [PATCH 201/936] Fix 'equal' helper (#51) --- __tests__/validate.js | 4 ++-- helpers/index.js | 13 ++++++++++--- preview.js | 4 ++-- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/__tests__/validate.js b/__tests__/validate.js index 6e5fa75e..f4a2ceac 100644 --- a/__tests__/validate.js +++ b/__tests__/validate.js @@ -3,12 +3,12 @@ const Handlebars = require('handlebars'); const Ajv = require('ajv'); const _ = require('lodash'); -const helpers = require('../helpers'); +const { registerHelpers } = require('../helpers'); const jsonEscape = require('../utils/json-escape'); const schema = require('../manifest.schema.json'); const flagUpdateContext = require('../sample-context/flag-update.client-side-sdk'); -Handlebars.registerHelper('equal', helpers.equal); +registerHelpers(); const getDirectories = source => readdirSync(source, { withFileTypes: true }) diff --git a/helpers/index.js b/helpers/index.js index 5549ad56..6ffd0e19 100644 --- a/helpers/index.js +++ b/helpers/index.js @@ -1,5 +1,12 @@ -const equal = (v1, v2) => { - return v1 === v2; +const Handlebars = require('handlebars'); + +const registerHelpers = () => { + Handlebars.registerHelper('equal', function(v1, v2, options) { + if (v1 === v2) { + return options.fn(this); + } + return options.inverse(this); + }); }; -module.exports = { equal }; +module.exports = { registerHelpers }; diff --git a/preview.js b/preview.js index 27f08171..9da7a0ba 100644 --- a/preview.js +++ b/preview.js @@ -2,7 +2,7 @@ const { readFileSync } = require('fs'); const Handlebars = require('handlebars'); const _ = require('lodash'); -const helpers = require('./helpers'); +const { registerHelpers } = require('./helpers'); const jsonEscape = require('./utils/json-escape'); const testFileName = 'flag-update.client-side-sdk.json'; @@ -38,7 +38,7 @@ const getFormVariableContext = formVariables => { return endpointContext; }; -Handlebars.registerHelper('equal', helpers.equal); +registerHelpers(); const curl = _.includes(args, '--curl'); const integrationNameIndex = curl ? 3 : 2; From cde0c6556a0cf0d52ea61312df410054b24779ed Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 20 Feb 2020 09:16:36 -0800 Subject: [PATCH 202/936] cleaning up the splunk payload (#50) --- integrations/splunk/README.md | 2 +- integrations/splunk/manifest.json | 2 +- integrations/splunk/templates/template.json.hbs | 15 ++++++++++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/integrations/splunk/README.md b/integrations/splunk/README.md index 1baff988..125bc4c7 100644 --- a/integrations/splunk/README.md +++ b/integrations/splunk/README.md @@ -2,6 +2,6 @@ [User documentation](https://example.com) -[API documentation](https://example.com) +[API documentation](https://docs.splunk.com/Documentation/Splunk/latest/Data/HECExamples#Extract_JSON_fields_example) Run `npm run curl splunk` in the root repository directory to generate a `curl` command to send data to Splunk. diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 2b1213fa..969f96ef 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -21,7 +21,7 @@ "type": "string", "description": "Enter your [Splunk HTTP event collector base URL](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector).", "isSecret": false, - "placeholder": "https://todo/reasonable/placeholder/will/go/here" + "placeholder": "https://mysplunkserver.example.com" }, { "key": "token", diff --git a/integrations/splunk/templates/template.json.hbs b/integrations/splunk/templates/template.json.hbs index fb792334..de429cb2 100644 --- a/integrations/splunk/templates/template.json.hbs +++ b/integrations/splunk/templates/template.json.hbs @@ -3,11 +3,20 @@ "time": "{{timestamp.milliseconds}}", "event": { "kind": "{{kind}}", - "name": "{{name}}", - "member_email": "{{member.email}}", - "member_name": "{{member.firstName}} {{member.lastName}}", + {{#equal kind 'flag'}} + "flag_name": "{{name}}", + "flag_key": "{{key}}", + {{/equal}} "verb": "{{titleVerb}}", "message": "{{title.plainText}}", + {{#if project}} + "project_name": "{{project.name}}", + "project_key": "{{project.key}}", + {{#if project.environment}} + "environment_name": "{{project.environment.name}}", + "environment_key": "{{project.environment.key}}", + {{/if}} + {{/if}} "comment": "{{#if comment}}{{{comment}}}{{/if}}" } } From 81c941dc27e51bee23d75be9e62b4cb9b5fb8c0b Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 20 Feb 2020 17:02:15 -0800 Subject: [PATCH 203/936] Add `skip-ca-verification` to formVars for Splunk (#52) --- integrations/splunk/manifest.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 969f96ef..61058408 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -30,6 +30,12 @@ "type": "string", "isSecret": true, "isOptional": false + }, + { + "key": "skip-ca-verification", + "name": "Skip certificate verification", + "description": "Splunk Cloud instances sign their own certificates by default. If you use Splunk Cloud, you may need to skip certificate validation.", + "type": "boolean" } ], "capabilities": { From c45187576ed96bcea9e1a07076ee3a41f33f656d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 21 Feb 2020 09:13:57 -0800 Subject: [PATCH 204/936] Update dynatrace to use custom properties for tags (#48) * Update dynatrace to use custom properties * Check for empty custom properties * Remove tag from manifest --- integrations/dynatrace/manifest.json | 8 -------- integrations/dynatrace/templates/flag.json.hbs | 14 ++++++++++++-- sample-context/flag-update.client-side-sdk.json | 10 ++++++++++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 0a7983f5..2e41b3dd 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -29,14 +29,6 @@ "description": "Enter the URL used to access your Dynatrace (managed or hosted) service. Follow the pattern shown in the placeholder text.", "placeholder": "https://{your-environment-id}.live.dynatrace.com", "isSecret": false - }, - { - "key": "tag", - "name": "Entity tag", - "type": "string", - "description": "Enter the tag associated with your Dynatrace entity. This value will associate LaunchDarkly data with the corresponding Dynatrace entity. [Learn more](https://www.dynatrace.com/support/help/shortlink/tagging) about tagging.", - "placeholder": "LaunchDarkly", - "isSecret": false } ], "capabilities": { diff --git a/integrations/dynatrace/templates/flag.json.hbs b/integrations/dynatrace/templates/flag.json.hbs index 30e92432..bc31ee8d 100644 --- a/integrations/dynatrace/templates/flag.json.hbs +++ b/integrations/dynatrace/templates/flag.json.hbs @@ -1,3 +1,6 @@ +{{#if customProperties}} +{{#if customProperties.dynatrace}} +{{#if customProperties.dynatrace.values}} { "eventType": "CUSTOM_CONFIGURATION", "attachRules": { @@ -5,10 +8,14 @@ { "meTypes": ["APPLICATION"], "tags": [ + {{#with customProperties}} + {{#each dynatrace.values}} { "context": "CONTEXTLESS", - "key": "{{formVariables.tag}}" - } + "key": "{{{this}}}" + }{{#unless @last}},{{/unless}} + {{/each}} + {{/with}} ] } ] @@ -27,3 +34,6 @@ "source": "LaunchDarkly", "description": "{{{title.plainText}}}" } +{{/if}} +{{/if}} +{{/if}} diff --git a/sample-context/flag-update.client-side-sdk.json b/sample-context/flag-update.client-side-sdk.json index 55570507..9b11a9fd 100644 --- a/sample-context/flag-update.client-side-sdk.json +++ b/sample-context/flag-update.client-side-sdk.json @@ -43,6 +43,16 @@ }, "key": "a-new-flag", "tags": [], + "customProperties": { + "dynatrace": { + "name": "Dynatrace", + "values": ["test1", "test2"] + }, + "jira": { + "name": "Jira", + "values": ["thing1", "thing2"] + } + }, "member": { "_links": { "parent": { From 084237e9ffa29b604bee7bc5ecf6b6a4a11ea106 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Fri, 21 Feb 2020 14:03:55 -0800 Subject: [PATCH 205/936] Splunk: skip certificate verification -- tweaked the copy a little (#54) * Add `skip-ca-verification` to formVars for Splunk * Tweaked the copy a little --- integrations/splunk/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 61058408..1b97a8f6 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -34,7 +34,7 @@ { "key": "skip-ca-verification", "name": "Skip certificate verification", - "description": "Splunk Cloud instances sign their own certificates by default. If you use Splunk Cloud, you may need to skip certificate validation.", + "description": "Splunk Cloud instances sign their own SSL certificates by default. If you use Splunk Cloud, you may need to skip certificate validation in order for this integration to work.", "type": "boolean" } ], From a30724c93e00dd6fadd47b4dd5de16bbd6b36780 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Mon, 24 Feb 2020 15:21:32 -0800 Subject: [PATCH 206/936] Don't escape title for Splunk (#55) --- integrations/splunk/templates/template.json.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/splunk/templates/template.json.hbs b/integrations/splunk/templates/template.json.hbs index de429cb2..88b39e87 100644 --- a/integrations/splunk/templates/template.json.hbs +++ b/integrations/splunk/templates/template.json.hbs @@ -8,7 +8,7 @@ "flag_key": "{{key}}", {{/equal}} "verb": "{{titleVerb}}", - "message": "{{title.plainText}}", + "message": "{{{title.plainText}}}", {{#if project}} "project_name": "{{project.name}}", "project_key": "{{project.key}}", From 9407ab13bd1cd22b204e853843ef8e1f26f0be69 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 26 Feb 2020 12:23:19 -0800 Subject: [PATCH 207/936] update categories and descriptions (#49) --- integrations/adfs/manifest.json | 4 +-- integrations/ansible/manifest.json | 2 +- integrations/appdynamics/manifest.json | 4 +-- integrations/appoptics/manifest.json | 4 +-- integrations/azure-devops/manifest.json | 2 +- integrations/azure-sso/manifest.json | 4 +-- integrations/bitbucket-flags/manifest.json | 2 +- integrations/circleci-coderefs/manifest.json | 8 ++---- integrations/dynatrace/manifest.json | 6 ++--- integrations/gitlab-coderefs/manifest.json | 8 ++---- integrations/googleapps-sso/manifest.json | 4 +-- integrations/grafana/manifest.json | 2 +- integrations/heap/manifest.json | 6 ++--- integrations/honeycomb/manifest.json | 4 +-- integrations/jira/manifest.json | 2 +- integrations/logdna/manifest.json | 4 +-- integrations/msteams/manifest.json | 4 +-- integrations/new-relic/manifest.json | 4 +-- integrations/okta/manifest.json | 4 +-- integrations/onelogin/manifest.json | 4 +-- integrations/pendo/manifest.json | 4 +-- integrations/sample-integration/manifest.json | 2 +- integrations/sentry/manifest.json | 4 +-- integrations/signalfx/manifest.json | 4 +-- integrations/splunk/manifest.json | 4 +-- integrations/terraform/manifest.json | 2 +- integrations/trello/manifest.json | 8 ++---- integrations/vscode/manifest.json | 2 +- manifest.schema.json | 26 +++++++------------ 29 files changed, 60 insertions(+), 78 deletions(-) diff --git a/integrations/adfs/manifest.json b/integrations/adfs/manifest.json index 1ed3853a..826ff660 100644 --- a/integrations/adfs/manifest.json +++ b/integrations/adfs/manifest.json @@ -1,7 +1,7 @@ { "name": "Active Directory Federation Services (ADFS)", "version": "1.0.0", - "overview": "Provision your LaunchDarkly users and manage single sign-on (SSO) with ADFS (Enterprise only)", + "overview": "Provision users and manage single sign-on with ADFS (Enterprise only)", "description": "Use your ADFS identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/adfs", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["provisioning", "security"], + "categories": ["authentication"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json index a170ecd8..deea0403 100644 --- a/integrations/ansible/manifest.json +++ b/integrations/ansible/manifest.json @@ -10,7 +10,7 @@ "site": "https://galaxy.ansible.com/launchdarkly_labs/collection", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["provisioning", "config-and-deployment", "orchestration"], + "categories": ["automation"], "icons": { "square": "assets/square.svg", "horizontal": "assets/horizontal.svg" diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 55d86eba..a66a6e38 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -1,7 +1,7 @@ { "name": "AppDynamics", "version": "1.0.0", - "overview": "Send audit log events to AppDynamics", + "overview": "Monitor LaunchDarkly flag changes in AppDynamics", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to AppDynamics.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://example.com", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["apm", "monitoring", "alerts"], + "categories": ["monitoring", "notifications"], "icons": { "square": "assets/images/appdynamics_square.svg", "horizontal": "assets/images/appdynamics_horizontal.svg" diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index e7f3525c..e9968c06 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -1,7 +1,7 @@ { "name": "AppOptics", "version": "1.0.0", - "overview": "Send LaunchDarkly audit events to AppOptics", + "overview": "Monitor LaunchDarkly flag changes in AppOptics", "description": "This integration sends LaunchDarkly audit events to AppOptics.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://www.AppOptics.com/", "privacyPolicy": "https://www.solarwinds.com/legal/privacy" }, - "categories": ["apm", "monitoring", "alerts"], + "categories": ["monitoring", "notifications"], "icons": { "square": "assets/images/solarwinds-square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/azure-devops/manifest.json b/integrations/azure-devops/manifest.json index 4df94721..359960bc 100644 --- a/integrations/azure-devops/manifest.json +++ b/integrations/azure-devops/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/visual-studio-team-services-extension", "privacyPolicy": "https://privacy.microsoft.com/en-US/privacystatement" }, - "categories": ["automation", "source-control"], + "categories": ["automation"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/azure-sso/manifest.json b/integrations/azure-sso/manifest.json index 4fefcd33..d274984e 100644 --- a/integrations/azure-sso/manifest.json +++ b/integrations/azure-sso/manifest.json @@ -1,7 +1,7 @@ { "name": "Azure Active Directory", "version": "1.0.0", - "overview": "Provision your LaunchDarkly users and manage single sign-on (SSO) with Azure (Enterprise only)", + "overview": "Provision users and manage single sign-on with Azure AD (Enterprise only)", "description": "Use your Azure identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/azure", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["provisioning", "security"], + "categories": ["authentication"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/bitbucket-flags/manifest.json b/integrations/bitbucket-flags/manifest.json index 34b47af5..13ff8cc3 100644 --- a/integrations/bitbucket-flags/manifest.json +++ b/integrations/bitbucket-flags/manifest.json @@ -10,7 +10,7 @@ "site": "https://docs.launchdarkly.com/docs/bitbucket-pipelines", "privacyPolicy": "https://docs.launchdarkly.com/docs/git-code-references#section-configuring-context-lines" }, - "categories": ["source-control"], + "categories": ["automation", "developer-tools"], "icons": { "square": "assets/images/bitbucket_square.svg", "horizontal": "assets/images/bitbucket_horizontal.svg" diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json index 43374f45..b7f1e0bc 100644 --- a/integrations/circleci-coderefs/manifest.json +++ b/integrations/circleci-coderefs/manifest.json @@ -1,7 +1,7 @@ { "name": "CircleCI", "version": "1.0.0", - "overview": "Use our open-source utility to track references to flags in your code, using CircleCI.", + "overview": "Use our open-source utility to track flag references in your code, using CircleCI.", "description": "You can use this utility with CircleCI to automatically populate code references in LaunchDarkly.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,11 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/circleci-orbs", "privacyPolicy": "https://example.com/privacy" }, - "categories": [ - "it-and-project-management", - "config-and-deployment", - "source-control" - ], + "categories": ["configuration", "version-control"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 6ea46420..ea3a0008 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -1,15 +1,15 @@ { "name": "Dynatrace", "version": "1.0.0", - "overview": "Send flag events to Dynatrace", - "description": "This integration sends LaunchDarkly flag events (including configuration changes) to Dynatrace.", + "overview": "Monitor LaunchDarkly flag changes in Dynatrace", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Dynatrace.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/integrations/dynatrace", "privacyPolicy": "https://www.dynatrace.com/company/trust-center/privacy/" }, - "categories": ["monitoring", "alerts", "apm"], + "categories": ["monitoring", "notifications"], "icons": { "square": "assets/square.svg", "horizontal": "assets/horizontal.svg" diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab-coderefs/manifest.json index d0d2dccb..2ae3e502 100644 --- a/integrations/gitlab-coderefs/manifest.json +++ b/integrations/gitlab-coderefs/manifest.json @@ -1,7 +1,7 @@ { "name": "GitLab", "version": "1.0.0", - "overview": "Use our open-source utility to track references to flags in your code, using GitLab CI.", + "overview": "Use our open-source utility to track flag references in your code, using GitLab CI.", "description": "You can use this utility with GitLab CI to automatically populate code references in LaunchDarkly.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,11 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/gitlab-ci", "privacyPolicy": "https://example.com/privacy" }, - "categories": [ - "it-and-project-management", - "config-and-deployment", - "source-control" - ], + "categories": ["configuration", "version-control"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/googleapps-sso/manifest.json b/integrations/googleapps-sso/manifest.json index bebde141..bef095ac 100644 --- a/integrations/googleapps-sso/manifest.json +++ b/integrations/googleapps-sso/manifest.json @@ -1,7 +1,7 @@ { "name": "Google Apps", "version": "1.0.0", - "overview": "Provision your LaunchDarkly users and manage single sign-on (SSO) with Google Apps (Enterprise only)", + "overview": "Provision users and manage single sign-on with Google (Enterprise only)", "description": "Use your Google Apps identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/google-apps", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["provisioning", "security"], + "categories": ["authentication"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 477843f1..199ba96a 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -9,7 +9,7 @@ "site": "https://grafana.com/", "privacyPolicy": "https://grafana.com/terms/" }, - "categories": ["monitoring"], + "categories": ["monitoring", "notifications"], "icons": { "square": "assets/images/grafana.svg", "horizontal": "assets/images/grafana.svg" diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index f349a414..def003a3 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -1,16 +1,16 @@ { "name": "Heap", "version": "1.0.0", - "overview": "Heap and LaunchDarkly integration", + "overview": "Add LaunchDarkly user IDs and feature flag events to Heap as user and event properties", "description": "To set this up, attach LaunchDarkly's user key and feature flags as user and event properties in Heap.", - "author": "Pendo", + "author": "Heap", "supportEmail": "support@heap.io", "links": { "supportWebsite": "https://docs.oracle.com/en/cloud/saas/data-cloud/data-cloud-help-center/index.html", "site": "https://docs.heap.io/docs/additional-sources#section-launch-darkly", "privacyPolicy": "https://heap.io/privacy" }, - "categories": ["analytics-and-reporting"], + "categories": ["product-tools"], "icons": { "square": "assets/images/heapanalytics-square.svg", "horizontal": "assets/images/heapanalytics-rect.svg" diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index f3343e77..3626f880 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -1,7 +1,7 @@ { "name": "Honeycomb", "version": "1.0.0", - "overview": "Send LaunchDarkly audit events to Honeycomb", + "overview": "Monitor LaunchDarkly flag changes in Honeycomb", "description": "This integration sends LaunchDarkly audit events to Honeycomb.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://honeycomb.io", "privacyPolicy": "https://honeycomb.io/privacy" }, - "categories": ["apm", "monitoring", "alerts"], + "categories": ["monitoring", "notifications"], "icons": { "square": "assets/images/honeycomb-square.svg", "horizontal": "assets/images/honeycomb-rect.svg" diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index cee04bef..492a8a8f 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/jira", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["apm", "monitoring", "alerts"], + "categories": ["task-management"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 2473d9d0..43258086 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -1,7 +1,7 @@ { "name": "LogDNA", "version": "1.0.0", - "overview": "Send audit log events to LogDNA", + "overview": "Monitor LaunchDarkly flag changes in LogDNA", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to LogDNA.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://example.com", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["monitoring", "alerts"], + "categories": ["monitoring", "notifications"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 1340f379..d927ae50 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -1,7 +1,7 @@ { "name": "Microsoft Teams", "version": "1.0.0", - "overview": "Send audit log events to Microsoft Teams", + "overview": "Receive flag change notifications in your Teams workspaces", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Microsoft Teams.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/msteams", "privacyPolicy": "https://privacy.microsoft.com/en-us" }, - "categories": ["monitoring", "alerts"], + "categories": ["collaboration", "notifications"], "icons": { "square": "assets/images/microsoft-teams.svg", "horizontal": "assets/images/microsoft-teams.svg" diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index 7e3c9582..5ee9e482 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -1,7 +1,7 @@ { "name": "New Relic", "version": "1.0.0", - "overview": "Send LaunchDarkly audit events to New Relic", + "overview": "Monitor LaunchDarkly flag changes in New Relic", "description": "This integration sends LaunchDarkly audit events to New Relic. Please note that it requires a paid Insights subscription to function.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://newrelic.com/", "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" }, - "categories": ["apm", "monitoring", "alerts"], + "categories": ["monitoring", "notifications"], "icons": { "square": "assets/images/new-relic-square.svg", "horizontal": "assets/images/new-relic-horizontal.svg" diff --git a/integrations/okta/manifest.json b/integrations/okta/manifest.json index 0db38cbb..94e3553f 100644 --- a/integrations/okta/manifest.json +++ b/integrations/okta/manifest.json @@ -1,7 +1,7 @@ { "name": "Okta", "version": "1.0.0", - "overview": "Provision your LaunchDarkly users and manage single sign-on (SSO) with Okta (Enterprise only)", + "overview": "Provision users and manage single sign-on with Okta (Enterprise only)", "description": "Use your Okta identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/okta", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["provisioning", "security"], + "categories": ["authentication"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/onelogin/manifest.json b/integrations/onelogin/manifest.json index 4e6af549..194fa964 100644 --- a/integrations/onelogin/manifest.json +++ b/integrations/onelogin/manifest.json @@ -1,7 +1,7 @@ { "name": "OneLogin", "version": "1.0.0", - "overview": "Provision your LaunchDarkly users and manage single sign-on (SSO) with OneLogin (Enterprise only)", + "overview": "Provision users and manage single sign-on with OneLogin (Enterprise only)", "description": "Use your OneLogin identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/onelogin", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["provisioning", "security"], + "categories": ["authentication"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index 9ff28067..64ab5573 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -1,7 +1,7 @@ { "name": "Pendo", "version": "1.0.0", - "overview": "Associate your Pendo audiences with LaunchDarkly targeting rules", + "overview": "Target your Pendo audiences with LaunchDarkly rules", "description": "Product teams often want to roll out new features iteratively, measuring adoption and collecting feedback from a subset of users before making the feature generally available. Pendo and LaunchDarkly have partnered to help our joint customers use Pendo to better target and engage users during this process. Pendo data such as product adoption, renewal data, and ARR can help target the rollout of features through LaunchDarkly.", "author": "Pendo", "supportEmail": "support@pendo.com", @@ -10,7 +10,7 @@ "site": "https://support.pendo.io/hc/en-us/articles/360032592312-LaunchDarkly-Recipe-Automate-the-feature-release-process", "privacyPolicy": "https://www.pendo.io/legal/privacy-policy/" }, - "categories": ["automation"], + "categories": ["product-tools"], "icons": { "square": "assets/images/pendo_square.svg", "horizontal": "assets/images/pendo_horizontal.svg" diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index ebc85376..381623c5 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -9,7 +9,7 @@ "site": "https://example.com", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["apm", "monitoring", "alerts"], + "categories": ["collaboration", "monitoring", "version-control"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index 2326750a..3faf6c2a 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -1,7 +1,7 @@ { "name": "Sentry", "version": "0.0.1", - "overview": "Send LaunchDarkly Events to Sentry", + "overview": "Monitor LaunchDarkly flag changes in Sentry", "description": "Send flag, environment, and project updates to Sentry.io", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://sentry.io", "privacyPolicy": "https://sentry.io/privacy/" }, - "categories": ["monitoring"], + "categories": ["monitoring", "notifications"], "icons": { "square": "assets/images/sentry.svg", "horizontal": "assets/images/sentry-banner.svg" diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 5cf30029..2b0324a2 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -1,7 +1,7 @@ { "name": "SignalFx", "version": "1.0.0", - "overview": "Send audit log events to SignalFx", + "overview": "Monitor LaunchDarkly flag changes in SignalFx", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to SignalFx.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://example.com", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["apm", "monitoring", "alerts"], + "categories": ["monitoring", "notifications"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 1b97a8f6..2b3c9889 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -1,7 +1,7 @@ { "name": "Splunk", "version": "1.0.0", - "overview": "Send audit log events to Splunk", + "overview": "Monitor LaunchDarkly flag changes in Splunk", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Splunk.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/splunk", "privacyPolicy": "https://www.splunk.com/en_us/legal/splunk-data-security-and-privacy.html" }, - "categories": ["monitoring", "alerts"], + "categories": ["monitoring", "notifications"], "icons": { "square": "assets/images/splunk-icon.svg", "horizontal": "assets/images/splunk-logo.svg" diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index 3ac1fd71..48ec9e92 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -10,7 +10,7 @@ "site": "https://www.terraform.io/docs/providers/launchdarkly/index.html", "privacyPolicy": "https://app.terraform.io/pages/privacy" }, - "categories": ["provisioning"], + "categories": ["infrastructure"], "icons": { "square": "assets/images/terraform_square.svg", "horizontal": "assets/images/terraform_horizontal.svg" diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index 7dc9c122..e20f8f56 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -1,7 +1,7 @@ { "name": "Trello", "version": "1.0.0", - "overview": "Dark launch new product features directly from within your Trello cards", + "overview": "Track and launch product features from your Trello cards", "description": "All from the back of your Trello cards, you can now browse and attach feature flags, enable or disable targetting status, and display the status of feature flags.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -9,11 +9,7 @@ "site": "https://trello.com/power-ups/5d795c43ef5f7d1dc307da46/launchdarkly", "privacyPolicy": "https://example.com/privacy" }, - "categories": [ - "communication-and-collaboration", - "issue-tracking", - "it-and-project-management" - ], + "categories": ["task-management"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/vscode/manifest.json b/integrations/vscode/manifest.json index 727976fc..a0c6e4e4 100644 --- a/integrations/vscode/manifest.json +++ b/integrations/vscode/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/visual-studio-code", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["it-and-project-management", "product-and-design"], + "categories": ["developer-tools"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/manifest.schema.json b/manifest.schema.json index e63be732..a66883d7 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -131,24 +131,18 @@ "items": { "type": "string", "enum": [ - "alerts", - "analytics-and-reporting", - "apm", + "authentication", "automation", - "communication-and-collaboration", - "config-and-deployment", - "exceptions", - "experimentation", - "hr-and-operations", - "issue-tracking", - "it-and-project-management", - "marketing-and-social-media", + "collaboration", + "configuration", + "data", + "developer-tools", + "infrastructure", + "task-management", "monitoring", - "orchestration", - "product-and-design", - "provisioning", - "security", - "source-control" + "notifications", + "product-tools", + "version-control" ] } }, From 9b76ccbba72a02e4811a6ec59c5e263b313f797e Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 5 Mar 2020 22:45:04 -0500 Subject: [PATCH 208/936] update signalfx template and manifest (#56) --- integrations/signalfx/manifest.json | 2 +- .../signalfx/templates/template.json.hbs | 28 +++++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 2b0324a2..cbb58946 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -25,7 +25,7 @@ { "key": "realm", "name": "SignalFx realm", - "description": "Enter your SignalFx realm as noted on your [profile page](https://app.us1.signalfx.com/#/myprofile).", + "description": "Enter your [SignalFx realm](https://developers.signalfx.com/#realms-in-endpoints).", "type": "string", "isSecret": false } diff --git a/integrations/signalfx/templates/template.json.hbs b/integrations/signalfx/templates/template.json.hbs index 8bdce5b8..a5be0b19 100644 --- a/integrations/signalfx/templates/template.json.hbs +++ b/integrations/signalfx/templates/template.json.hbs @@ -1,11 +1,29 @@ [{ "category": "AUDIT", "dimensions": { - "environment": "{{project.environment.key}}", - "project": "{{project.key}}", - "flag": "{{name}}", - "kind": "{{kind}}", - "event": "{{{title.plainText}}}", + {{#equal kind 'flag'}} + "flag_key": "{{key}}", + {{/equal}} + {{#if project}} + "project_key": "{{project.key}}", + {{#if project.environment}} + "environment_key": "{{project.environment.key}}", + {{/if}} + {{/if}} + "kind": "{{kind}}" + }, + "properties": { + {{#equal kind 'flag'}} + "flag_name": "{{name}}", + {{/equal}} + {{#if project}} + "project_name": "{{project.name}}", + {{#if project.environment}} + "environment_name": "{{project.environment.name}}", + {{/if}} + {{/if}} + "message": "{{{title.plainText}}}", + "verb": "{{titleVerb}}", "comment": "{{#if comment}}{{comment}}{{/if}}" }, "eventType": "LaunchDarkly {{kind}} change", From cb6ffedae1700110ed30acbd61daa4c52ccbb168 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 5 Mar 2020 22:06:40 -0800 Subject: [PATCH 209/936] Add enum form variable to manifest schema (#57) --- manifest.schema.json | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/manifest.schema.json b/manifest.schema.json index a66883d7..8fd58922 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -197,7 +197,8 @@ "placeholder", "isSecret", "isOptional", - "defaultValue" + "defaultValue", + "allowedValues" ] }, "properties": { @@ -224,7 +225,8 @@ "enum": [ "string", "boolean", - "uri" + "uri", + "enum" ] }, "description": { @@ -262,6 +264,15 @@ "string" ], "description": "Default value for variable. Can be overridden by user in the UI" + }, + "allowedValues": { + "$id": "#/properties/formVariables/variable/allowed-values", + "title": "Allowed values", + "type": "array", + "description": "allowed string values for enum-type formVariables", + "items": { + "type": "string" + } } }, "required": [ From 9b4ad983ef7ba3fa69dd6e9bfdb0dbd3a425baa9 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 6 Mar 2020 13:58:31 -0800 Subject: [PATCH 210/936] Add new "reserved custom properties" capability (#58) * Add first version of custom property capability * Improve descriptions and validation * Add max length * Change wording * address PR feedback --- integrations/dynatrace/manifest.json | 6 +++++ manifest.schema.json | 34 ++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index ea3a0008..25fd1481 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -32,6 +32,12 @@ } ], "capabilities": { + "reservedCustomProperties": [ + { + "name": "Dynatrace tags", + "key": "dynatrace" + } + ], "auditLogEventsHook": { "endpoint": { "url": "{{url}}/api/v1/events", diff --git a/manifest.schema.json b/manifest.schema.json index 8fd58922..e0a9c4c3 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -291,7 +291,7 @@ "type": "object", "propertyNames": { "enum": [ - "auditLogEventsHook" + "auditLogEventsHook", "reservedCustomProperties" ] }, "properties": { @@ -544,7 +544,37 @@ "endpoint", "templates" ] - } + }, + "reservedCustomProperties": { + "$id": "#/properties/capability/reserved-custom-properties", + "title": "Reserved custom properties", + "description": "This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/advanced/custom-properties for more information on custom properties", + "type": "array", + "items": { + "$id": "#/properties/capability/reserved-custom-properties/items", + "type": "object", + "propertyNames": {"enum": ["name", "key"]}, + "properties": { + "name": { + "$id": "#/properties/capability/reserved-custom-properties/items/name", + "title": "Name", + "type": "string", + "description": "The reserved custom property's display name.", + "maxLength": 64 + }, + "key": { + "$id": "#/properties/capability/reserved-custom-properties/items/key", + "title": "Key", + "type": "string", + "description": "The custom property's API response key.", + "maxLength": 64 + } + }, + "required": ["name", "key"] + }, + "minLength": 1, + "maxLength": 3 + } } } }, From 4fcbfe884799561e8be515bc69916fa7370520c0 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 20 Mar 2020 17:12:55 +0000 Subject: [PATCH 211/936] Update Dynatrace to use entity dropdown (#59) --- __tests__/validate.js | 3 + integrations/dynatrace/manifest.json | 97 +++++++++++++++++++ .../dynatrace/templates/flag.json.hbs | 2 +- preview.js | 3 + 4 files changed, 104 insertions(+), 1 deletion(-) diff --git a/__tests__/validate.js b/__tests__/validate.js index f4a2ceac..93a0b666 100644 --- a/__tests__/validate.js +++ b/__tests__/validate.js @@ -29,6 +29,9 @@ const getFormVariableContext = formVariables => { case 'uri': endpointContext[formVariable.key] = `https://${formVariable.key}.com`; break; + case 'enum': + endpointContext[formVariable.key] = formVariable.key; + break; } }); } diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 25fd1481..f336eeba 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -29,6 +29,103 @@ "description": "Enter the URL used to access your Dynatrace (managed or hosted) service. Follow the pattern shown in the placeholder text.", "placeholder": "https://{your-environment-id}.live.dynatrace.com", "isSecret": false + }, + { + "key": "entity", + "name": "Dynatrace entity", + "type": "enum", + "description": "Select the Dynatrace entity `meType` to associate with all events.", + "defaultValue": "APPLICATION", + "allowedValues": [ + "APPLICATION", + "APPLICATION_METHOD", + "APPLICATION_METHOD_GROUP", + "AUTO_SCALING_GROUP", + "AUXILIARY_SYNTHETIC_TEST", + "AWS_APPLICATION_LOAD_BALANCER", + "AWS_AVAILABILITY_ZONE", + "AWS_CREDENTIALS", + "AWS_LAMBDA_FUNCTION", + "AWS_NETWORK_LOAD_BALANCER", + "AZURE_API_MANAGEMENT_SERVICE", + "AZURE_APPLICATION_GATEWAY", + "AZURE_COSMOS_DB", + "AZURE_CREDENTIALS", + "AZURE_EVENT_HUB", + "AZURE_EVENT_HUB_NAMESPACE", + "AZURE_FUNCTION_APP", + "AZURE_IOT_HUB", + "AZURE_LOAD_BALANCER", + "AZURE_MGMT_GROUP", + "AZURE_REDIS_CACHE", + "AZURE_REGION", + "AZURE_SERVICE_BUS_NAMESPACE", + "AZURE_SERVICE_BUS_QUEUE", + "AZURE_SERVICE_BUS_TOPIC", + "AZURE_SQL_DATABASE", + "AZURE_SQL_ELASTIC_POOL", + "AZURE_SQL_SERVER", + "AZURE_STORAGE_ACCOUNT", + "AZURE_SUBSCRIPTION", + "AZURE_TENANT", + "AZURE_VM", + "AZURE_VM_SCALE_SET", + "AZURE_WEB_APP", + "CF_APPLICATION", + "CF_FOUNDATION", + "CINDER_VOLUME", + "CLOUD_APPLICATION", + "CLOUD_APPLICATION_INSTANCE", + "CLOUD_APPLICATION_NAMESPACE", + "CONTAINER_GROUP", + "CONTAINER_GROUP_INSTANCE", + "CUSTOM_APPLICATION", + "CUSTOM_DEVICE", + "CUSTOM_DEVICE_GROUP", + "DCRUM_APPLICATION", + "DCRUM_SERVICE", + "DCRUM_SERVICE_INSTANCE", + "DEVICE_APPLICATION_METHOD", + "DISK", + "DOCKER_CONTAINER_GROUP_INSTANCE", + "DYNAMO_DB_TABLE", + "EBS_VOLUME", + "EC2_INSTANCE", + "ELASTIC_LOAD_BALANCER", + "ENVIRONMENT", + "EXTERNAL_SYNTHETIC_TEST_STEP", + "GCP_ZONE", + "GEOLOCATION", + "GEOLOC_SITE", + "GOOGLE_COMPUTE_ENGINE", + "HOST", + "HOST_GROUP", + "HTTP_CHECK", + "HTTP_CHECK_STEP", + "HYPERVISOR", + "KUBERNETES_CLUSTER", + "KUBERNETES_NODE", + "MOBILE_APPLICATION", + "NETWORK_INTERFACE", + "NEUTRON_SUBNET", + "OPENSTACK_PROJECT", + "OPENSTACK_REGION", + "OPENSTACK_VM", + "OS", + "PROCESS_GROUP", + "PROCESS_GROUP_INSTANCE", + "RELATIONAL_DATABASE_SERVICE", + "SERVICE", + "SERVICE_INSTANCE", + "SERVICE_METHOD", + "SERVICE_METHOD_GROUP", + "SWIFT_CONTAINER", + "SYNTHETIC_LOCATION", + "SYNTHETIC_TEST", + "SYNTHETIC_TEST_STEP", + "VIRTUALMACHINE", + "VMWARE_DATACENTER" + ] } ], "capabilities": { diff --git a/integrations/dynatrace/templates/flag.json.hbs b/integrations/dynatrace/templates/flag.json.hbs index bc31ee8d..63a31707 100644 --- a/integrations/dynatrace/templates/flag.json.hbs +++ b/integrations/dynatrace/templates/flag.json.hbs @@ -6,7 +6,7 @@ "attachRules": { "tagRule": [ { - "meTypes": ["APPLICATION"], + "meTypes": [{{#if formVariables.entity }}"{{formVariables.entity}}"{{else}}"APPLICATION"{{/if}}], "tags": [ {{#with customProperties}} {{#each dynatrace.values}} diff --git a/preview.js b/preview.js index 9da7a0ba..3fc4055b 100644 --- a/preview.js +++ b/preview.js @@ -32,6 +32,9 @@ const getFormVariableContext = formVariables => { case 'uri': endpointContext[formVariable.key] = unsubstitutedKey; break; + case 'enum': + endpointContext[formVariable.key] = unsubstitutedKey; + break; } }); } From 544378d22ca7aa585f0e8bdec1c0719d676f7a99 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 23 Mar 2020 10:16:35 +0000 Subject: [PATCH 212/936] Resolve acorn dependency vunrability (#60) * Resolve acorn dependency vunrability * Explicitly add prettier * Upgrade prettier --- .prettierrc | 8 + MANIFEST.md | 960 -------- helpers/index.js | 2 +- package-lock.json | 5844 +++++++++++---------------------------------- package.json | 16 +- preview.js | 5 +- 6 files changed, 1415 insertions(+), 5420 deletions(-) create mode 100644 .prettierrc delete mode 100644 MANIFEST.md diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..536cc525 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "trailingComma": "es5", + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "arrowParens": "avoid", + "endOfLine": "lf" +} diff --git a/MANIFEST.md b/MANIFEST.md deleted file mode 100644 index 864d0cb5..00000000 --- a/MANIFEST.md +++ /dev/null @@ -1,960 +0,0 @@ -# LaunchDarkly Integrations Manifest Schema - -``` -https://launchdarkly.com/schemas/v1.0/integrations -``` - -Describes the capabilities and intent of a LaunchDarkly integration - -| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Defined In | -| ------------------- | ---------- | ------------ | ------------ | ----------------- | --------------------- | ---------- | -| Can be instantiated | No | Experimental | No | Forbidden | Forbidden | | - -# LaunchDarkly Integrations Manifest Properties - -| Property | Type | Required | Nullable | Default | Defined by | -| ------------------------------- | ---------- | ------------ | -------- | ------- | ------------------------------------------------ | -| [author](#author) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | -| [capabilities](#capabilities) | `object` | Optional | No | | LaunchDarkly Integrations Manifest (this schema) | -| [categories](#categories) | `enum[]` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | -| [description](#description) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | -| [formVariables](#formvariables) | `object[]` | Optional | No | `[]` | LaunchDarkly Integrations Manifest (this schema) | -| [icons](#icons) | `object` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | -| [links](#links) | `object` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | -| [name](#name) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | -| [overview](#overview) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | -| [supportEmail](#supportemail) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | -| [version](#version) | `string` | **Required** | No | | LaunchDarkly Integrations Manifest (this schema) | - -## author - -### Author - -Name of the author or organization responsible for the integration - -`author` - -- is **required** -- type: `string` -- defined in this schema - -### author Type - -`string` - -- minimum length: 3 characters -- maximum length: 100 characters All instances must conform to this regular expression (test examples - [here]()): - -```regex -^(.*)$ -``` - -## capabilities - -### Capabilities - -Specify which capabilities you'd like your integration to have - -`capabilities` - -- is optional -- type: `object` -- defined in this schema - -### capabilities Type - -`object` with following properties: - -| Property | Type | Required | -| -------------------- | ------ | -------- | -| `auditLogEventsHook` | object | Optional | - -#### auditLogEventsHook - -##### Audit Log Events Hook - -This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint. - -`auditLogEventsHook` - -- is optional -- type: `object` - -##### auditLogEventsHook Type - -`object` with following properties: - -| Property | Type | Required | -| --------------- | ------ | ------------ | -| `defaultPolicy` | array | Optional | -| `endpoint` | object | **Required** | -| `templates` | object | **Required** | - -#### defaultPolicy - -##### Default Policy - -LaunchDarkly policy that allows you to filter events sent to your webhook. See -https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. - -`defaultPolicy` - -- is optional -- type: `object[]`\* at least `1` items in the array - -##### defaultPolicy Type - -Array type: `object[]` - -All items must be of the type: `object` with following properties: - -| Property | Type | Required | Default | -| -------------- | ------ | -------- | --------- | -| `actions` | array | Optional | `["*"]` | -| `effect` | string | Optional | `"allow"` | -| `notActions` | array | Optional | `["*"]` | -| `notResources` | array | Optional | `["*"]` | -| `resources` | array | Optional | `["*"]` | - -#### actions - -##### Actions - -A list of action specifiers defining the actions to which the statement applies. See -https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. - -`actions` - -- is optional -- type: `string[]` -- default: `["*"]` - -##### actions Type - -Array type: `string[]` - -All items must be of the type: `string` - -##### actions Examples - -```json -updateOn -``` - -```json -createFlag -``` - -```json -updateRules -``` - -```json -updateTargets -``` - -#### effect - -##### Effect - -This attribute defines whether the statement allows or denies access to the named resources and actions. - -`effect` - -- is optional -- type: `enum` -- default: `"allow"` - -The value of this property **must** be equal to one of the [known values below](#capabilities-known-values). - -##### effect Known Values - -| Value | Description | -| ------- | ----------- | -| `allow` | | -| `deny` | | - -#### notActions - -##### Not actions - -A list of action specifiers defining the actions to which the statement does not apply. See -https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. - -`notActions` - -- is optional -- type: `string[]` -- default: `["*"]` - -##### notActions Type - -Array type: `string[]` - -All items must be of the type: `string` - -##### notActions Examples - -```json -createFlag -``` - -```json -deleteFlag -``` - -```json -cloneFlag -``` - -#### notResources - -##### Not resources - -A list of resource specifiers defining the resources to which the statement does not apply. See -https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. - -`notResources` - -- is optional -- type: `string[]` -- default: `["*"]` - -##### notResources Type - -Array type: `string[]` - -All items must be of the type: `string` - -##### notResources Example - -```json -proj/*:env/production:flag/* -``` - -#### resources - -##### Resources - -A list of resource specifiers defining the resources to which the statement applies. See -https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. - -`resources` - -- is optional -- type: `string[]` -- default: `["*"]` - -##### resources Type - -Array type: `string[]` - -All items must be of the type: `string` - -##### resources Example - -```json -proj/*:env/production:flag/* -``` - -A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. - -#### endpoint - -##### Endpoint - -Properties that describe the HTTP endpoint LaunchDarkly will send hooks to - -`endpoint` - -- is **required** -- type: `object` - -##### endpoint Type - -`object` with following properties: - -| Property | Type | Required | Default | -| --------- | ------ | ------------ | ------------------------------------------------------ | -| `headers` | array | Optional | `[{"name":"Content-Type","value":"application/json"}]` | -| `method` | | Optional | `"POST"` | -| `url` | string | **Required** | | - -#### headers - -##### HTTP headers - -Headers to send with the webhook request - -`headers` - -- is optional -- type: `object[]` -- default: `[{"name":"Content-Type","value":"application/json"}]` - -##### headers Type - -Array type: `object[]` - -All items must be of the type: `object` with following properties: - -| Property | Type | Required | -| -------- | ------ | ------------ | -| `name` | string | **Required** | -| `value` | string | **Required** | - -#### name - -##### Name - -Name of the header - -`name` - -- is **required** -- type: `string` - -##### name Type - -`string` - -- maximum length: 50 characters All instances must conform to this regular expression (test examples - [here](https://regexr.com/?expression=%5E%5B%5E%5Cs%5D*%24)): - -```regex -^[^\s]*$ -``` - -#### value - -##### Value - -Value of the header. Form variables can be substituted in using {{variableName}} - -`value` - -- is **required** -- type: `string` - -##### value Type - -`string` - -A name and value pair to send as headers with the hook request - -##### headers Examples - -```json -[object Object] -``` - -```json -[object Object] -``` - -#### method - -##### HTTP method - -HTTP method to use when LaunchDarkly makes the request to your endpoint - -`method` - -- is optional -- type: `enum` -- default: `"POST"` - -The value of this property **must** be equal to one of the [known values below](#capabilities-known-values). - -##### method Known Values - -| Value | Description | -| ------- | ----------- | -| `POST` | | -| `PUT` | | -| `PATCH` | | - -#### url - -##### URL - -URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - -`url` - -- is **required** -- type: `string` - -##### url Type - -`string` - -- minimum length: 3 characters - -#### templates - -##### Webhook body template - -Templates to use for body of the webhook request - -`templates` - -- is **required** -- type: `object` - -##### templates Type - -`object` with following properties: - -| Property | Type | Required | -| ------------- | ------ | -------- | -| `default` | string | Optional | -| `environment` | string | Optional | -| `flag` | string | Optional | -| `project` | string | Optional | - -#### default - -##### default template - -Template to use if the event does not have a corresponding named template - -`default` - -- is optional -- type: `string` - -##### default Type - -`string` - -#### environment - -##### Environment template - -Template to use for environment events - -`environment` - -- is optional -- type: `string` - -##### environment Type - -`string` - -#### flag - -##### Flag template - -Template to use for flag events - -`flag` - -- is optional -- type: `string` - -##### flag Type - -`string` - -#### project - -##### Project template - -Template to use for project events - -`project` - -- is optional -- type: `string` - -##### project Type - -`string` - -## categories - -### Categories - -Categories that describe your integration - -`categories` - -- is **required** -- type: `enum[]` -- between `1` and `3` items in the array -- defined in this schema - -### categories Type - -Array type: `enum[]` - -All items must be of the type: `string` - -## description - -### Long description - -A longer description of your integration - -`description` - -- is **required** -- type: `string` -- defined in this schema - -### description Type - -`string` - -- minimum length: 50 characters -- maximum length: 2048 characters All instances must conform to this regular expression (test examples - [here]()): - -```regex -^(.*)$ -``` - -## formVariables - -### Form variables - -Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply -when they enable the integration. Examples of a form variable include `apiToken` or `url`. - -`formVariables` - -- is optional -- type: `object[]` - -- default: `[]` -- defined in this schema - -### formVariables Type - -Array type: `object[]` - -All items must be of the type: `object` with following properties: - -| Property | Type | Required | Default | -| -------------- | -------------- | ------------ | ------- | -| `defaultValue` | boolean,string | Optional | | -| `description` | string | **Required** | | -| `isOptional` | boolean | Optional | `false` | -| `isSecret` | boolean | Optional | `false` | -| `key` | string | **Required** | | -| `name` | string | **Required** | | -| `placeholder` | string | Optional | | -| `type` | string | **Required** | | - -#### defaultValue - -##### Default value - -Default value for variable. Can be overridden by user in the UI - -`defaultValue` - -- is optional -- type: multiple - -##### defaultValue Type - -Unknown type `boolean,string`. - -```json -{ - "$id": "#/properties/formVariables/variable/default-value", - "title": "Default value", - "type": ["boolean", "string"], - "description": "Default value for variable. Can be overridden by user in the UI", - "simpletype": "multiple" -} -``` - -#### description - -##### Description - -Describes the variable in the UI. Markdown links allowed. - -`description` - -- is **required** -- type: `string` - -##### description Type - -`string` - -- maximum length: 250 characters - -#### isOptional - -##### Is this variable optional? - -Variables marked as optional won't be required on the UI - -`isOptional` - -- is optional -- type: `boolean` -- default: `false` - -##### isOptional Type - -`boolean` - -#### isSecret - -##### Is this variable a secret? - -Secret variables will be masked in the UI - -`isSecret` - -- is optional -- type: `boolean` -- default: `false` - -##### isSecret Type - -`boolean` - -#### key - -##### Key - -A key will be used as the token name when the variable is substituted - -`key` - -- is **required** -- type: `string` - -##### key Type - -`string` - -- maximum length: 20 characters All instances must conform to this regular expression (test examples - [here](https://regexr.com/?expression=%5E%5B%5E%5Cs%5D*%24)): - -```regex -^[^\s]*$ -``` - -#### name - -##### Name - -A descriptive name that will be used as the form label on the UI - -`name` - -- is **required** -- type: `string` - -##### name Type - -`string` - -- maximum length: 50 characters - -#### placeholder - -##### Description - -Placeholder value to use in the form element if applicable - -`placeholder` - -- is optional -- type: `string` - -##### placeholder Type - -`string` - -#### type - -##### Type - -The type of the variable - -`type` - -- is **required** -- type: `enum` - -The value of this property **must** be equal to one of the [known values below](#formvariables-known-values). - -##### type Known Values - -| Value | Description | -| --------- | ----------- | -| `string` | | -| `boolean` | | -| `uri` | | - -A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an -integration. - -## icons - -### Icons - -Logos describing your integration in SVG format - -`icons` - -- is **required** -- type: `object` -- defined in this schema - -### icons Type - -`object` with following properties: - -| Property | Type | Required | -| ------------ | ------ | ------------ | -| `horizontal` | string | **Required** | -| `square` | string | **Required** | - -#### horizontal - -##### Horizontal logo - -A horizontal version of your integration's logo in SVG format - -`horizontal` - -- is **required** -- type: `string` - -##### horizontal Type - -`string` - -All instances must conform to this regular expression (test examples -[here](https://regexr.com/?expression=%5C.svg%24)): - -```regex -\.svg$ -``` - -#### square - -##### Square logo - -A square version of your integration's logo in SVG format - -`square` - -- is **required** -- type: `string` - -##### square Type - -`string` - -All instances must conform to this regular expression (test examples -[here](https://regexr.com/?expression=%5C.svg%24)): - -```regex -\.svg$ -``` - -## links - -### Links - -A set of reference links supporting your integration - -`links` - -- is **required** -- type: `object` -- defined in this schema - -### links Type - -`object` with following properties: - -| Property | Type | Required | -| ---------------- | ------ | ------------ | -| `privacyPolicy` | string | **Required** | -| `site` | string | **Required** | -| `supportWebsite` | string | Optional | - -#### privacyPolicy - -##### Privacy Policy - -URL to your organization's privacy policy - -`privacyPolicy` - -- is **required** -- type: `string` - -##### privacyPolicy Type - -`string` - -- maximum length: 2048 characters All instances must conform to this regular expression (test examples - [here](https://regexr.com/?expression=%5E%5BHh%5D%5BTt%5D%5BTt%5D%5BPp%5D%5BSs%5D%3F%3A%2F%2F)): - -```regex -^[Hh][Tt][Tt][Pp][Ss]?:// -``` - -#### site - -##### Website - -URL to your website - -`site` - -- is **required** -- type: `string` - -##### site Type - -`string` - -- maximum length: 2048 characters All instances must conform to this regular expression (test examples - [here](https://regexr.com/?expression=%5E%5BHh%5D%5BTt%5D%5BTt%5D%5BPp%5D%5BSs%5D%3F%3A%2F%2F)): - -```regex -^[Hh][Tt][Tt][Pp][Ss]?:// -``` - -#### supportWebsite - -##### Support Website - -URL to your integration's support website - -`supportWebsite` - -- is optional -- type: `string` - -##### supportWebsite Type - -`string` - -- maximum length: 2048 characters All instances must conform to this regular expression (test examples - [here](https://regexr.com/?expression=%5E%5BHh%5D%5BTt%5D%5BTt%5D%5BPp%5D%5BSs%5D%3F%3A%2F%2F)): - -```regex -^[Hh][Tt][Tt][Pp][Ss]?:// -``` - -## name - -### Integration name - -Your integration's name. - -`name` - -- is **required** -- type: `string` -- defined in this schema - -### name Type - -`string` - -- minimum length: 3 characters -- maximum length: 100 characters - -## overview - -### Short description - -A short-one liner describing your integration - -`overview` - -- is **required** -- type: `string` -- defined in this schema - -### overview Type - -`string` - -- minimum length: 10 characters -- maximum length: 100 characters All instances must conform to this regular expression (test examples - [here]()): - -```regex -^(.*)$ -``` - -## supportEmail - -### Support Email - -Email address for your integration's support - -`supportEmail` - -- is **required** -- type: `string` -- defined in this schema - -### supportEmail Type - -`string` - -- format: `email` – email address (according to [RFC 5322, section 3.4.1](https://tools.ietf.org/html/rfc5322)) - -## version - -### Version - -A semantic version of the integration. See https://semver.org for more info. - -`version` - -- is **required** -- type: `string` -- defined in this schema - -### version Type - -`string` - -- minimum length: 5 characters -- maximum length: 14 characters All instances must conform to this regular expression - -```regex -^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$ -``` - -- test example: - [0.0.1]() -- test example: - [1.0.0]() -- test example: - [1.0.1-beta]() - -### version Examples - -```json -"0.0.1" -``` - -```json -"1.0.0" -``` - -```json -"1.0.1-beta" -``` diff --git a/helpers/index.js b/helpers/index.js index 6ffd0e19..576bdb3d 100644 --- a/helpers/index.js +++ b/helpers/index.js @@ -1,7 +1,7 @@ const Handlebars = require('handlebars'); const registerHelpers = () => { - Handlebars.registerHelper('equal', function(v1, v2, options) { + Handlebars.registerHelper('equal', function (v1, v2, options) { if (v1 === v2) { return options.fn(this); } diff --git a/package-lock.json b/package-lock.json index e3e4fedd..bb690085 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,48 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@adobe/helix-log": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@adobe/helix-log/-/helix-log-2.2.2.tgz", - "integrity": "sha512-Jn8EUE2Mpb3NRz5wWrj3xu51kZDYboTlAueG5mgYdG3/NnHNUJU75N/JMpA+QTPSAi9XjWoUmM7nQW346qbU3g==", - "dev": true, - "requires": { - "colorette": "^1.1.0", - "ferrum": "^1.2.0", - "phin": "^3.4.0", - "polka": "^0.5.2", - "snyk": "^1.226.1", - "uuid": "^3.3.3" - } - }, - "@adobe/jsonschema2md": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@adobe/jsonschema2md/-/jsonschema2md-3.3.1.tgz", - "integrity": "sha512-fF3TaFazqZ52DaM9Au97STq7LnnMzDFr5Nr4RUY/7XImL0fW8SbjLl3M3AuALI2UZv28qcWxu+h03Nz3k2h7HA==", - "dev": true, - "requires": { - "@adobe/helix-log": "^2.0.0", - "ajv": "^6.10.2", - "bluebird": "^3.5.5", - "ejs": "^2.6.2", - "github-slugger": "^1.2.1", - "i18n": "^0.8.3", - "jasmine-xml-reporter": "^1.2.1", - "json-pointer": "^0.6.0", - "lodash": "^4.17.15", - "mkdirp": "^0.5.1", - "optimist": "^0.6.1", - "prettier": "^1.18.2", - "readdirp": "^3.1.1", - "valid-url": "1.0.9" - } - }, - "@arr/every": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.1.tgz", - "integrity": "sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==", - "dev": true - }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -56,43 +14,29 @@ } }, "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", + "json5": "^2.1.2", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -102,12 +46,12 @@ } }, "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", + "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", "dev": true, "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.9.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -141,12 +85,76 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, "@babel/helper-plugin-utils": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, "@babel/helper-split-export-declaration": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", @@ -156,34 +164,101 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" } }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz", + "integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A==", "dev": true }, + "@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-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", @@ -194,352 +269,269 @@ } }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", + "@babel/generator": "^7.9.0", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "esutils": "^2.0.2", + "@babel/helper-validator-identifier": "^7.9.0", "lodash": "^4.17.13", "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.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "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" } }, + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", + "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", "dev": true, "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" + "@jest/source-map": "^25.1.0", + "chalk": "^3.0.0", + "jest-util": "^25.1.0", + "slash": "^3.0.0" } }, "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", + "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", + "dev": true, + "requires": { + "@jest/console": "^25.1.0", + "@jest/reporters": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", + "graceful-fs": "^4.2.3", + "jest-changed-files": "^25.1.0", + "jest-config": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-resolve-dependencies": "^25.1.0", + "jest-runner": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "jest-watcher": "^25.1.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", + "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", "dev": true, "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0" } }, "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", + "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/types": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0", + "lolex": "^5.0.0" } }, "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", + "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "jest-haste-map": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "node-notifier": "^6.0.0", + "slash": "^3.0.0", "source-map": "^0.6.0", - "string-length": "^2.0.0" + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.0.1" } }, "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", + "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", "dev": true, "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", + "graceful-fs": "^4.2.3", "source-map": "^0.6.0" } }, "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", + "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", "dev": true, "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" + "@jest/console": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", + "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", "dev": true, "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" + "@jest/test-result": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-runner": "^25.1.0", + "jest-runtime": "^25.1.0" } }, "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", + "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", + "@jest/types": "^25.1.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", + "graceful-fs": "^4.2.3", + "jest-haste-map": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-util": "^25.1.0", + "micromatch": "^4.0.2", "pirates": "^4.0.1", "realpath-native": "^1.1.0", - "slash": "^2.0.0", + "slash": "^3.0.0", "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "dependencies": { - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } + "write-file-atomic": "^3.0.0" } }, "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", + "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@polka/url": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", - "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==", - "dev": true - }, - "@snyk/cli-interface": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.3.0.tgz", - "integrity": "sha512-ecbylK5Ol2ySb/WbfPj0s0GuLQR+KWKFzUgVaoNHaSoN6371qRWwf2uVr+hPUP4gXqCai21Ug/RDArfOhlPwrQ==", - "dev": true, - "requires": { - "tslib": "^1.9.3" - } - }, - "@snyk/cocoapods-lockfile-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@snyk/cocoapods-lockfile-parser/-/cocoapods-lockfile-parser-3.0.0.tgz", - "integrity": "sha512-AebCc+v9vtOL9tFkU4/tommgVsXxqdx6t45kCkBW+FC4PaYvfYEg9Eg/9GqlY9+nFrLFo/uTr+E/aR0AF/KqYA==", - "dev": true, - "requires": { - "@snyk/dep-graph": "^1.11.0", - "@snyk/ruby-semver": "^2.0.4", - "@types/js-yaml": "^3.12.1", - "core-js": "^3.2.0", - "js-yaml": "^3.13.1", - "source-map-support": "^0.5.7", - "tslib": "^1.9.3" - } - }, - "@snyk/composer-lockfile-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@snyk/composer-lockfile-parser/-/composer-lockfile-parser-1.2.0.tgz", - "integrity": "sha512-kZT+HTqgNcQMeoE5NM9M3jj463M8zI7ZxqZXLw9WoyVs5JTt9g0qFWxIG1cNwZdGVI+y7tzZbNWw9BlMD1vCCQ==", - "dev": true, - "requires": { - "lodash": "^4.17.13" - } - }, - "@snyk/dep-graph": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/@snyk/dep-graph/-/dep-graph-1.13.1.tgz", - "integrity": "sha512-Ww2xvm5UQgrq9eV0SdTBCh+w/4oI2rCx5vn1IOSeypaR0CO4p+do1vm3IDZ2ugg4jLSfHP8+LiD6ORESZMkQ2w==", - "dev": true, - "requires": { - "graphlib": "^2.1.5", - "lodash": "^4.7.14", - "object-hash": "^1.3.1", - "semver": "^6.0.0", - "source-map-support": "^0.5.11", - "tslib": "^1.9.3" - } - }, - "@snyk/gemfile": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@snyk/gemfile/-/gemfile-1.2.0.tgz", - "integrity": "sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==", - "dev": true - }, - "@snyk/ruby-semver": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@snyk/ruby-semver/-/ruby-semver-2.0.4.tgz", - "integrity": "sha512-ceMD4CBS3qtAg+O0BUvkKdsheUNCqi+/+Rju243Ul8PsUgZnXmGiqfk/2z7DCprRQnxUTra4+IyeDQT7wAheCQ==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "@snyk/snyk-cocoapods-plugin": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@snyk/snyk-cocoapods-plugin/-/snyk-cocoapods-plugin-2.0.1.tgz", - "integrity": "sha512-XVkvaMvMzQ3miJi/YZmsRJSAUfDloYhfg6pXPgzAeAugB4p+cNi01Z68pT62ypB8U/Ugh1Xx2pb9aoOFqBbSjA==", - "dev": true, - "requires": { - "@snyk/cli-interface": "1.5.0", - "@snyk/cocoapods-lockfile-parser": "3.0.0", - "@snyk/dep-graph": "^1.13.1", - "source-map-support": "^0.5.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "@snyk/cli-interface": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-1.5.0.tgz", - "integrity": "sha512-+Qo+IO3YOXWgazlo+CKxOuWFLQQdaNCJ9cSfhFQd687/FuesaIxWdInaAdfpsLScq0c6M1ieZslXgiZELSzxbg==", - "dev": true, - "requires": { - "tslib": "^1.9.3" - } - } + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" } }, - "@types/agent-base": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/agent-base/-/agent-base-4.2.0.tgz", - "integrity": "sha512-8mrhPstU+ZX0Ugya8tl5DsDZ1I5ZwQzbL/8PA0z8Gj0k9nql7nkaMzmPVLj+l/nixWaliXi+EBiLA8bptw3z7Q==", + "@sinonjs/commons": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", "dev": true, "requires": { - "@types/events": "*", - "@types/node": "*" + "type-detect": "4.0.8" } }, "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", + "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -569,33 +561,18 @@ } }, "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", + "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, - "@types/bunyan": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.6.tgz", - "integrity": "sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/debug": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", - "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, "@types/istanbul-lib-coverage": { @@ -623,54 +600,16 @@ "@types/istanbul-lib-report": "*" } }, - "@types/js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-SGGAhXLHDx+PK4YLNcNGa6goPf9XRWQNAUUbffkwVGGXIxmDKWyGGL4inzq2sPmExu431Ekb9aEMn9BkPqEYFA==", - "dev": true - }, - "@types/node": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.5.0.tgz", - "integrity": "sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ==", - "dev": true - }, - "@types/restify": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@types/restify/-/restify-4.3.6.tgz", - "integrity": "sha512-4l4f0EXnleXQttlhRCXtTuJ8UelsKiAKIK2AAEd2epBHu41aEbM0U2z6E5tUrNwlbxz7qaNBISduGMeg+G3PaA==", - "dev": true, - "requires": { - "@types/bunyan": "*", - "@types/node": "*" - } - }, - "@types/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", - "dev": true - }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, - "@types/xml2js": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.3.tgz", - "integrity": "sha512-Pv2HGRE4gWLs31In7nsyXEH4uVVsd0HNV9i2dyASvtDIlOtSTr1eczPLDpdEuyv5LWH5LT20GIXwPjkshKWI1g==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/node": "*" - } - }, "@types/yargs": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz", - "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -682,28 +621,16 @@ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, "abab": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "acorn-globals": { @@ -717,9 +644,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true } } @@ -730,15 +657,6 @@ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, "ajv": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", @@ -751,58 +669,41 @@ "uri-js": "^4.2.2" } }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "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": { - "string-width": "^2.0.0" + "type-fest": "^0.11.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==", - "dev": true - }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true - }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -842,12 +743,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -869,30 +764,12 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "ast-types": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", - "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==", - "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 }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -918,49 +795,51 @@ "dev": true }, "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", + "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", "dev": true, "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.1.0", + "chalk": "^3.0.0", + "slash": "^3.0.0" } }, "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "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", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" + "@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": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", + "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", + "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", "dev": true, "requires": { + "@babel/plugin-syntax-bigint": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" + "babel-plugin-jest-hoist": "^25.1.0" } }, "balanced-match": { @@ -1033,125 +912,29 @@ "tweetnacl": "^0.14.3" } }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "optional": true, "requires": { - "file-uri-to-path": "1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "bl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", - "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", + "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": { - "readable-stream": "^3.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "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" - } - } - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dev": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.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" - } - } + "fill-range": "^7.0.1" } }, "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, "browser-resolve": { @@ -1186,12 +969,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1216,9 +993,9 @@ "dev": true }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "capture-exit": { @@ -1230,45 +1007,26 @@ "rsvp": "^4.8.4" } }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", - "dev": true - }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "centra": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/centra/-/centra-2.4.0.tgz", - "integrity": "sha512-AWmF3EHNe/noJHviynZOrdnUuQzT5AMgl9nJPXGvnzGXrI2ZvNDrEcdqskc4EtQwt2Q1IggXb0OXy7zZ1Xvvew==", - "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "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" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "class-utils": { @@ -1294,89 +1052,15 @@ } } }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-spinner": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", - "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", - "dev": true - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - } + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, "co": { @@ -1385,10 +1069,10 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "collect-v8-coverage": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", + "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==", "dev": true }, "collection-visit": { @@ -1402,24 +1086,18 @@ } }, "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=", - "dev": true - }, - "colorette": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", - "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==", + "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 }, "combined-stream": { @@ -1450,20 +1128,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "dev": true, - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -1479,27 +1143,12 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", - "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 }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -1511,35 +1160,29 @@ "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 - } } }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true - }, "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true }, "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", + "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", "dev": true, "requires": { - "cssom": "0.3.x" + "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==", + "dev": true + } } }, "dashdash": { @@ -1551,12 +1194,6 @@ "assert-plus": "^1.0.0" } }, - "data-uri-to-buffer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", - "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", - "dev": true - }, "data-urls": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", @@ -1566,25 +1203,12 @@ "abab": "^2.0.0", "whatwg-mimetype": "^2.2.0", "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } } }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -1602,12 +1226,6 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "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", @@ -1664,64 +1282,24 @@ } } }, - "degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", - "dev": true, - "requires": { - "ast-types": "0.x.x", - "escodegen": "1.x.x", - "esprima": "3.x.x" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "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": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", + "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", "dev": true }, - "dockerfile-ast": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/dockerfile-ast/-/dockerfile-ast-0.0.16.tgz", - "integrity": "sha512-+HZToHjjiLPl46TqBrok5dMrg5oCkZFPSROMQjRmvin0zG4FxK0DJXTpV/CUPYY2zpmEvVza55XLwSHFx/xZMw==", - "dev": true, - "requires": { - "vscode-languageserver-types": "^3.5.0" - } - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -1731,46 +1309,6 @@ "webidl-conversions": "^4.0.2" } }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotnet-deps-parser": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/dotnet-deps-parser/-/dotnet-deps-parser-4.9.0.tgz", - "integrity": "sha512-V0O+7pI7Ei+iL5Kgy6nYq1UTwzrpqci5K/zf8cXyP5RWBSQBUl/JOE9I67zLUkKiwOdfPhbMQgcRj/yGA+NL1A==", - "dev": true, - "requires": { - "@types/xml2js": "0.4.3", - "lodash": "^4.17.11", - "source-map-support": "^0.5.7", - "tslib": "^1.10.0", - "xml2js": "0.4.19" - }, - "dependencies": { - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - } - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1781,22 +1319,10 @@ "safer-buffer": "^2.1.0" } }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "dev": true - }, - "email-validator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", - "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", - "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==", + "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 }, "end-of-stream": { @@ -1808,19 +1334,10 @@ "once": "^1.4.0" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", @@ -1847,21 +1364,6 @@ "is-symbol": "^1.0.2" } }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1869,9 +1371,9 @@ "dev": true }, "escodegen": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.13.0.tgz", - "integrity": "sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", "dev": true, "requires": { "esprima": "^4.0.1", @@ -1977,17 +1479,17 @@ } }, "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", + "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" + "@jest/types": "^25.1.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-regex-util": "^25.1.0" } }, "extend": { @@ -2017,17 +1519,6 @@ } } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -2126,60 +1617,23 @@ "bser": "2.1.1" } }, - "ferrum": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ferrum/-/ferrum-1.7.0.tgz", - "integrity": "sha512-Ycr5nz/Pj7HsIqx+dZgAq27nq35bSzNzwsUbc4vFPl9PG1OgrzwDH57noH6blT7gh1XzKnqEYGrSYDU+4Vy2VA==", - "dev": true, - "requires": { - "lodash.isplainobject": "4.0.6" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, "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-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "for-in": { @@ -2188,12 +1642,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -2220,12 +1668,6 @@ "map-cache": "^0.2.2" } }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2233,653 +1675,11 @@ "dev": true }, "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": 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, - "optional": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "optional": 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" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "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, - "optional": true - }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": 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, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": 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" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "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, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.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==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - } - } - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "dev": true, - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } + "optional": true }, "function-bind": { "version": "1.1.1", @@ -2908,86 +1708,19 @@ "pump": "^3.0.0" } }, - "get-uri": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.4.tgz", - "integrity": "sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==", - "dev": true, - "requires": { - "data-uri-to-buffer": "1", - "debug": "2", - "extend": "~3.0.2", - "file-uri-to-path": "1", - "ftp": "~0.3.10", - "readable-stream": "2" - }, - "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 - } - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "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=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-up": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz", - "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^5.0.0" - } - }, - "git-url-parse": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz", - "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==", - "dev": true, - "requires": { - "git-up": "^4.0.0" - } - }, - "github-slugger": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.2.1.tgz", - "integrity": "sha512-SsZUjg/P03KPzQBt7OxJPasGw6NRO5uOgiZ5RGXVud5iSIZ0eNZeNp5rTwCxtavrRUa/A77j8mePVc5lEvk0KQ==", + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "emoji-regex": ">=6.0.0 <=6.1.1" - }, - "dependencies": { - "emoji-regex": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", - "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=", - "dev": true - } + "assert-plus": "^1.0.0" } }, "glob": { @@ -3004,73 +1737,29 @@ "path-is-absolute": "^1.0.0" } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, "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 }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - } - } - }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, - "graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true + "dev": true, + "optional": true }, "handlebars": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.2.tgz", - "integrity": "sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", + "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", "dev": true, "requires": { "neo-async": "^2.6.0", @@ -3105,9 +1794,9 @@ } }, "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 }, "has-symbols": { @@ -3137,6 +1826,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", @@ -3148,12 +1857,6 @@ } } }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", - "dev": true - }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", @@ -3164,51 +1867,11 @@ } }, "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.1.tgz", + "integrity": "sha512-hNX23TjWwD3q56HpWjUHOKj1+4KKlnjv9PcmBUYKVpga+2cnb9nDx/B1o0yO4n+RZXZdiNxzx6B24C9aNMTkkQ==", "dev": true }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "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 - } - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -3220,37 +1883,11 @@ "sshpk": "^1.7.0" } }, - "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - } - }, - "i18n": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.8.4.tgz", - "integrity": "sha512-PvMcG+yqYWXrwgdmCpL+APCGa8lRY0tdlo2cXp9UeR3u4h1bJGqFsgybfmG/MqtL1iDmdaPPPLJebXGrZ1XoMQ==", - "dev": true, - "requires": { - "debug": "*", - "make-plural": "^6.0.1", - "math-interval-parser": "^2.0.1", - "messageformat": "^2.3.0", - "mustache": "*", - "sprintf-js": "^1.1.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - } - } + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true }, "iconv-lite": { "version": "0.4.24", @@ -3261,26 +1898,14 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "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": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, "imurmurhash": { @@ -3305,52 +1930,10 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, "is-accessor-descriptor": { @@ -3373,12 +1956,6 @@ } } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -3392,12 +1969,12 @@ "dev": true }, "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "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": "^1.5.0" + "ci-info": "^2.0.0" } }, "is-data-descriptor": { @@ -3452,9 +2029,9 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "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 }, "is-generator-fn": { @@ -3463,57 +2040,12 @@ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "dev": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", - "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" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -3523,18 +2055,6 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", @@ -3544,21 +2064,6 @@ "has": "^1.0.3" } }, - "is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "dev": true - }, - "is-ssh": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz", - "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==", - "dev": true, - "requires": { - "protocols": "^1.1.0" - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3587,15 +2092,16 @@ "dev": true }, "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true, + "optional": true }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { @@ -3617,333 +2123,286 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "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 }, "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "dependencies": { - "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==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "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": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" } }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { - "html-escaper": "^2.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" } }, - "jasmine-reporters": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz", - "integrity": "sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A==", + "istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", "dev": true, "requires": { - "mkdirp": "^0.5.1", - "xmldom": "^0.1.22" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, - "jasmine-xml-reporter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jasmine-xml-reporter/-/jasmine-xml-reporter-1.2.1.tgz", - "integrity": "sha1-fKoqUYAv7+2+JLPqinrUJ8nqfbM=", + "jest": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", + "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", "dev": true, "requires": { - "jasmine-reporters": "^2.2.0" + "@jest/core": "^25.1.0", + "import-local": "^3.0.2", + "jest-cli": "^25.1.0" + }, + "dependencies": { + "jest-cli": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", + "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", + "dev": true, + "requires": { + "@jest/core": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^15.0.0" + } + } } }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "jest-changed-files": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", + "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", "dev": true, "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" + "@jest/types": "^25.1.0", + "execa": "^3.2.0", + "throat": "^5.0.0" }, "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "pump": "^3.0.0" } }, - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "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 + }, + "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": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" + "path-key": "^3.0.0" } }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "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": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "shebang-regex": "^3.0.0" } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "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 }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "isexe": "^2.0.0" } } } }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - } - }, "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", + "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", + "@jest/test-sequencer": "^25.1.0", + "@jest/types": "^25.1.0", + "babel-jest": "^25.1.0", + "chalk": "^3.0.0", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", + "jest-environment-jsdom": "^25.1.0", + "jest-environment-node": "^25.1.0", + "jest-get-type": "^25.1.0", + "jest-jasmine2": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "micromatch": "^4.0.2", + "pretty-format": "^25.1.0", "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", + "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", "dev": true, "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "chalk": "^3.0.0", + "diff-sequences": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" } }, "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", + "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", "dev": true, "requires": { - "detect-newline": "^2.1.0" + "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", + "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.1.0", + "jest-util": "^25.1.0", + "pretty-format": "^25.1.0" } }, "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", + "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", "dev": true, "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" + "@jest/environment": "^25.1.0", + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0", + "jsdom": "^15.1.1" } }, "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", + "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", "dev": true, "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" + "@jest/environment": "^25.1.0", + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0" } }, "jest-expect-message": { @@ -3953,100 +2412,100 @@ "dev": true }, "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", + "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", "dev": true }, "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", + "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", + "@jest/types": "^25.1.0", + "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.3", + "jest-serializer": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", + "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "@jest/environment": "^25.1.0", + "@jest/source-map": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^24.9.0", + "expect": "^25.1.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" + "jest-each": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "pretty-format": "^25.1.0", + "throat": "^5.0.0" } }, "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", + "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", "dev": true, "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" } }, "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", + "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "chalk": "^3.0.0", + "jest-diff": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" } }, "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", + "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", + "chalk": "^3.0.0", + "micromatch": "^4.0.2", + "slash": "^3.0.0", "stack-utils": "^1.0.1" } }, "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", + "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", "dev": true, "requires": { - "@jest/types": "^24.9.0" + "@jest/types": "^25.1.0" } }, "jest-pnp-resolver": { @@ -4056,261 +2515,178 @@ "dev": true }, "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", + "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==", "dev": true }, "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", + "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", "dev": true, "requires": { - "@jest/types": "^24.9.0", + "@jest/types": "^25.1.0", "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", + "chalk": "^3.0.0", "jest-pnp-resolver": "^1.2.1", "realpath-native": "^1.1.0" } }, "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", + "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" + "@jest/types": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-snapshot": "^25.1.0" } }, "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", + "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", + "graceful-fs": "^4.2.3", + "jest-config": "^25.1.0", + "jest-docblock": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-jasmine2": "^25.1.0", + "jest-leak-detector": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "throat": "^5.0.0" } }, "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", + "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", + "dev": true, + "requires": { + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/source-map": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", + "graceful-fs": "^4.2.3", + "jest-config": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - }, - "dependencies": { - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "string-width": { - "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": "^5.1.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - } - } + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.0.0" } }, "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", + "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==", "dev": true }, "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", + "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "expect": "^25.1.0", + "jest-diff": "^25.1.0", + "jest-get-type": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-resolve": "^25.1.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" + "pretty-format": "^25.1.0", + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + } } }, "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", + "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", "dev": true, "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "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" - } - } + "mkdirp": "^0.5.1" } }, "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", + "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", "dev": true, "requires": { - "@jest/types": "^24.9.0", + "@jest/types": "^25.1.0", "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.1.0", "leven": "^3.1.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } + "pretty-format": "^25.1.0" } }, "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", + "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", "dev": true, "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.1.0", + "string-length": "^3.1.0" } }, "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", "dev": true, "requires": { "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "supports-color": "^7.0.0" } }, "js-tokens": { @@ -4336,36 +2712,36 @@ "dev": true }, "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", "dev": true, "requires": { "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", "domexception": "^1.0.1", - "escodegen": "^1.9.1", + "escodegen": "^1.11.1", "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", + "tough-cookie": "^3.0.1", "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", "xml-name-validator": "^3.0.0" } }, @@ -4375,21 +2751,6 @@ "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-pointer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.0.tgz", - "integrity": "sha1-jlAFUKaqxUZKRzN32leqbMIoKNc=", - "dev": true, - "requires": { - "foreach": "^2.0.4" - } - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -4409,12 +2770,20 @@ "dev": true }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } } }, "jsprim": { @@ -4429,18 +2798,6 @@ "verror": "1.10.0" } }, - "jszip": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", - "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -4453,30 +2810,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "dev": true, - "requires": { - "package-json": "^4.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -4493,35 +2826,13 @@ "type-check": "~0.3.2" } }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "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": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "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": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { @@ -4530,105 +2841,38 @@ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", - "dev": true - }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "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.set": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", - "dev": true - }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", "dev": true, "requires": { - "yallist": "^3.0.2" + "@sinonjs/commons": "^1.7.0" } }, - "macos-release": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", - "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==", - "dev": true - }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", "dev": true, "requires": { - "pify": "^3.0.0" + "semver": "^6.0.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 + } } }, - "make-plural": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.0.1.tgz", - "integrity": "sha512-h0uBNi4tpDkiWUyYKrJNj8Kif6q3Ba5zp/8jnfPy3pQE+4XcTj6h3eZM5SYVUyDNX9Zk69Isr/dx0I+78aJUaQ==", - "dev": true - }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -4653,80 +2897,20 @@ "object-visit": "^1.0.0" } }, - "matchit": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/matchit/-/matchit-1.0.8.tgz", - "integrity": "sha512-CwPPICzozd/ezCzpVwGYG5bMVieaapnA0vvHDQnmQ2u2vZtVLynoPmvFsZjL67hFOvTBhhpqSR0bq3uloDP/Rw==", - "dev": true, - "requires": { - "@arr/every": "^1.0.0" - } - }, - "math-interval-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", - "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==", - "dev": true - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "messageformat": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/messageformat/-/messageformat-2.3.0.tgz", - "integrity": "sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==", - "dev": true, - "requires": { - "make-plural": "^4.3.0", - "messageformat-formatters": "^2.0.1", - "messageformat-parser": "^4.1.2" - }, - "dependencies": { - "make-plural": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-4.3.0.tgz", - "integrity": "sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "messageformat-formatters": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz", - "integrity": "sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==", - "dev": true - }, - "messageformat-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/messageformat-parser/-/messageformat-parser-4.1.2.tgz", - "integrity": "sha512-7dWuifeyldz7vhEuL96Kwq1fhZXBW+TUfbnHN4UCrCxoXQTYjHnR78eI66Gk9LaLLsAvzPNVJBaa66DRfFNaiA==", - "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-db": { @@ -4745,9 +2929,9 @@ } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { @@ -4760,9 +2944,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.3.tgz", + "integrity": "sha512-+bMdgqjMN/Z77a6NlY/I3U5LlRDbnmaAk6lDveAPKwSpcPM4tKAuYsvYF8xjhOPXhOYGe/73vVLVez5PW+jqhw==", "dev": true }, "mixin-deep": { @@ -4787,18 +2971,18 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" }, "dependencies": { "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } @@ -4809,25 +2993,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mustache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.0.0.tgz", - "integrity": "sha512-FJgjyX/IVkbXBXYUwH+OYwQKqWpFPLaLVESd70yHjSDunwzV2hZOoTBvPf4KLoxesUzzyfTH6F784Uqd7Wm5yA==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -4853,41 +3018,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nconf": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", - "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", - "dev": true, - "requires": { - "async": "^1.4.0", - "ini": "^1.3.0", - "secure-keys": "^1.0.0", - "yargs": "^3.19.0" - } - }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -4907,59 +3043,32 @@ "dev": true }, "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", "dev": true, + "optional": true, "requires": { "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", "shellwords": "^0.1.1", - "which": "^1.3.0" + "which": "^1.3.1" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "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" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true } } }, "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" - } - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "npm-run-path": { @@ -4971,12 +3080,6 @@ "path-key": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -5020,12 +3123,6 @@ } } }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", - "dev": true - }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", @@ -5088,21 +3185,12 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "mimic-fn": "^2.1.0" } }, "optimist": { @@ -5137,39 +3225,11 @@ "word-wrap": "~1.2.3" } }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "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", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true }, "p-finally": { "version": "1.0.0", @@ -5187,134 +3247,24 @@ } }, "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==", + "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.0.0" + "p-limit": "^2.2.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 - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, "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 }, - "pac-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-3.0.1.tgz", - "integrity": "sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==", - "dev": true, - "requires": { - "agent-base": "^4.2.0", - "debug": "^4.1.1", - "get-uri": "^2.0.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^3.0.0", - "pac-resolver": "^3.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "^4.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "pac-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", - "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", - "dev": true, - "requires": { - "co": "^4.6.0", - "degenerator": "^1.0.4", - "ip": "^1.1.5", - "netmask": "^1.0.6", - "thunkify": "^2.1.2" - } - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "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" - } - }, - "parse-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", - "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0" - } - }, - "parse-url": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", - "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "normalize-url": "^3.3.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" - } - }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, "pascalcase": { @@ -5324,9 +3274,9 @@ "dev": true }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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 }, "path-is-absolute": { @@ -5335,12 +3285,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -5353,40 +3297,16 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "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" - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "phin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/phin/-/phin-3.4.1.tgz", - "integrity": "sha512-NkBCNRPxeyrgaPlWx4DHTAdca3s2LkvIBiiG6RoSbykcOtW/pA/7rUP/67FPIinvbo7h+HENST/vJ17LdRNUdw==", - "dev": true, - "requires": { - "centra": "^2.2.1" - } - }, "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pirates": { @@ -5399,12 +3319,12 @@ } }, "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==", + "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": "^3.0.0" + "find-up": "^4.0.0" } }, "pn": { @@ -5413,16 +3333,6 @@ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", "dev": true }, - "polka": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/polka/-/polka-0.5.2.tgz", - "integrity": "sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==", - "dev": true, - "requires": { - "@polka/url": "^0.5.0", - "trouter": "^2.0.1" - } - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -5435,108 +3345,34 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true - }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, - "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 - } - } - }, - "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==", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.1.tgz", + "integrity": "sha512-piXGBcY1zoFOG0MvHpNE5reAGseLmaCRifQ/fmfF49BcYkInEs/naD/unxGNAeOKFA5+JxVrPyMvMlpzcd20UA==", "dev": true }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "pretty-format": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", + "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", "dev": true, "requires": { - "asap": "~2.0.3" + "@jest/types": "^25.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" } }, "prompts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", - "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", "dev": true, "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.3" - } - }, - "protocols": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz", - "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==", - "dev": true - }, - "proxy-agent": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.1.1.tgz", - "integrity": "sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==", - "dev": true, - "requires": { - "agent-base": "^4.2.0", - "debug": "4", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^3.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^3.0.1", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^4.0.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } + "sisteransi": "^1.0.4" } }, - "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", @@ -5565,98 +3401,12 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "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" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "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" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "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" - } - } - } - }, - "readdirp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", - "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", - "dev": true, - "requires": { - "picomatch": "^2.0.7" - } - }, "realpath-native": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", @@ -5676,25 +3426,6 @@ "safe-regex": "^1.1.0" } }, - "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "dev": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "^1.0.1" - } - }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -5714,9 +3445,9 @@ "dev": true }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -5726,7 +3457,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -5736,25 +3467,19 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" } } } @@ -5777,6 +3502,18 @@ "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "require-directory": { @@ -5792,27 +3529,27 @@ "dev": true }, "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "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": "^3.0.0" + "resolve-from": "^5.0.0" } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-url": { @@ -5821,16 +3558,6 @@ "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", @@ -5838,9 +3565,9 @@ "dev": true }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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" @@ -5852,24 +3579,6 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -5885,76 +3594,174 @@ "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==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "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": { + "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" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", "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" + "xmlchars": "^2.1.1" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "secure-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", - "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=", - "dev": true - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dev": true, - "requires": { - "semver": "^5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -5978,12 +3785,6 @@ } } }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -6003,7 +3804,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true + "dev": true, + "optional": true }, "signal-exit": { "version": "3.0.2", @@ -6012,21 +3814,15 @@ "dev": true }, "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "snapdragon": { @@ -6157,475 +3953,6 @@ } } }, - "snyk": { - "version": "1.280.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.280.0.tgz", - "integrity": "sha512-tlatfeEg3S40V6ETGsWAHtu5XLDlsZ/Dr2rPEzcyOEa0zjmcZ4/GpLyrJSbOptkx0XYPK2bRO6yCXfP4+R5RBQ==", - "dev": true, - "requires": { - "@snyk/cli-interface": "2.3.0", - "@snyk/dep-graph": "1.13.1", - "@snyk/gemfile": "1.2.0", - "@snyk/snyk-cocoapods-plugin": "2.0.1", - "@types/agent-base": "^4.2.0", - "@types/restify": "^4.3.6", - "abbrev": "^1.1.1", - "ansi-escapes": "3.2.0", - "chalk": "^2.4.2", - "cli-spinner": "0.2.10", - "configstore": "^3.1.2", - "debug": "^3.1.0", - "diff": "^4.0.1", - "git-url-parse": "11.1.2", - "glob": "^7.1.3", - "inquirer": "^6.2.2", - "lodash": "^4.17.14", - "needle": "^2.2.4", - "opn": "^5.5.0", - "os-name": "^3.0.0", - "proxy-agent": "^3.1.1", - "proxy-from-env": "^1.0.0", - "semver": "^6.0.0", - "snyk-config": "^2.2.1", - "snyk-docker-plugin": "1.33.1", - "snyk-go-plugin": "1.11.1", - "snyk-gradle-plugin": "3.2.4", - "snyk-module": "1.9.1", - "snyk-mvn-plugin": "2.7.0", - "snyk-nodejs-lockfile-parser": "1.17.0", - "snyk-nuget-plugin": "1.16.0", - "snyk-php-plugin": "1.7.0", - "snyk-policy": "1.13.5", - "snyk-python-plugin": "1.16.0", - "snyk-resolve": "1.0.1", - "snyk-resolve-deps": "4.4.0", - "snyk-sbt-plugin": "2.11.0", - "snyk-tree": "^1.0.0", - "snyk-try-require": "1.3.1", - "source-map-support": "^0.5.11", - "strip-ansi": "^5.2.0", - "tempfile": "^2.0.0", - "then-fs": "^2.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.3.2", - "wrap-ansi": "^5.1.0" - } - }, - "snyk-config": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-2.2.3.tgz", - "integrity": "sha512-9NjxHVMd1U1LFw66Lya4LXgrsFUiuRiL4opxfTFo0LmMNzUoU5Bk/p0zDdg3FE5Wg61r4fP2D8w+QTl6M8CGiw==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "lodash": "^4.17.15", - "nconf": "^0.10.0" - } - }, - "snyk-docker-plugin": { - "version": "1.33.1", - "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-1.33.1.tgz", - "integrity": "sha512-xfs3DN1tPMTh6J8x2341wGK4HRr+pI5+i/YRuRmsslnBnwk/DkKYcbt8zOIWk6kzMoW8vo+9LqqXBQO/24szKg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "dockerfile-ast": "0.0.16", - "semver": "^6.1.0", - "tar-stream": "^2.1.0", - "tslib": "^1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-go-parser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/snyk-go-parser/-/snyk-go-parser-1.3.1.tgz", - "integrity": "sha512-jrFRfIk6yGHFeipGD66WV9ei/A/w/lIiGqI80w1ndMbg6D6M5pVNbK7ngDTmo4GdHrZDYqx/VBGBsUm2bol3Rg==", - "dev": true, - "requires": { - "toml": "^3.0.0", - "tslib": "^1.9.3" - } - }, - "snyk-go-plugin": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/snyk-go-plugin/-/snyk-go-plugin-1.11.1.tgz", - "integrity": "sha512-IsNi7TmpHoRHzONOWJTT8+VYozQJnaJpKgnYNQjzNm2JlV8bDGbdGQ1a8LcEoChxnJ8v8aMZy7GTiQyGGABtEQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "graphlib": "^2.1.1", - "snyk-go-parser": "1.3.1", - "tmp": "0.0.33", - "tslib": "^1.10.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-gradle-plugin": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/snyk-gradle-plugin/-/snyk-gradle-plugin-3.2.4.tgz", - "integrity": "sha512-XmS1gl7uZNHP9HP5RaPuRXW3VjkbdWe+EgSOlvmspztkubIOIainqc87k7rIJ6u3tLBhqsZK8b5ru0/E9Q69hQ==", - "dev": true, - "requires": { - "@snyk/cli-interface": "2.3.0", - "@types/debug": "^4.1.4", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "tmp": "0.0.33", - "tslib": "^1.9.3" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "snyk-module": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.9.1.tgz", - "integrity": "sha512-A+CCyBSa4IKok5uEhqT+hV/35RO6APFNLqk9DRRHg7xW2/j//nPX8wTSZUPF8QeRNEk/sX+6df7M1y6PBHGSHA==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "hosted-git-info": "^2.7.1" - } - }, - "snyk-mvn-plugin": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.7.0.tgz", - "integrity": "sha512-DLBt+6ZvtoleXE7Si3wAa6gdPSWsXdIQEY6m2zW2InN9WiaRwIEKMCY822eFmRPZVNNmZNRUIeQsoHZwv/slqQ==", - "dev": true, - "requires": { - "@snyk/cli-interface": "2.2.0", - "debug": "^4.1.1", - "lodash": "^4.17.15", - "needle": "^2.4.0", - "tmp": "^0.1.0", - "tslib": "1.9.3" - }, - "dependencies": { - "@snyk/cli-interface": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.2.0.tgz", - "integrity": "sha512-sA7V2JhgqJB9z5uYotgQc5iNDv//y+Mdm39rANxmFjtZMSYJZHkP80arzPjw1mB5ni/sWec7ieYUUFeySZBfVg==", - "dev": true, - "requires": { - "tslib": "^1.9.3" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "dev": true, - "requires": { - "rimraf": "^2.6.3" - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - } - } - }, - "snyk-nodejs-lockfile-parser": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/snyk-nodejs-lockfile-parser/-/snyk-nodejs-lockfile-parser-1.17.0.tgz", - "integrity": "sha512-i4GAYFj9TJLOQ8F+FbIJuJWdGymi8w/XcrEX0FzXk7DpYUCY3mWibyKhw8RasfYBx5vLwUzEvRMaQuc2EwlyfA==", - "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.0.2", - "graphlib": "^2.1.5", - "lodash": "^4.17.14", - "p-map": "2.1.0", - "source-map-support": "^0.5.7", - "tslib": "^1.9.3", - "uuid": "^3.3.2" - } - }, - "snyk-nuget-plugin": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/snyk-nuget-plugin/-/snyk-nuget-plugin-1.16.0.tgz", - "integrity": "sha512-OEusK3JKKpR4Yto5KwuqjQGgb9wAhmDqBWSQomWdtKQVFrzn5B6BMzOFikUzmeMTnUGGON7gurQBLXeZZLhRqg==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "dotnet-deps-parser": "4.9.0", - "jszip": "^3.1.5", - "lodash": "^4.17.14", - "snyk-paket-parser": "1.5.0", - "tslib": "^1.9.3", - "xml2js": "^0.4.17" - } - }, - "snyk-paket-parser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/snyk-paket-parser/-/snyk-paket-parser-1.5.0.tgz", - "integrity": "sha512-1CYMPChJ9D9LBy3NLqHyv8TY7pR/LMISSr08LhfFw/FpfRZ+gTH8W6bbxCmybAYrOFNCqZkRprqOYDqZQFHipA==", - "dev": true, - "requires": { - "tslib": "^1.9.3" - } - }, - "snyk-php-plugin": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/snyk-php-plugin/-/snyk-php-plugin-1.7.0.tgz", - "integrity": "sha512-mDe90xkqSEVrpx1ZC7ItqCOc6fZCySbE+pHVI+dAPUmf1C1LSWZrZVmAVeo/Dw9sJzJfzmcdAFQl+jZP8/uV0A==", - "dev": true, - "requires": { - "@snyk/cli-interface": "2.2.0", - "@snyk/composer-lockfile-parser": "1.2.0", - "tslib": "1.9.3" - }, - "dependencies": { - "@snyk/cli-interface": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@snyk/cli-interface/-/cli-interface-2.2.0.tgz", - "integrity": "sha512-sA7V2JhgqJB9z5uYotgQc5iNDv//y+Mdm39rANxmFjtZMSYJZHkP80arzPjw1mB5ni/sWec7ieYUUFeySZBfVg==", - "dev": true, - "requires": { - "tslib": "^1.9.3" - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - } - } - }, - "snyk-policy": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.13.5.tgz", - "integrity": "sha512-KI6GHt+Oj4fYKiCp7duhseUj5YhyL/zJOrrJg0u6r59Ux9w8gmkUYT92FHW27ihwuT6IPzdGNEuy06Yv2C9WaQ==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "email-validator": "^2.0.4", - "js-yaml": "^3.13.1", - "lodash.clonedeep": "^4.5.0", - "semver": "^6.0.0", - "snyk-module": "^1.9.1", - "snyk-resolve": "^1.0.1", - "snyk-try-require": "^1.3.1", - "then-fs": "^2.0.0" - } - }, - "snyk-python-plugin": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.16.0.tgz", - "integrity": "sha512-IA53xOcy1s881tbIrIXNqIuCNozd4PAVWN8oF0xgRn2NQbq0e7EWt7kFPJbmZodpLCDpXaKKqV2MHbXruFIsrw==", - "dev": true, - "requires": { - "@snyk/cli-interface": "^2.0.3", - "tmp": "0.0.33" - } - }, - "snyk-resolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.0.1.tgz", - "integrity": "sha512-7+i+LLhtBo1Pkth01xv+RYJU8a67zmJ8WFFPvSxyCjdlKIcsps4hPQFebhz+0gC5rMemlaeIV6cqwqUf9PEDpw==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "then-fs": "^2.0.0" - } - }, - "snyk-resolve-deps": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-4.4.0.tgz", - "integrity": "sha512-aFPtN8WLqIk4E1ulMyzvV5reY1Iksz+3oPnUVib1jKdyTHymmOIYF7z8QZ4UUr52UsgmrD9EA/dq7jpytwFoOQ==", - "dev": true, - "requires": { - "@types/node": "^6.14.4", - "@types/semver": "^5.5.0", - "ansicolors": "^0.3.2", - "debug": "^3.2.5", - "lodash.assign": "^4.2.0", - "lodash.assignin": "^4.2.0", - "lodash.clone": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.set": "^4.3.2", - "lru-cache": "^4.0.0", - "semver": "^5.5.1", - "snyk-module": "^1.6.0", - "snyk-resolve": "^1.0.0", - "snyk-tree": "^1.0.0", - "snyk-try-require": "^1.1.1", - "then-fs": "^2.0.0" - }, - "dependencies": { - "@types/node": { - "version": "6.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.9.tgz", - "integrity": "sha512-leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "snyk-sbt-plugin": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/snyk-sbt-plugin/-/snyk-sbt-plugin-2.11.0.tgz", - "integrity": "sha512-wUqHLAa3MzV6sVO+05MnV+lwc+T6o87FZZaY+43tQPytBI2Wq23O3j4POREM4fa2iFfiQJoEYD6c7xmhiEUsSA==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "semver": "^6.1.2", - "tmp": "^0.1.0", - "tree-kill": "^1.2.2", - "tslib": "^1.10.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", - "dev": true, - "requires": { - "rimraf": "^2.6.3" - } - } - } - }, - "snyk-tree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz", - "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=", - "dev": true, - "requires": { - "archy": "^1.0.0" - } - }, - "snyk-try-require": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.3.1.tgz", - "integrity": "sha1-bgJvkuZK9/zM6h7lPVJIQeQYohI=", - "dev": true, - "requires": { - "debug": "^3.1.0", - "lodash.clonedeep": "^4.3.0", - "lru-cache": "^4.0.0", - "then-fs": "^2.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "dev": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "dev": true, - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6661,38 +3988,6 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -6750,13 +4045,7 @@ "is-descriptor": "^0.1.0" } } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + } }, "stealthy-require": { "version": "1.1.1", @@ -6765,45 +4054,41 @@ "dev": true }, "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", "dev": true, "requires": { "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.2.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 + }, "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-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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": { - "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" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "string.prototype.trimleft": { @@ -6826,33 +4111,19 @@ "function-bind": "^1.1.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 - }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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": "^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 - } + "ansi-regex": "^5.0.0" } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "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-eof": { @@ -6861,197 +4132,64 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "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.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "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==", - "dev": true - }, - "tar-stream": { + "supports-hyperlinks": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", - "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", "dev": true, "requires": { - "bl": "^3.0.0", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "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" - } - } + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" } }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "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==", "dev": true }, - "tempfile": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", - "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", - "dev": true, - "requires": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "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": { - "execa": "^0.7.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" } }, "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "then-fs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", - "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", + "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": { - "promise": ">=3.2 <8" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", - "dev": true - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -7097,33 +4235,21 @@ } }, "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" } }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", - "dev": true - }, "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", "dev": true, "requires": { + "ip-regex": "^2.1.0", "psl": "^1.1.28", "punycode": "^2.1.1" } @@ -7137,27 +4263,6 @@ "punycode": "^2.1.0" } }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "trouter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/trouter/-/trouter-2.0.1.tgz", - "integrity": "sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==", - "dev": true, - "requires": { - "matchit": "^1.0.0" - } - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -7182,10 +4287,31 @@ "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.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "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" + } + }, "uglify-js": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.6.tgz", - "integrity": "sha512-yYqjArOYSxvqeeiYH2VGjZOqq6SVmhxzaPjJC1W2F9e+bqvFL9QXQ2osQuKUFjM2hGjKG2YclQnRKWQSt/nOTQ==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", + "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", "dev": true, "optional": true, "requires": { @@ -7205,21 +4331,6 @@ "set-value": "^2.0.1" } }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -7257,39 +4368,9 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true } } }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dev": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -7305,27 +4386,12 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", @@ -7344,20 +4410,23 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=", - "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", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "v8-to-istanbul": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz", + "integrity": "sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "@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 + } } }, "verror": { @@ -7371,19 +4440,24 @@ "extsprintf": "^1.2.0" } }, - "vscode-languageserver-types": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz", - "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==", - "dev": true - }, "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", "dev": true, "requires": { - "browser-process-hrtime": "^0.1.2" + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" } }, "walker": { @@ -7417,9 +4491,9 @@ "dev": true }, "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -7442,30 +4516,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "requires": { - "string-width": "^2.1.1" - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "windows-release": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", - "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", - "dev": true, - "requires": { - "execa": "^1.0.0" - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -7479,27 +4529,14 @@ "dev": true }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "string-width": { - "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": "^5.1.0" - } - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { @@ -7509,29 +4546,21 @@ "dev": true }, "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "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": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", "dev": true }, "xml-name-validator": { @@ -7540,122 +4569,45 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "dependencies": { - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - } - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true - }, - "xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", - "dev": true - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", + "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } } } } diff --git a/package.json b/package.json index bdb767d5..23069709 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,9 @@ "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", "main": "index.js", "scripts": { - "prepare": "jsonschema2md -d manifest.schema.json -o . -n && mv manifest.schema.md MANIFEST.md && echo '' >> manifest.schema.json", "test": "jest", "prettier:check": "prettier --list-different \"./**/*.{js,json}\"", + "prettier:write": "prettier --write \"./**/*.{js,json}\"", "preview": "node preview.js", "curl": "node preview.js --curl" }, @@ -26,17 +26,11 @@ }, "homepage": "https://github.com/launchdarkly/ld-integrations#readme", "devDependencies": { - "@adobe/jsonschema2md": "3.3.1", "ajv": "^6.10.2", - "handlebars": "4.7.2", - "jest": "24.9.0", + "handlebars": "4.7.3", + "jest": "25.1.0", "jest-expect-message": "1.0.2", - "lodash": "^4.17.15" - }, - "prettier": { - "trailingComma": "es5", - "tabWidth": 2, - "semi": true, - "singleQuote": true + "lodash": "^4.17.15", + "prettier": "^2.0.1" } } diff --git a/preview.js b/preview.js index 3fc4055b..b6b68743 100644 --- a/preview.js +++ b/preview.js @@ -91,8 +91,9 @@ if (endpoint) { process.exit(1); } - const path = `./integrations/${integrationName}/${flagTemplatePath || - defaultTemplatePath}`; + const path = `./integrations/${integrationName}/${ + flagTemplatePath || defaultTemplatePath + }`; const headers = endpoint.headers.map(header => { const headerTemplate = Handlebars.compile(header.value, { strict: true, From 1107c06d3316d93d0b9b15f7e124d49417190741 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 23 Mar 2020 11:22:35 +0000 Subject: [PATCH 213/936] Add a bunch of sample context (#40) Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> --- __tests__/validate.js | 104 ++++++++++++------ preview.js | 4 +- sample-context/environment/create.json | 82 ++++++++++++++ sample-context/environment/delete.json | 82 ++++++++++++++ sample-context/environment/update.json | 82 ++++++++++++++ .../flag-update.client-side-sdk.json | 91 --------------- sample-context/flag/archive.json | 83 ++++++++++++++ sample-context/flag/copy.json | 83 ++++++++++++++ sample-context/flag/create.json | 82 ++++++++++++++ .../flag/targeting-rule-update.json | 83 ++++++++++++++ .../toggle.json} | 30 ++--- .../flag/update-all-environments.json | 93 ++++++++++++++++ sample-context/other/metric.create.json | 74 +++++++++++++ sample-context/other/segment.create.json | 74 +++++++++++++ sample-context/other/segment.update.json | 75 +++++++++++++ sample-context/other/webhook.enable.json | 81 ++++++++++++++ sample-context/project/create.json | 82 ++++++++++++++ sample-context/project/delete.json | 82 ++++++++++++++ sample-context/project/update.json | 82 ++++++++++++++ 19 files changed, 1309 insertions(+), 140 deletions(-) create mode 100644 sample-context/environment/create.json create mode 100644 sample-context/environment/delete.json create mode 100644 sample-context/environment/update.json delete mode 100644 sample-context/flag-update.client-side-sdk.json create mode 100644 sample-context/flag/archive.json create mode 100644 sample-context/flag/copy.json create mode 100644 sample-context/flag/create.json create mode 100644 sample-context/flag/targeting-rule-update.json rename sample-context/{flag-update.toggle.json => flag/toggle.json} (55%) create mode 100644 sample-context/flag/update-all-environments.json create mode 100644 sample-context/other/metric.create.json create mode 100644 sample-context/other/segment.create.json create mode 100644 sample-context/other/segment.update.json create mode 100644 sample-context/other/webhook.enable.json create mode 100644 sample-context/project/create.json create mode 100644 sample-context/project/delete.json create mode 100644 sample-context/project/update.json diff --git a/__tests__/validate.js b/__tests__/validate.js index 93a0b666..31f9492b 100644 --- a/__tests__/validate.js +++ b/__tests__/validate.js @@ -6,7 +6,9 @@ const _ = require('lodash'); const { registerHelpers } = require('../helpers'); const jsonEscape = require('../utils/json-escape'); const schema = require('../manifest.schema.json'); -const flagUpdateContext = require('../sample-context/flag-update.client-side-sdk'); +const flagContext = require('../sample-context/flag/update-all-environments'); +const projectContext = require('../sample-context/project/update'); +const environmentContext = require('../sample-context/environment/update'); registerHelpers(); @@ -53,6 +55,24 @@ integrationDirs.forEach(dir => { manifests.push([dir, manifest]); }); +const getTemplate = path => { + const templateString = readFileSync(path, { encoding: 'utf-8' }); + const template = Handlebars.compile(templateString, { + strict: true, + }); + return template; +}; + +const getFullContext = (manifest, context, isJSON) => { + const formVariables = _.get(manifest, 'formVariables', null); + const formVariableContext = getFormVariableContext(formVariables); + const fullContext = isJSON + ? jsonEscape(Object.assign({}, context)) + : Object.assign({}, context); + fullContext.formVariables = formVariableContext; + return fullContext; +}; + describe('All integrations', () => { test.each(manifests)('Validate %s/manifest.json', (key, manifest) => { const res = validate(manifest); @@ -80,7 +100,7 @@ describe('All integrations', () => { ); if (endpoint) { const endpointContext = getFormVariableContext(formVariables); - endpointContext.context = flagUpdateContext; + endpointContext.context = flagContext; const urlTemplate = Handlebars.compile(endpoint.url, { strict: true, }); @@ -145,40 +165,66 @@ describe('All integrations', () => { if (flagTemplatePath) { const path = `./integrations/${key}/${flagTemplatePath}`; expect(existsSync(path)).toBe(true); - const templateString = readFileSync(path, { encoding: 'utf-8' }); - const flagTemplate = Handlebars.compile(templateString, { - strict: true, - }); - const formVariables = _.get(manifest, 'formVariables', null); - const formVariableContext = getFormVariableContext(formVariables); + const template = getTemplate(path); const isJSON = isJSONTemplate(flagTemplatePath); - const fullContext = isJSON - ? jsonEscape(Object.assign({}, flagUpdateContext)) - : Object.assign({}, flagUpdateContext); - fullContext.formVariables = formVariableContext; + const fullContext = getFullContext(manifest, flagContext, isJSON); expect( - () => flagTemplate(fullContext), + () => template(fullContext), `${key}: flag template must render successfully` ).not.toThrow(); // Validate json templates render to valid json if (isJSON) { - const rendered = flagTemplate(fullContext); + const rendered = template(fullContext); expect( () => JSON.parse(rendered), - `.json templates must render valid JSON\n${rendered}` + `${key} .json templates must render valid JSON\n${rendered}` ).not.toThrow(); } } if (projectTemplatePath) { - expect(existsSync(`./integrations/${key}/${projectTemplatePath}`)).toBe( - true - ); + const path = `./integrations/${key}/${projectTemplatePath}`; + expect(existsSync(path)).toBe(true); + + const template = getTemplate(path); + const isJSON = isJSONTemplate(projectTemplatePath); + const fullContext = getFullContext(manifest, projectContext, isJSON); + expect( + () => template(fullContext), + `${key}: project template must render successfully` + ).not.toThrow(); + // Validate json templates render to valid json + if (isJSON) { + const rendered = template(fullContext); + expect( + () => JSON.parse(rendered), + `${key} project .json templates must render valid JSON\n${rendered}` + ).not.toThrow(); + } } if (environmentTemplatePath) { + const path = `./integrations/${key}/${environmentTemplatePath}`; + expect(existsSync(path)).toBe(true); + + const template = getTemplate(path); + const isJSON = isJSONTemplate(environmentTemplatePath); + const fullContext = getFullContext( + manifest, + environmentContext, + isJSON + ); expect( - existsSync(`./integrations/${key}/${environmentTemplatePath}`) - ).toBe(true); + () => template(fullContext), + `${key}: environment template must render successfully` + ).not.toThrow(); + // Validate json templates render to valid json + if (isJSON) { + const rendered = template(fullContext); + expect( + () => JSON.parse(rendered), + `${key} environment .json templates must render valid JSON\n${rendered}` + ).not.toThrow(); + } } if (defaultTemplatePath) { expect(existsSync(`./integrations/${key}/${defaultTemplatePath}`)).toBe( @@ -186,28 +232,20 @@ describe('All integrations', () => { ); const path = `./integrations/${key}/${defaultTemplatePath}`; expect(existsSync(path)).toBe(true); - const templateString = readFileSync(path, { encoding: 'utf-8' }); - const flagTemplate = Handlebars.compile(templateString, { - strict: true, - }); - const formVariables = _.get(manifest, 'formVariables', null); - const formVariableContext = getFormVariableContext(formVariables); + const template = getTemplate(path); const isJSON = isJSONTemplate(flagTemplatePath); - const fullContext = isJSON - ? jsonEscape(Object.assign({}, flagUpdateContext)) - : Object.assign({}, flagUpdateContext); - fullContext.formVariables = formVariableContext; + const fullContext = getFullContext(manifest, flagContext, isJSON); expect( - () => flagTemplate(fullContext), + () => template(fullContext), `${key}: default template must render successfully` ).not.toThrow(); // Validate json templates render to valid json if (isJSON) { - const rendered = flagTemplate(fullContext); + const rendered = template(fullContext); expect( () => JSON.parse(rendered), - `.json templates must render valid JSON\n${rendered}` + `${key} default .json templates must render valid JSON\n${rendered}` ).not.toThrow(); } } diff --git a/preview.js b/preview.js index b6b68743..15e5ffe8 100644 --- a/preview.js +++ b/preview.js @@ -5,8 +5,8 @@ const _ = require('lodash'); const { registerHelpers } = require('./helpers'); const jsonEscape = require('./utils/json-escape'); -const testFileName = 'flag-update.client-side-sdk.json'; -const flagUpdateContext = require(`./sample-context/${testFileName}`); +const testFileName = 'update-all-environments.json'; +const flagUpdateContext = require(`./sample-context/flag/${testFileName}`); // Update the context to have a more recent timestamp. This is important // because some third-party services reject event payloads which are diff --git a/sample-context/environment/create.json b/sample-context/environment/create.json new file mode 100644 index 00000000..075dd46b --- /dev/null +++ b/sample-context/environment/create.json @@ -0,0 +1,82 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/default/environments/local-dev", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c48806121dba45ba0f2f", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c48806121dba45ba0f2f", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580778632128, + "seconds": 1580778632 + }, + "kind": "environment", + "name": "Local dev", + "details": { + "plainText": "", + "markdown": "", + "html": "" + }, + "project": { + "name": "The big project", + "key": "default", + "tags": ["demo"], + "environment": { + "name": "", + "key": "local-dev", + "tags": [] + } + }, + "key": "local-dev", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "created the environment", + "verbKind": "createEnvironment", + "title": { + "plainText": "Henrietta Powell created the environment Local dev", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) created the environment [Local dev](https://app.launchdarkly.com/settings/projects)", + "html": "Henrietta Powell created the environment Local dev" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/default/environments/local-dev", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "name": "Local dev" + } +} diff --git a/sample-context/environment/delete.json b/sample-context/environment/delete.json new file mode 100644 index 00000000..5201a221 --- /dev/null +++ b/sample-context/environment/delete.json @@ -0,0 +1,82 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/default/environments/local-dev", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c57606121dba45ba0f43", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c57606121dba45ba0f43", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580778870198, + "seconds": 1580778870 + }, + "kind": "environment", + "name": "Local dev", + "details": { + "plainText": "", + "markdown": "", + "html": "" + }, + "project": { + "name": "The big project", + "key": "default", + "tags": ["demo"], + "environment": { + "name": "Local dev", + "key": "local-dev", + "tags": ["demo"] + } + }, + "key": "local-dev", + "tags": ["demo"], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "deleted the environment", + "verbKind": "deleteEnvironment", + "title": { + "plainText": "Henrietta Powell deleted the environment Local dev", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) deleted the environment Local dev", + "html": "Henrietta Powell deleted the environment Local dev" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/default/environments/local-dev", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "name": "Local dev" + } +} diff --git a/sample-context/environment/update.json b/sample-context/environment/update.json new file mode 100644 index 00000000..6c194c17 --- /dev/null +++ b/sample-context/environment/update.json @@ -0,0 +1,82 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/default/environments/local-dev", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c50906121dba45ba0f42", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c50906121dba45ba0f42", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580778761928, + "seconds": 1580778761 + }, + "kind": "environment", + "name": "Local dev", + "details": { + "plainText": "Changed the color from '#5e00ff' to '#342749'\nAdded tag 'demo'", + "markdown": "* Changed the color from ~~`#5e00ff`~~ to `#342749`\n\n* Added tag `demo`\n", + "html": "
  • Changed the color from #5e00ff to #342749
\n
  • Added tag demo
" + }, + "project": { + "name": "The big project", + "key": "default", + "tags": ["demo"], + "environment": { + "name": "Local dev", + "key": "local-dev", + "tags": [] + } + }, + "key": "local-dev", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "updated the environment", + "verbKind": "updateTags", + "title": { + "plainText": "Henrietta Powell updated the environment Local dev", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the environment [Local dev](https://app.launchdarkly.com/settings/projects)", + "html": "Henrietta Powell updated the environment Local dev" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/default/environments/local-dev", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "name": "Local dev" + } +} diff --git a/sample-context/flag-update.client-side-sdk.json b/sample-context/flag-update.client-side-sdk.json deleted file mode 100644 index 9b11a9fd..00000000 --- a/sample-context/flag-update.client-side-sdk.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "_links": { - "canonical": { - "href": "/api/v2/flags/default/a-new-flag", - "type": "application/json" - }, - "parent": { - "href": "/api/v2/auditlog", - "type": "application/json" - }, - "self": { - "href": "/api/v2/auditlog/5e33891d06121d53a82ad9f7", - "type": "application/json" - }, - "site": { - "href": "/default/~/features/a-new-flag", - "type": "text/html" - } - }, - "_id": "5e33891d06121d53a82ad9f7", - "_accountId": "569f514156e003339cfd3917", - "timestamp": { - "milliseconds": 1580435741366, - "seconds": 1580435741 - }, - "kind": "flag", - "name": "A new flag", - "details": { - "plainText": "Changed the flag to be available to client-side SDKs", - "markdown": "* Changed the flag to be available to client\\-side SDKs\n", - "html": "
  • Changed the flag to be available to client-side SDKs
" - }, - "comment": "Making it available to the front end.", - "project": { - "name": "The big project", - "key": "default", - "tags": [], - "environment": { - "name": "Test", - "key": "test", - "tags": [] - } - }, - "key": "a-new-flag", - "tags": [], - "customProperties": { - "dynatrace": { - "name": "Dynatrace", - "values": ["test1", "test2"] - }, - "jira": { - "name": "Jira", - "values": ["thing1", "thing2"] - } - }, - "member": { - "_links": { - "parent": { - "href": "/api/v2/members", - "type": "application/json" - }, - "self": { - "href": "/api/v2/members/569f514183f2164430000002", - "type": "application/json" - } - }, - "_id": "569f514183f2164430000002", - "email": "testing@launchdarkly.com", - "firstName": "Henrietta", - "lastName": "Powell" - }, - "titleVerb": "updated the flag", - "title": { - "plainText": "Henrietta Powell updated the flag A new flag", - "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [A new flag](http://localhost/default/~/features/a-new-flag)", - "html": "Henrietta Powell updated the flag A new flag" - }, - "target": { - "_links": { - "canonical": { - "href": "/api/v2/flags/default/a-new-flag", - "type": "application/json" - }, - "site": { - "href": "/default/~/features/a-new-flag", - "type": "text/html" - } - }, - "name": "A new flag" - } -} diff --git a/sample-context/flag/archive.json b/sample-context/flag/archive.json new file mode 100644 index 00000000..f0dacc7e --- /dev/null +++ b/sample-context/flag/archive.json @@ -0,0 +1,83 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/flags/default/a-brand-new-flag", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c29606121dba45ba0f24", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/~/features/a-brand-new-flag", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c29606121dba45ba0f24", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580778134028, + "seconds": 1580778134 + }, + "kind": "flag", + "name": "A brand new flag", + "details": { + "plainText": "", + "markdown": "", + "html": "" + }, + "comment": "Archiving this one", + "project": { + "name": "The big project", + "key": "default", + "tags": [], + "environment": { + "name": "All environments", + "key": "~", + "tags": [] + } + }, + "key": "a-brand-new-flag", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "archived the flag", + "verbKind": "updateArchived", + "title": { + "plainText": "Henrietta Powell archived the flag A brand new flag", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) archived the flag [A brand new flag](https://app.launchdarkly.com/default/~/features/a-brand-new-flag)", + "html": "Henrietta Powell archived the flag A brand new flag" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/flags/default/a-brand-new-flag", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/~/features/a-brand-new-flag", + "type": "text/html" + } + }, + "name": "A brand new flag" + } +} diff --git a/sample-context/flag/copy.json b/sample-context/flag/copy.json new file mode 100644 index 00000000..e6f99059 --- /dev/null +++ b/sample-context/flag/copy.json @@ -0,0 +1,83 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/flags/default/demo-flag", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c2ff06121dba45ba0f25", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/~/features/demo-flag", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c2ff06121dba45ba0f25", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580778239748, + "seconds": 1580778239 + }, + "kind": "flag", + "name": "Demo flag", + "details": { + "plainText": "Copied flag settings from Production to Test\nRemoved 'Ushki' from the variation 'true'\nAdded the rule \n If 'email' ends with '.edu'\n serve '43%' 'true'\n\nRemoved the rule \n If 'email' ends with '.edu'\n serve '50%' 'true'\n", + "markdown": "## Copied flag settings from Production to Test ##\n* Removed ~~`Ushki`~~ from the variation `true`\n* Added the rule \n > **If** `email` **ends with** `.edu` \n **serve** `43%` `true`\n \n \n* Removed the rule \n > **If** `email` **ends with** `.edu` \n **serve** `50%` `true`\n \n \n", + "html": "

Copied flag settings from Production to Test

\n
  • Removed Ushki from the variation true
  • \n
  • Added the rule
    If email ends with .edu
    serve 43% true
  • \n
  • Removed the rule
    If email ends with .edu
    serve 50% true
" + }, + "comment": "Copy test", + "project": { + "name": "The big project", + "key": "default", + "tags": [], + "environment": { + "name": "Test", + "key": "test", + "tags": [] + } + }, + "key": "demo-flag", + "tags": ["demo"], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "updated the flag", + "verbKind": "copyFlagConfigTo", + "title": { + "plainText": "Henrietta Powell updated the flag Demo flag", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [Demo flag](https://app.launchdarkly.com/default/~/features/demo-flag)", + "html": "Henrietta Powell updated the flag Demo flag" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/flags/default/demo-flag", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/~/features/demo-flag", + "type": "text/html" + } + }, + "name": "Demo flag" + } +} diff --git a/sample-context/flag/create.json b/sample-context/flag/create.json new file mode 100644 index 00000000..d06597cb --- /dev/null +++ b/sample-context/flag/create.json @@ -0,0 +1,82 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/flags/default/a-brand-new-flag", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c1f006121d8aaf15392d", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/~/features/a-brand-new-flag", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c1f006121d8aaf15392d", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580777968396, + "seconds": 1580777968 + }, + "kind": "flag", + "name": "A brand new flag", + "details": { + "plainText": "", + "markdown": "", + "html": "" + }, + "project": { + "name": "The big project", + "key": "default", + "tags": [], + "environment": { + "name": "All environments", + "key": "~", + "tags": [] + } + }, + "key": "a-brand-new-flag", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "created the flag", + "verbKind": "createFlag", + "title": { + "plainText": "Henrietta Powell created the flag A brand new flag", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) created the flag [A brand new flag](https://app.launchdarkly.com/default/~/features/a-brand-new-flag)", + "html": "Henrietta Powell created the flag A brand new flag" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/flags/default/a-brand-new-flag", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/~/features/a-brand-new-flag", + "type": "text/html" + } + }, + "name": "A brand new flag" + } +} diff --git a/sample-context/flag/targeting-rule-update.json b/sample-context/flag/targeting-rule-update.json new file mode 100644 index 00000000..a33c4f79 --- /dev/null +++ b/sample-context/flag/targeting-rule-update.json @@ -0,0 +1,83 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/flags/default/demo-flag", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c0d506121d8aaf15392b", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/production/features/demo-flag", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c0d506121d8aaf15392b", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580777685229, + "seconds": 1580777685 + }, + "kind": "flag", + "name": "Demo flag", + "details": { + "plainText": "Removed 'Ushki' from the variation 'true'\nDecreased the rollout from '50%' to '43%' for the rule \n If 'email' ends with '.edu'\n serve '43%' 'true'\n", + "markdown": "* Removed ~~`Ushki`~~ from the variation `true`\n* Decreased the rollout from ~~`50%`~~ to `43%` for the rule \n > **If** `email` **ends with** `.edu` \n **serve** `43%` `true`\n \n \n", + "html": "
  • Removed Ushki from the variation true
  • \n
  • Decreased the rollout from 50% to 43% for the rule
    If email ends with .edu
    serve 43% true
" + }, + "comment": "Adjusting the targeting rules", + "project": { + "name": "The big project", + "key": "default", + "tags": [], + "environment": { + "name": "Production", + "key": "production", + "tags": [] + } + }, + "key": "demo-flag", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "updated the flag", + "verbKind": "updateRules", + "title": { + "plainText": "Henrietta Powell updated the flag Demo flag in 'Production'", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [Demo flag](https://app.launchdarkly.com/default/production/features/demo-flag) in `Production`", + "html": "Henrietta Powell updated the flag Demo flag in Production" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/flags/default/demo-flag", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/production/features/demo-flag", + "type": "text/html" + } + }, + "name": "Demo flag" + } +} diff --git a/sample-context/flag-update.toggle.json b/sample-context/flag/toggle.json similarity index 55% rename from sample-context/flag-update.toggle.json rename to sample-context/flag/toggle.json index a622ae65..b4d10491 100644 --- a/sample-context/flag-update.toggle.json +++ b/sample-context/flag/toggle.json @@ -1,27 +1,28 @@ { "_links": { "canonical": { - "href": "/api/v2/flags/default/demo-flag", + "href": "https://app.launchdarkly.com/api/v2/flags/default/demo-flag", "type": "application/json" }, "parent": { - "href": "/api/v2/auditlog", + "href": "https://app.launchdarkly.com/api/v2/auditlog", "type": "application/json" }, "self": { - "href": "/api/v2/auditlog/5e33896006121d53a82ad9fb", + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38bf6706121d8aaf15392a", "type": "application/json" }, "site": { - "href": "/default/production/features/demo-flag", + "href": "https://app.launchdarkly.com/default/production/features/demo-flag", "type": "text/html" } }, - "_id": "5e33896006121d53a82ad9fb", + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38bf6706121d8aaf15392a", "_accountId": "569f514156e003339cfd3917", "timestamp": { - "milliseconds": 1580435808417, - "seconds": 1580435808 + "milliseconds": 1580777319650, + "seconds": 1580777319 }, "kind": "flag", "name": "Demo flag", @@ -30,7 +31,7 @@ "markdown": "", "html": "" }, - "comment": "Turn it on!", + "comment": "Do it live!", "project": { "name": "The big project", "key": "default", @@ -46,11 +47,11 @@ "member": { "_links": { "parent": { - "href": "/api/v2/members", + "href": "https://app.launchdarkly.com/api/v2/members", "type": "application/json" }, "self": { - "href": "/api/v2/members/569f514183f2164430000002", + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", "type": "application/json" } }, @@ -60,19 +61,20 @@ "lastName": "Powell" }, "titleVerb": "turned on the flag", + "verbKind": "updateOn", "title": { "plainText": "Henrietta Powell turned on the flag Demo flag in 'Production'", - "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) turned on the flag [Demo flag](http://localhost/default/production/features/demo-flag) in `Production`", - "html": "Henrietta Powell turned on the flag Demo flag in Production" + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) turned on the flag [Demo flag](https://app.launchdarkly.com/default/production/features/demo-flag) in `Production`", + "html": "Henrietta Powell turned on the flag Demo flag in Production" }, "target": { "_links": { "canonical": { - "href": "/api/v2/flags/default/demo-flag", + "href": "https://app.launchdarkly.com/api/v2/flags/default/demo-flag", "type": "application/json" }, "site": { - "href": "/default/production/features/demo-flag", + "href": "https://app.launchdarkly.com/default/production/features/demo-flag", "type": "text/html" } }, diff --git a/sample-context/flag/update-all-environments.json b/sample-context/flag/update-all-environments.json new file mode 100644 index 00000000..b733d623 --- /dev/null +++ b/sample-context/flag/update-all-environments.json @@ -0,0 +1,93 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/flags/default/demo-flag", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c13206121d8aaf15392c", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/~/features/demo-flag", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c13206121d8aaf15392c", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580777778959, + "seconds": 1580777778 + }, + "kind": "flag", + "name": "Demo flag", + "details": { + "plainText": "Changed the flag to be hidden from client-side SDKs\nAdded tag 'demo'", + "markdown": "* Changed the flag to be hidden from client\\-side SDKs\n\n* Added tag `demo`\n", + "html": "
  • Changed the flag to be hidden from client-side SDKs
\n
  • Added tag demo
" + }, + "comment": "This will propagate to all environments", + "project": { + "name": "The big project", + "key": "default", + "tags": [], + "environment": { + "name": "All environments", + "key": "~", + "tags": null + } + }, + "key": "demo-flag", + "tags": [], + "customProperties": { + "dynatrace": { + "name": "Dynatrace", + "values": ["test1", "test2"] + }, + "jira": { + "name": "Jira", + "values": ["thing1", "thing2"] + } + }, + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "updated the flag", + "verbKind": "updateTag", + "title": { + "plainText": "Henrietta Powell updated the flag Demo flag", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the flag [Demo flag](https://app.launchdarkly.com/default/~/features/demo-flag)", + "html": "Henrietta Powell updated the flag Demo flag" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/flags/default/demo-flag", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/~/features/demo-flag", + "type": "text/html" + } + }, + "name": "Demo flag" + } +} diff --git a/sample-context/other/metric.create.json b/sample-context/other/metric.create.json new file mode 100644 index 00000000..b8859be8 --- /dev/null +++ b/sample-context/other/metric.create.json @@ -0,0 +1,74 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/metrics/default/new-metric", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c67506121dba45ba0f49", + "type": "application/json" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c67506121dba45ba0f49", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580779125858, + "seconds": 1580779125 + }, + "kind": "metric", + "name": "New metric", + "details": { + "plainText": "", + "markdown": "", + "html": "" + }, + "project": { + "name": "The big project", + "key": "default", + "tags": ["demo"], + "environment": { + "name": "", + "key": "", + "tags": null + } + }, + "key": "new-metric", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "created the metric", + "verbKind": "createMetric", + "title": { + "plainText": "Henrietta Powell created the metric New metric", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) created the metric New metric", + "html": "Henrietta Powell created the metric New metric" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/metrics/default/new-metric", + "type": "application/json" + } + }, + "name": "New metric" + } +} diff --git a/sample-context/other/segment.create.json b/sample-context/other/segment.create.json new file mode 100644 index 00000000..3b943ed4 --- /dev/null +++ b/sample-context/other/segment.create.json @@ -0,0 +1,74 @@ +{ + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c5bd06121dba45ba0f44", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/production/segments/new-segment", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c5bd06121dba45ba0f44", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580778941643, + "seconds": 1580778941 + }, + "kind": "segment", + "name": "New segment", + "details": { + "plainText": "", + "markdown": "", + "html": "" + }, + "project": { + "name": "The big project", + "key": "default", + "tags": ["demo"], + "environment": { + "name": "Production", + "key": "production", + "tags": [] + } + }, + "key": "new-segment", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "created the segment", + "verbKind": "createSegment", + "title": { + "plainText": "Henrietta Powell created the segment New segment", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) created the segment [New segment](https://app.launchdarkly.com/default/production/segments/new-segment)", + "html": "Henrietta Powell created the segment New segment" + }, + "target": { + "_links": { + "site": { + "href": "https://app.launchdarkly.com/default/production/segments/new-segment", + "type": "text/html" + } + }, + "name": "New segment" + } +} diff --git a/sample-context/other/segment.update.json b/sample-context/other/segment.update.json new file mode 100644 index 00000000..d9a69ffd --- /dev/null +++ b/sample-context/other/segment.update.json @@ -0,0 +1,75 @@ +{ + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c61306121dba45ba0f45", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/default/production/segments/new-segment", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c61306121dba45ba0f45", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580779027718, + "seconds": 1580779027 + }, + "kind": "segment", + "name": "New segment", + "details": { + "plainText": "Added the included user 'Ushki'\nChanged the targeting rules", + "markdown": "* Added the included user `Ushki`\n\n* Changed the targeting rules\n", + "html": "
  • Added the included user Ushki
\n
  • Changed the targeting rules
" + }, + "comment": "Update test", + "project": { + "name": "The big project", + "key": "default", + "tags": ["demo"], + "environment": { + "name": "Production", + "key": "production", + "tags": [] + } + }, + "key": "new-segment", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "updated the segment", + "verbKind": "updateRules", + "title": { + "plainText": "Henrietta Powell updated the segment New segment", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the segment [New segment](https://app.launchdarkly.com/default/production/segments/new-segment)", + "html": "Henrietta Powell updated the segment New segment" + }, + "target": { + "_links": { + "site": { + "href": "https://app.launchdarkly.com/default/production/segments/new-segment", + "type": "text/html" + } + }, + "name": "New segment" + } +} diff --git a/sample-context/other/webhook.enable.json b/sample-context/other/webhook.enable.json new file mode 100644 index 00000000..a6ba7d6b --- /dev/null +++ b/sample-context/other/webhook.enable.json @@ -0,0 +1,81 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/webhooks/5775a7e1aceb07bb5b00000d", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c63106121dba45ba0f46", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/integrations", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c63106121dba45ba0f46", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580779057946, + "seconds": 1580779057 + }, + "kind": "webhook", + "name": "Test webhook", + "details": { + "plainText": "", + "markdown": "", + "html": "" + }, + "project": { + "name": "", + "key": "", + "tags": null, + "environment": { + "name": "", + "key": "", + "tags": null + } + }, + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "enabled the webhook", + "verbKind": "updateOn", + "title": { + "plainText": "Henrietta Powell enabled the webhook Test webhook", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) enabled the webhook [Test webhook](https://app.launchdarkly.com/integrations)", + "html": "Henrietta Powell enabled the webhook Test webhook" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/webhooks/5775a7e1aceb07bb5b00000d", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/integrations", + "type": "text/html" + } + }, + "name": "Test webhook" + } +} diff --git a/sample-context/project/create.json b/sample-context/project/create.json new file mode 100644 index 00000000..f0c20682 --- /dev/null +++ b/sample-context/project/create.json @@ -0,0 +1,82 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/a-new-project", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c40306121dba45ba0f2b", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c40306121dba45ba0f2b", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580778499615, + "seconds": 1580778499 + }, + "kind": "project", + "name": "A new project", + "details": { + "plainText": "", + "markdown": "", + "html": "" + }, + "project": { + "name": "", + "key": "a-new-project", + "tags": [], + "environment": { + "name": "", + "key": "", + "tags": null + } + }, + "key": "a-new-project", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "created the project", + "verbKind": "createProject", + "title": { + "plainText": "Henrietta Powell created the project A new project", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) created the project [A new project](https://app.launchdarkly.com/settings/projects)", + "html": "Henrietta Powell created the project A new project" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/a-new-project", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "name": "A new project" + } +} diff --git a/sample-context/project/delete.json b/sample-context/project/delete.json new file mode 100644 index 00000000..dba032c5 --- /dev/null +++ b/sample-context/project/delete.json @@ -0,0 +1,82 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/a-new-project", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c43c06121dba45ba0f2c", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c43c06121dba45ba0f2c", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580778556395, + "seconds": 1580778556 + }, + "kind": "project", + "name": "A new project", + "details": { + "plainText": "", + "markdown": "", + "html": "" + }, + "project": { + "name": "A new project", + "key": "a-new-project", + "tags": [], + "environment": { + "name": "", + "key": "", + "tags": null + } + }, + "key": "a-new-project", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "deleted the project", + "verbKind": "deleteProject", + "title": { + "plainText": "Henrietta Powell deleted the project A new project", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) deleted the project A new project", + "html": "Henrietta Powell deleted the project A new project" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/a-new-project", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "name": "A new project" + } +} diff --git a/sample-context/project/update.json b/sample-context/project/update.json new file mode 100644 index 00000000..ab414bd7 --- /dev/null +++ b/sample-context/project/update.json @@ -0,0 +1,82 @@ +{ + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/default", + "type": "application/json" + }, + "parent": { + "href": "https://app.launchdarkly.com/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c37806121dba45ba0f26", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "baseURL": "https://app.launchdarkly.com", + "_id": "5e38c37806121dba45ba0f26", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1580778360145, + "seconds": 1580778360 + }, + "kind": "project", + "name": "The big project", + "details": { + "plainText": "Added tag 'demo'\nChanged new flags to be available to client-side SDKs by default", + "markdown": "* Added tag `demo`\n\n* Changed new flags to be available to client\\-side SDKs by default\n", + "html": "
  • Added tag demo
\n
  • Changed new flags to be available to client-side SDKs by default
" + }, + "project": { + "name": "The big project", + "key": "default", + "tags": [], + "environment": { + "name": "", + "key": "", + "tags": null + } + }, + "key": "default", + "tags": [], + "member": { + "_links": { + "parent": { + "href": "https://app.launchdarkly.com/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "https://app.launchdarkly.com/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "firstName": "Henrietta", + "lastName": "Powell" + }, + "titleVerb": "updated the project", + "verbKind": "updateTags", + "title": { + "plainText": "Henrietta Powell updated the project The big project", + "markdown": "[Henrietta Powell](mailto:testing@launchdarkly.com) updated the project [The big project](https://app.launchdarkly.com/settings/projects)", + "html": "Henrietta Powell updated the project The big project" + }, + "target": { + "_links": { + "canonical": { + "href": "https://app.launchdarkly.com/api/v2/projects/default", + "type": "application/json" + }, + "site": { + "href": "https://app.launchdarkly.com/settings/projects", + "type": "text/html" + } + }, + "name": "The big project" + } +} From 716e382e9a31fb9a7932d3bfe362a432b3df229b Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 25 Mar 2020 12:47:10 +0000 Subject: [PATCH 214/936] Break schema into multiple files (#62) * Add support for split files and move reserved custom properties * Move auditLogEvents hook to new file --- .pre-commit-config.yaml | 8 +- bundleSchema.js | 18 + manifest.schema.json | 1121 +++++++++-------- package-lock.json | 23 + package.json | 2 + schemas/base.json | 286 +++++ schemas/capabilities/auditLogEventsHook.json | 206 +++ .../reservedCustomProperties.json | 33 + 8 files changed, 1140 insertions(+), 557 deletions(-) create mode 100644 bundleSchema.js create mode 100644 schemas/base.json create mode 100644 schemas/capabilities/auditLogEventsHook.json create mode 100644 schemas/capabilities/reservedCustomProperties.json diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9d242036..959dccb0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,9 +11,15 @@ repos: - id: check-added-large-files - repo: local hooks: + - id: build-schema + name: Build schema + entry: npm run build + language: system + pass_filenames: false + - id: validate-manifests name: Validate manifests - entry: yarn test + entry: npm run test language: system pass_filenames: false diff --git a/bundleSchema.js b/bundleSchema.js new file mode 100644 index 00000000..cb432cd8 --- /dev/null +++ b/bundleSchema.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const $RefParser = require('@apidevtools/json-schema-ref-parser'); + +const baseSchema = require('./schemas/base.json'); + +const bundle = async () => { + try { + const schema = await $RefParser.bundle(baseSchema); + fs.writeFileSync( + 'manifest.schema.json', + JSON.stringify(schema, null, 2) + '\n' + ); + } catch (e) { + console.error(e); + } +}; + +bundle(); diff --git a/manifest.schema.json b/manifest.schema.json index e0a9c4c3..d0db669b 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1,592 +1,601 @@ { - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://launchdarkly.com/schemas/v1.0/integrations", - "title": "LaunchDarkly Integrations Manifest", - "description": "Describes the capabilities and intent of a LaunchDarkly integration", - "type": "object", - "additionalProperties": false, - "propertyNames": { + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://launchdarkly.com/schemas/v1.0/manifest.schema.json#", + "title": "LaunchDarkly Integrations Manifest", + "description": "Describes the capabilities and intent of a LaunchDarkly integration", + "type": "object", + "additionalProperties": false, + "propertyNames": { + "enum": [ + "name", + "version", + "overview", + "description", + "author", + "supportEmail", + "links", + "categories", + "icons", + "formVariables", + "capabilities" + ] + }, + "properties": { + "name": { + "$id": "#/properties/name", + "title": "Integration name", + "description": "Your integration's name.", + "minLength": 3, + "maxLength": 100, + "type": "string" + }, + "version": { + "$id": "#/properties/version", + "title": "Version", + "description": "A semantic version of the integration. See https://semver.org for more info.", + "examples": [ + "0.0.1", + "1.0.0", + "1.0.1-beta" + ], + "type": "string", + "minLength": 5, + "maxLength": 14, + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + }, + "overview": { + "$id": "#/properties/overview", + "title": "Short description", + "description": "A short-one liner describing your integration", + "type": "string", + "minLength": 10, + "maxLength": 100, + "pattern": "^(.*)$" + }, + "description": { + "$id": "#/properties/description", + "title": "Long description", + "description": "A longer description of your integration", + "type": "string", + "minLength": 50, + "maxLength": 2048, + "pattern": "^(.*)$" + }, + "author": { + "$id": "#/properties/author", + "title": "Author", + "description": "Name of the author or organization responsible for the integration", + "type": "string", + "minLength": 3, + "maxLength": 100, + "pattern": "^(.*)$" + }, + "supportEmail": { + "$id": "#/properties/links/support-email", + "title": "Support Email", + "description": "Email address for your integration's support", + "type": "string", + "format": "email" + }, + "links": { + "$id": "#/properties/links", + "title": "Links", + "description": "A set of reference links supporting your integration", + "type": "object", + "propertyNames": { "enum": [ - "name", - "version", - "overview", - "description", - "author", - "supportEmail", - "links", - "categories", - "icons", - "formVariables", - "capabilities" + "site", + "privacyPolicy", + "supportWebsite" ] - }, - "properties": { - "name": { - "$id": "#/properties/name", - "title": "Integration name", - "description": "Your integration's name.", - "minLength": 3, - "maxLength": 100, - "type": "string" + }, + "properties": { + "site": { + "$id": "#/properties/links/site", + "title": "Website", + "description": "URL to your website", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, - "version": { - "$id": "#/properties/version", - "title": "Version", - "description": "A semantic version of the integration. See https://semver.org for more info.", - "examples": [ - "0.0.1", - "1.0.0", - "1.0.1-beta" - ], - "type": "string", - "minLength": 5, - "maxLength": 14, - "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + "privacyPolicy": { + "$id": "#/properties/links/privacy-policy", + "title": "Privacy Policy", + "description": "URL to your organization's privacy policy", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, - "overview": { - "$id": "#/properties/overview", - "title": "Short description", - "description": "A short-one liner describing your integration", - "type": "string", - "minLength": 10, - "maxLength": 100, - "pattern": "^(.*)$" + "supportWebsite": { + "$id": "#/properties/links/support-website", + "title": "Support Website", + "description": "URL to your integration's support website", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + } + }, + "required": [ + "site", + "privacyPolicy" + ] + }, + "categories": { + "$id": "#/properties/categories", + "title": "Categories", + "description": "Categories that describe your integration", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "maxItems": 3, + "items": { + "type": "string", + "enum": [ + "authentication", + "automation", + "collaboration", + "configuration", + "data", + "developer-tools", + "infrastructure", + "task-management", + "monitoring", + "notifications", + "product-tools", + "version-control" + ] + } + }, + "icons": { + "$id": "#/properties/icons", + "title": "Icons", + "description": "Logos describing your integration in SVG format", + "type": "object", + "propertyNames": { + "enum": [ + "square", + "horizontal" + ] + }, + "properties": { + "square": { + "$id": "#/properties/icons/square", + "title": "Square logo", + "description": "A square version of your integration's logo in SVG format", + "type": "string", + "pattern": "\\.svg$" }, - "description": { - "$id": "#/properties/description", - "title": "Long description", - "description": "A longer description of your integration", - "type": "string", - "minLength": 50, - "maxLength": 2048, - "pattern": "^(.*)$" + "horizontal": { + "$id": "#/properties/icons/horizontal", + "title": "Horizontal logo", + "description": "A horizontal version of your integration's logo in SVG format", + "type": "string", + "pattern": "\\.svg$" + } + }, + "required": [ + "square", + "horizontal" + ] + }, + "formVariables": { + "$id": "#/properties/formVariables", + "title": "Form variables", + "description": "Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`.", + "type": "array", + "items": { + "$id": "#/properties/formVariables/variable", + "title": "Form variable", + "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "description", + "placeholder", + "isSecret", + "isOptional", + "defaultValue", + "allowedValues" + ] }, - "author": { - "$id": "#/properties/author", - "title": "Author", - "description": "Name of the author or organization responsible for the integration", + "properties": { + "key": { + "$id": "#/properties/formVariables/variable/key", + "title": "Key", "type": "string", - "minLength": 3, - "maxLength": 100, - "pattern": "^(.*)$" - }, - "supportEmail": { - "$id": "#/properties/links/support-email", - "title": "Support Email", - "description": "Email address for your integration's support", + "description": "A key will be used as the token name when the variable is substituted", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "name": { + "$id": "#/properties/formVariables/variable/name", + "title": "Name", "type": "string", - "format": "email" - }, - "links": { - "$id": "#/properties/links", - "title": "Links", - "description": "A set of reference links supporting your integration", - "type": "object", - "propertyNames": { - "enum": [ - "site", - "privacyPolicy", - "supportWebsite" - ] - }, - "properties": { - "site": { - "$id": "#/properties/links/site", - "title": "Website", - "description": "URL to your website", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - }, - "privacyPolicy": { - "$id": "#/properties/links/privacy-policy", - "title": "Privacy Policy", - "description": "URL to your organization's privacy policy", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - }, - "supportWebsite": { - "$id": "#/properties/links/support-website", - "title": "Support Website", - "description": "URL to your integration's support website", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" - } - }, - "required": [ - "site", - "privacyPolicy" + "description": "A descriptive name that will be used as the form label on the UI", + "maxLength": 50 + }, + "type": { + "$id": "#/properties/formVariables/variable/type", + "title": "Type", + "type": "string", + "description": "The type of the variable", + "enum": [ + "string", + "boolean", + "uri", + "enum" ] - }, - "categories": { - "$id": "#/properties/categories", - "title": "Categories", - "description": "Categories that describe your integration", + }, + "description": { + "$id": "#/properties/formVariables/variable/description", + "title": "Description", + "type": "string", + "description": "Describes the variable in the UI. Markdown links allowed.", + "maxLength": 250 + }, + "placeholder": { + "$id": "#/properties/formVariables/variable/placeholder", + "title": "Description", + "type": "string", + "description": "Placeholder value to use in the form element if applicable" + }, + "isSecret": { + "$id": "#/properties/formVariables/variable/is-secret", + "title": "Is this variable a secret?", + "type": "boolean", + "description": "Secret variables will be masked in the UI", + "default": false + }, + "isOptional": { + "$id": "#/properties/formVariables/variable/is-optional", + "title": "Is this variable optional?", + "type": "boolean", + "description": "Variables marked as optional won't be required on the UI", + "default": false + }, + "defaultValue": { + "$id": "#/properties/formVariables/variable/default-value", + "title": "Default value", + "type": [ + "boolean", + "string" + ], + "description": "Default value for variable. Can be overridden by user in the UI" + }, + "allowedValues": { + "$id": "#/properties/formVariables/variable/allowed-values", + "title": "Allowed values", "type": "array", - "uniqueItems": true, - "minItems": 1, - "maxItems": 3, + "description": "allowed string values for enum-type formVariables", "items": { - "type": "string", - "enum": [ - "authentication", - "automation", - "collaboration", - "configuration", - "data", - "developer-tools", - "infrastructure", - "task-management", - "monitoring", - "notifications", - "product-tools", - "version-control" - ] + "type": "string" } + } }, - "icons": { - "$id": "#/properties/icons", - "title": "Icons", - "description": "Logos describing your integration in SVG format", - "type": "object", - "propertyNames": { + "required": [ + "key", + "name", + "type", + "description" + ] + }, + "default": [] + }, + "capabilities": { + "$id": "#/properties/capabilities", + "title": "Capabilities", + "description": "Specify which capabilities you'd like your integration to have", + "type": "object", + "propertyNames": { + "enum": [ + "auditLogEventsHook", + "reservedCustomProperties" + ] + }, + "properties": { + "auditLogEventsHook": { + "$id": "#/properties/capability/audit-log-events-hook", + "title": "Audit Log Events Hook", + "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", + "type": "object", + "propertyNames": { + "enum": [ + "endpoint", + "templates", + "defaultPolicy" + ] + }, + "properties": { + "endpoint": { + "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", + "title": "Endpoint", + "description": "Properties that describe the HTTP endpoint LaunchDarkly will send hooks to", + "type": "object", + "propertyNames": { "enum": [ - "square", - "horizontal" + "url", + "method", + "headers" ] - }, - "properties": { - "square": { - "$id": "#/properties/icons/square", - "title": "Square logo", - "description": "A square version of your integration's logo in SVG format", - "type": "string", - "pattern": "\\.svg$" + }, + "properties": { + "url": { + "$id": "#/properties/capability/audit-log-events-hook/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url.", + "minLength": 3 }, - "horizontal": { - "$id": "#/properties/icons/horizontal", - "title": "Horizontal logo", - "description": "A horizontal version of your integration's logo in SVG format", - "type": "string", - "pattern": "\\.svg$" - } - }, - "required": [ - "square", - "horizontal" - ] - }, - "formVariables": { - "$id": "#/properties/formVariables", - "title": "Form variables", - "description": "Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`.", - "type": "array", - "items": { - "$id": "#/properties/formVariables/variable", - "title": "Form variable", - "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", - "type": "object", - "propertyNames": { - "enum": [ - "key", - "name", - "type", - "description", - "placeholder", - "isSecret", - "isOptional", - "defaultValue", - "allowedValues" - ] + "method": { + "$id": "#/properties/capability/audit-log-events-hook/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH" + ], + "default": "POST" }, - "properties": { - "key": { - "$id": "#/properties/formVariables/variable/key", - "title": "Key", - "type": "string", - "description": "A key will be used as the token name when the variable is substituted", - "maxLength": 20, - "pattern": "^[^\\s]*$" + "headers": { + "$id": "#/properties/capability/audit-log-events-hook/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/properties/capability/audit-log-events-hook/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] }, - "name": { - "$id": "#/properties/formVariables/variable/name", + "properties": { + "name": { + "$id": "#/properties/fcapability/audit-log-events-hook/header/items/name", "title": "Name", "type": "string", - "description": "A descriptive name that will be used as the form label on the UI", - "maxLength": 50 - }, - "type": { - "$id": "#/properties/formVariables/variable/type", - "title": "Type", - "type": "string", - "description": "The type of the variable", - "enum": [ - "string", - "boolean", - "uri", - "enum" - ] - }, - "description": { - "$id": "#/properties/formVariables/variable/description", - "title": "Description", - "type": "string", - "description": "Describes the variable in the UI. Markdown links allowed.", - "maxLength": 250 - }, - "placeholder": { - "$id": "#/properties/formVariables/variable/placeholder", - "title": "Description", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/properties/fcapability/audit-log-events-hook/header/items/value", + "title": "Value", "type": "string", - "description": "Placeholder value to use in the form element if applicable" - }, - "isSecret": { - "$id": "#/properties/formVariables/variable/is-secret", - "title": "Is this variable a secret?", - "type": "boolean", - "description": "Secret variables will be masked in the UI", - "default": false - }, - "isOptional": { - "$id": "#/properties/formVariables/variable/is-optional", - "title": "Is this variable optional?", - "type": "boolean", - "description": "Variables marked as optional won't be required on the UI", - "default": false + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } }, - "defaultValue": { - "$id": "#/properties/formVariables/variable/default-value", - "title": "Default value", - "type": [ - "boolean", - "string" - ], - "description": "Default value for variable. Can be overridden by user in the UI" + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" }, - "allowedValues": { - "$id": "#/properties/formVariables/variable/allowed-values", - "title": "Allowed values", - "type": "array", - "description": "allowed string values for enum-type formVariables", - "items": { - "type": "string" - } + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" } - }, - "required": [ - "key", - "name", - "type", - "description" - ] + ], + "minProperties": 1 + } + }, + "required": [ + "url" + ] }, - "default": [] - }, - "capabilities": { - "$id": "#/properties/capabilities", - "title": "Capabilities", - "description": "Specify which capabilities you'd like your integration to have", - "type": "object", - "propertyNames": { + "templates": { + "$id": "#/properties/capability/audit-log-events-hook/templates", + "title": "Webhook body template", + "description": "Templates to use for body of the webhook request", + "type": "object", + "propertyNames": { "enum": [ - "auditLogEventsHook", "reservedCustomProperties" + "flag", + "project", + "environment", + "default" ] + }, + "properties": { + "flag": { + "$id": "#/properties/capability/audit-log-events-hook/templates/flag", + "title": "Flag template", + "description": "Template to use for flag events", + "type": "string" + }, + "project": { + "$id": "#/properties/capability/audit-log-events-hook/templates/project", + "title": "Project template", + "description": "Template to use for project events", + "type": "string" + }, + "environment": { + "$id": "#/properties/capability/audit-log-events-hook/templates/environment", + "title": "Environment template", + "description": "Template to use for environment events", + "type": "string" + }, + "default": { + "$id": "#/properties/capability/audit-log-events-hook/templates/default", + "title": "default template", + "description": "Template to use if the event does not have a corresponding named template", + "type": "string" + } + } }, - "properties": { - "auditLogEventsHook": { - "$id": "#/properties/capability/audit-log-events-hook", - "title": "Audit Log Events Hook", - "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", - "type": "object", - "propertyNames": { - "enum": [ - "endpoint", - "templates", - "defaultPolicy" - ] - }, - "properties": { - "endpoint": { - "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", - "title": "Endpoint", - "description": "Properties that describe the HTTP endpoint LaunchDarkly will send hooks to", - "type": "object", - "propertyNames": { - "enum": [ - "url", - "method", - "headers" - ] - }, - "properties": { - "url": { - "$id": "#/properties/capability/audit-log-events-hook/url", - "title": "URL", - "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url.", - "minLength": 3 - }, - "method": { - "$id": "#/properties/capability/audit-log-events-hook/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": [ - "POST", - "PUT", - "PATCH" - ], - "default": "POST" - }, - "headers": { - "$id": "#/properties/capability/audit-log-events-hook/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/properties/capability/audit-log-events-hook/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": [ - "name", - "value" - ] - }, - "properties": { - "name": { - "$id": "#/properties/fcapability/audit-log-events-hook/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/properties/fcapability/audit-log-events-hook/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": [ - "name", - "value" - ] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 - } - }, - "required": [ - "url" - ] - }, - "templates": { - "$id": "#/properties/capability/audit-log-events-hook/templates", - "title": "Webhook body template", - "description": "Templates to use for body of the webhook request", - "type": "object", - "propertyNames": { - "enum": [ - "flag", - "project", - "environment", - "default" - ] - }, - "properties": { - "flag": { - "$id": "#/properties/capability/audit-log-events-hook/templates/flag", - "title": "Flag template", - "description": "Template to use for flag events", - "type": "string" - }, - "project": { - "$id": "#/properties/capability/audit-log-events-hook/templates/project", - "title": "Project template", - "description": "Template to use for project events", - "type": "string" - }, - "environment": { - "$id": "#/properties/capability/audit-log-events-hook/templates/environment", - "title": "Environment template", - "description": "Template to use for environment events", - "type": "string" - }, - "default": { - "$id": "#/properties/capability/audit-log-events-hook/templates/default", - "title": "default template", - "description": "Template to use if the event does not have a corresponding named template", - "type": "string" - } - } - }, - "defaultPolicy": { - "$id": "#/properties/capability/audit-log-events-hook/default-policy", - "title": "Default Policy", - "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "array", - "minItems": 1, - "items": { - "$id": "#/properties/capability/audit-log-events-hook/policy", - "title": "Policy", - "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", - "type": "object", - "propertyNames": { - "enum": [ - "actions", - "effect", - "notActions", - "notResources", - "resources" - ] - }, - "properties": { - "actions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/actions", - "title": "Actions", - "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "updateOn", - "createFlag", - "updateRules", - "updateTargets" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "effect": { - "$id": "#/properties/capability/audit-log-events-hook/policy/effect", - "title": "Effect", - "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", - "default": "allow", - "type": "string", - "enum": [ - "allow", - "deny" - ] - }, - "notActions": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", - "title": "Not actions", - "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "createFlag", - "deleteFlag", - "cloneFlag" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "notResources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", - "title": "Not resources", - "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "proj/*:env/production:flag/*" - ], - "type": "array", - "items": { - "type": "string" - } - }, - "resources": { - "$id": "#/properties/capability/audit-log-events-hook/policy/resources", - "title": "Resources", - "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", - "default": [ - "*" - ], - "examples": [ - "proj/*:env/production:flag/*" - ], - "type": "array", - "items": { - "type": "string" - } - } - } - } - } - }, - "required": [ - "endpoint", - "templates" - ] + "defaultPolicy": { + "$id": "#/properties/capability/audit-log-events-hook/default-policy", + "title": "Default Policy", + "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "array", + "minItems": 1, + "items": { + "$id": "#/properties/capability/audit-log-events-hook/policy", + "title": "Policy", + "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "object", + "propertyNames": { + "enum": [ + "actions", + "effect", + "notActions", + "notResources", + "resources" + ] }, - "reservedCustomProperties": { - "$id": "#/properties/capability/reserved-custom-properties", - "title": "Reserved custom properties", - "description": "This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/advanced/custom-properties for more information on custom properties", + "properties": { + "actions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/actions", + "title": "Actions", + "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "updateOn", + "createFlag", + "updateRules", + "updateTargets" + ], "type": "array", "items": { - "$id": "#/properties/capability/reserved-custom-properties/items", - "type": "object", - "propertyNames": {"enum": ["name", "key"]}, - "properties": { - "name": { - "$id": "#/properties/capability/reserved-custom-properties/items/name", - "title": "Name", - "type": "string", - "description": "The reserved custom property's display name.", - "maxLength": 64 - }, - "key": { - "$id": "#/properties/capability/reserved-custom-properties/items/key", - "title": "Key", - "type": "string", - "description": "The custom property's API response key.", - "maxLength": 64 - } - }, - "required": ["name", "key"] - }, - "minLength": 1, - "maxLength": 3 + "type": "string" + } + }, + "effect": { + "$id": "#/properties/capability/audit-log-events-hook/policy/effect", + "title": "Effect", + "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", + "default": "allow", + "type": "string", + "enum": [ + "allow", + "deny" + ] + }, + "notActions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", + "title": "Not actions", + "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "createFlag", + "deleteFlag", + "cloneFlag" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "notResources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", + "title": "Not resources", + "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "proj/*:env/production:flag/*" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/resources", + "title": "Resources", + "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": [ + "*" + ], + "examples": [ + "proj/*:env/production:flag/*" + ], + "type": "array", + "items": { + "type": "string" + } } + } + } } + }, + "required": [ + "endpoint", + "templates" + ] + }, + "reservedCustomProperties": { + "$id": "#/properties/capability/reserved-custom-properties", + "title": "Reserved custom properties", + "description": "This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/advanced/custom-properties for more information on custom properties", + "type": "array", + "items": { + "$id": "#/properties/capability/reserved-custom-properties/items", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "key" + ] + }, + "properties": { + "name": { + "$id": "#/properties/capability/reserved-custom-properties/items/name", + "title": "Name", + "type": "string", + "description": "The reserved custom property's display name.", + "maxLength": 64 + }, + "key": { + "$id": "#/properties/capability/reserved-custom-properties/items/key", + "title": "Key", + "type": "string", + "description": "The custom property's API response key.", + "maxLength": 64 + } + }, + "required": [ + "name", + "key" + ] + }, + "minLength": 1, + "maxLength": 3 } - }, - "required": [ - "name", - "version", - "overview", - "description", - "author", - "supportEmail", - "links", - "categories", - "icons" - ] + } + } + }, + "required": [ + "name", + "version", + "overview", + "description", + "author", + "supportEmail", + "links", + "categories", + "icons" + ] } diff --git a/package-lock.json b/package-lock.json index bb690085..aef284e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,17 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@apidevtools/json-schema-ref-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", + "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", + "dev": true, + "requires": { + "@jsdevtools/ono": "^7.1.0", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", @@ -519,6 +530,12 @@ "chalk": "^3.0.0" } }, + "@jsdevtools/ono": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.1.tgz", + "integrity": "sha512-pu5fxkbLQWzRbBgfFbZfHXz0KlYojOfVdUhcNfy9lef8ZhBt0pckGr8g7zv4vPX4Out5vBNvqd/az4UaVWzZ9A==", + "dev": true + }, "@sinonjs/commons": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", @@ -986,6 +1003,12 @@ "unset-value": "^1.0.0" } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", diff --git a/package.json b/package.json index 23069709..1643b4e1 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "index.js", "scripts": { "test": "jest", + "build": "node bundleSchema.js && prettier --write manifest.schema.json", "prettier:check": "prettier --list-different \"./**/*.{js,json}\"", "prettier:write": "prettier --write \"./**/*.{js,json}\"", "preview": "node preview.js", @@ -26,6 +27,7 @@ }, "homepage": "https://github.com/launchdarkly/ld-integrations#readme", "devDependencies": { + "@apidevtools/json-schema-ref-parser": "^8.0.0", "ajv": "^6.10.2", "handlebars": "4.7.3", "jest": "25.1.0", diff --git a/schemas/base.json b/schemas/base.json new file mode 100644 index 00000000..d38062b6 --- /dev/null +++ b/schemas/base.json @@ -0,0 +1,286 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://launchdarkly.com/schemas/v1.0/manifest.schema.json#", + "title": "LaunchDarkly Integrations Manifest", + "description": "Describes the capabilities and intent of a LaunchDarkly integration", + "type": "object", + "additionalProperties": false, + "propertyNames": { + "enum": [ + "name", + "version", + "overview", + "description", + "author", + "supportEmail", + "links", + "categories", + "icons", + "formVariables", + "capabilities" + ] + }, + "properties": { + "name": { + "$id": "#/properties/name", + "title": "Integration name", + "description": "Your integration's name.", + "minLength": 3, + "maxLength": 100, + "type": "string" + }, + "version": { + "$id": "#/properties/version", + "title": "Version", + "description": "A semantic version of the integration. See https://semver.org for more info.", + "examples": ["0.0.1", "1.0.0", "1.0.1-beta"], + "type": "string", + "minLength": 5, + "maxLength": 14, + "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + }, + "overview": { + "$id": "#/properties/overview", + "title": "Short description", + "description": "A short-one liner describing your integration", + "type": "string", + "minLength": 10, + "maxLength": 100, + "pattern": "^(.*)$" + }, + "description": { + "$id": "#/properties/description", + "title": "Long description", + "description": "A longer description of your integration", + "type": "string", + "minLength": 50, + "maxLength": 2048, + "pattern": "^(.*)$" + }, + "author": { + "$id": "#/properties/author", + "title": "Author", + "description": "Name of the author or organization responsible for the integration", + "type": "string", + "minLength": 3, + "maxLength": 100, + "pattern": "^(.*)$" + }, + "supportEmail": { + "$id": "#/properties/links/support-email", + "title": "Support Email", + "description": "Email address for your integration's support", + "type": "string", + "format": "email" + }, + "links": { + "$id": "#/properties/links", + "title": "Links", + "description": "A set of reference links supporting your integration", + "type": "object", + "propertyNames": { + "enum": ["site", "privacyPolicy", "supportWebsite"] + }, + "properties": { + "site": { + "$id": "#/properties/links/site", + "title": "Website", + "description": "URL to your website", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "privacyPolicy": { + "$id": "#/properties/links/privacy-policy", + "title": "Privacy Policy", + "description": "URL to your organization's privacy policy", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "supportWebsite": { + "$id": "#/properties/links/support-website", + "title": "Support Website", + "description": "URL to your integration's support website", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + } + }, + "required": ["site", "privacyPolicy"] + }, + "categories": { + "$id": "#/properties/categories", + "title": "Categories", + "description": "Categories that describe your integration", + "type": "array", + "uniqueItems": true, + "minItems": 1, + "maxItems": 3, + "items": { + "type": "string", + "enum": [ + "authentication", + "automation", + "collaboration", + "configuration", + "data", + "developer-tools", + "infrastructure", + "task-management", + "monitoring", + "notifications", + "product-tools", + "version-control" + ] + } + }, + "icons": { + "$id": "#/properties/icons", + "title": "Icons", + "description": "Logos describing your integration in SVG format", + "type": "object", + "propertyNames": { + "enum": ["square", "horizontal"] + }, + "properties": { + "square": { + "$id": "#/properties/icons/square", + "title": "Square logo", + "description": "A square version of your integration's logo in SVG format", + "type": "string", + "pattern": "\\.svg$" + }, + "horizontal": { + "$id": "#/properties/icons/horizontal", + "title": "Horizontal logo", + "description": "A horizontal version of your integration's logo in SVG format", + "type": "string", + "pattern": "\\.svg$" + } + }, + "required": ["square", "horizontal"] + }, + "formVariables": { + "$id": "#/properties/formVariables", + "title": "Form variables", + "description": "Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`.", + "type": "array", + "items": { + "$id": "#/properties/formVariables/variable", + "title": "Form variable", + "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "description", + "placeholder", + "isSecret", + "isOptional", + "defaultValue", + "allowedValues" + ] + }, + "properties": { + "key": { + "$id": "#/properties/formVariables/variable/key", + "title": "Key", + "type": "string", + "description": "A key will be used as the token name when the variable is substituted", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "name": { + "$id": "#/properties/formVariables/variable/name", + "title": "Name", + "type": "string", + "description": "A descriptive name that will be used as the form label on the UI", + "maxLength": 50 + }, + "type": { + "$id": "#/properties/formVariables/variable/type", + "title": "Type", + "type": "string", + "description": "The type of the variable", + "enum": ["string", "boolean", "uri", "enum"] + }, + "description": { + "$id": "#/properties/formVariables/variable/description", + "title": "Description", + "type": "string", + "description": "Describes the variable in the UI. Markdown links allowed.", + "maxLength": 250 + }, + "placeholder": { + "$id": "#/properties/formVariables/variable/placeholder", + "title": "Description", + "type": "string", + "description": "Placeholder value to use in the form element if applicable" + }, + "isSecret": { + "$id": "#/properties/formVariables/variable/is-secret", + "title": "Is this variable a secret?", + "type": "boolean", + "description": "Secret variables will be masked in the UI", + "default": false + }, + "isOptional": { + "$id": "#/properties/formVariables/variable/is-optional", + "title": "Is this variable optional?", + "type": "boolean", + "description": "Variables marked as optional won't be required on the UI", + "default": false + }, + "defaultValue": { + "$id": "#/properties/formVariables/variable/default-value", + "title": "Default value", + "type": ["boolean", "string"], + "description": "Default value for variable. Can be overridden by user in the UI" + }, + "allowedValues": { + "$id": "#/properties/formVariables/variable/allowed-values", + "title": "Allowed values", + "type": "array", + "description": "allowed string values for enum-type formVariables", + "items": { + "type": "string" + } + } + }, + "required": ["key", "name", "type", "description"] + }, + "default": [] + }, + "capabilities": { + "$id": "#/properties/capabilities", + "title": "Capabilities", + "description": "Specify which capabilities you'd like your integration to have", + "type": "object", + "propertyNames": { + "enum": ["auditLogEventsHook", "reservedCustomProperties"] + }, + "properties": { + "auditLogEventsHook": { + "$ref": "schemas/capabilities/auditLogEventsHook.json#/auditLogEventsHook" + }, + "reservedCustomProperties": { + "$ref": "schemas/capabilities/reservedCustomProperties.json#/reservedCustomProperties" + } + } + } + }, + "required": [ + "name", + "version", + "overview", + "description", + "author", + "supportEmail", + "links", + "categories", + "icons" + ] +} diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json new file mode 100644 index 00000000..df042214 --- /dev/null +++ b/schemas/capabilities/auditLogEventsHook.json @@ -0,0 +1,206 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "auditLogEventsHook": { + "$id": "#/properties/capability/audit-log-events-hook", + "title": "Audit Log Events Hook", + "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", + "type": "object", + "propertyNames": { + "enum": ["endpoint", "templates", "defaultPolicy"] + }, + "properties": { + "endpoint": { + "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", + "title": "Endpoint", + "description": "Properties that describe the HTTP endpoint LaunchDarkly will send hooks to", + "type": "object", + "propertyNames": { + "enum": ["url", "method", "headers"] + }, + "properties": { + "url": { + "$id": "#/properties/capability/audit-log-events-hook/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url.", + "minLength": 3 + }, + "method": { + "$id": "#/properties/capability/audit-log-events-hook/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": ["POST", "PUT", "PATCH"], + "default": "POST" + }, + "headers": { + "$id": "#/properties/capability/audit-log-events-hook/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/properties/capability/audit-log-events-hook/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": ["name", "value"] + }, + "properties": { + "name": { + "$id": "#/properties/fcapability/audit-log-events-hook/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/properties/fcapability/audit-log-events-hook/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": ["name", "value"] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": ["url"] + }, + "templates": { + "$id": "#/properties/capability/audit-log-events-hook/templates", + "title": "Webhook body template", + "description": "Templates to use for body of the webhook request", + "type": "object", + "propertyNames": { + "enum": ["flag", "project", "environment", "default"] + }, + "properties": { + "flag": { + "$id": "#/properties/capability/audit-log-events-hook/templates/flag", + "title": "Flag template", + "description": "Template to use for flag events", + "type": "string" + }, + "project": { + "$id": "#/properties/capability/audit-log-events-hook/templates/project", + "title": "Project template", + "description": "Template to use for project events", + "type": "string" + }, + "environment": { + "$id": "#/properties/capability/audit-log-events-hook/templates/environment", + "title": "Environment template", + "description": "Template to use for environment events", + "type": "string" + }, + "default": { + "$id": "#/properties/capability/audit-log-events-hook/templates/default", + "title": "default template", + "description": "Template to use if the event does not have a corresponding named template", + "type": "string" + } + } + }, + "defaultPolicy": { + "$id": "#/properties/capability/audit-log-events-hook/default-policy", + "title": "Default Policy", + "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "array", + "minItems": 1, + "items": { + "$id": "#/properties/capability/audit-log-events-hook/policy", + "title": "Policy", + "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "type": "object", + "propertyNames": { + "enum": [ + "actions", + "effect", + "notActions", + "notResources", + "resources" + ] + }, + "properties": { + "actions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/actions", + "title": "Actions", + "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": ["*"], + "examples": [ + "updateOn", + "createFlag", + "updateRules", + "updateTargets" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "effect": { + "$id": "#/properties/capability/audit-log-events-hook/policy/effect", + "title": "Effect", + "description": "This attribute defines whether the statement allows or denies access to the named resources and actions.", + "default": "allow", + "type": "string", + "enum": ["allow", "deny"] + }, + "notActions": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", + "title": "Not actions", + "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "default": ["*"], + "examples": ["createFlag", "deleteFlag", "cloneFlag"], + "type": "array", + "items": { + "type": "string" + } + }, + "notResources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", + "title": "Not resources", + "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": ["*"], + "examples": ["proj/*:env/production:flag/*"], + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "$id": "#/properties/capability/audit-log-events-hook/policy/resources", + "title": "Resources", + "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "default": ["*"], + "examples": ["proj/*:env/production:flag/*"], + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "required": ["endpoint", "templates"] + } +} diff --git a/schemas/capabilities/reservedCustomProperties.json b/schemas/capabilities/reservedCustomProperties.json new file mode 100644 index 00000000..a254bdda --- /dev/null +++ b/schemas/capabilities/reservedCustomProperties.json @@ -0,0 +1,33 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "reservedCustomProperties": { + "$id": "#/properties/capability/reserved-custom-properties", + "title": "Reserved custom properties", + "description": "This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/advanced/custom-properties for more information on custom properties", + "type": "array", + "items": { + "$id": "#/properties/capability/reserved-custom-properties/items", + "type": "object", + "propertyNames": { "enum": ["name", "key"] }, + "properties": { + "name": { + "$id": "#/properties/capability/reserved-custom-properties/items/name", + "title": "Name", + "type": "string", + "description": "The reserved custom property's display name.", + "maxLength": 64 + }, + "key": { + "$id": "#/properties/capability/reserved-custom-properties/items/key", + "title": "Key", + "type": "string", + "description": "The custom property's API response key.", + "maxLength": 64 + } + }, + "required": ["name", "key"] + }, + "minLength": 1, + "maxLength": 3 + } +} From 09466db088a90f51d7e540a031d7a42e25355165 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 25 Mar 2020 16:42:08 +0000 Subject: [PATCH 215/936] Add Datadog V2 integration (#61) * Add datadog V2 integration * Modify tags * Add more tags and specific templates for project and environment --- __tests__/validate.js | 8 +-- integrations/datadog/README.md | 10 +++ integrations/datadog/assets/horizontal.svg | 64 +++++++++++++++++++ integrations/datadog/assets/square.svg | 41 ++++++++++++ integrations/datadog/manifest.json | 60 +++++++++++++++++ .../datadog/templates/default.json.hbs | 25 ++++++++ .../datadog/templates/environment.json.hbs | 24 +++++++ .../datadog/templates/project.json.hbs | 23 +++++++ preview.js | 2 +- .../flag/targeting-rule-update.json | 16 ++++- sample-context/flag/toggle.json | 14 ++++ .../flag/update-all-environments.json | 6 +- 12 files changed, 285 insertions(+), 8 deletions(-) create mode 100644 integrations/datadog/README.md create mode 100644 integrations/datadog/assets/horizontal.svg create mode 100644 integrations/datadog/assets/square.svg create mode 100644 integrations/datadog/manifest.json create mode 100644 integrations/datadog/templates/default.json.hbs create mode 100644 integrations/datadog/templates/environment.json.hbs create mode 100644 integrations/datadog/templates/project.json.hbs diff --git a/__tests__/validate.js b/__tests__/validate.js index 31f9492b..99cf8940 100644 --- a/__tests__/validate.js +++ b/__tests__/validate.js @@ -159,7 +159,7 @@ describe('All integrations', () => { ); const defaultTemplatePath = _.get( manifest, - 'capabilities.auditLogEventsHook.templates.metric', + 'capabilities.auditLogEventsHook.templates.default', null ); if (flagTemplatePath) { @@ -227,14 +227,12 @@ describe('All integrations', () => { } } if (defaultTemplatePath) { - expect(existsSync(`./integrations/${key}/${defaultTemplatePath}`)).toBe( - true - ); const path = `./integrations/${key}/${defaultTemplatePath}`; expect(existsSync(path)).toBe(true); + expect(existsSync(path)).toBe(true); const template = getTemplate(path); - const isJSON = isJSONTemplate(flagTemplatePath); + const isJSON = isJSONTemplate(defaultTemplatePath); const fullContext = getFullContext(manifest, flagContext, isJSON); expect( () => template(fullContext), diff --git a/integrations/datadog/README.md b/integrations/datadog/README.md new file mode 100644 index 00000000..9767165a --- /dev/null +++ b/integrations/datadog/README.md @@ -0,0 +1,10 @@ +# Datadog + +[User documentation](https://docs.launchdarkly.com/integrations/datadog) + +[API documentation](https://docs.datadoghq.com/api/?lang=bash#events) + +Run `npm run curl datadog` in the root repository directory to generate a `curl` command to send data to Datadog. + + +**Note:** This integration currently lives alongside the "legacy" Datadog integration. This integration should not be enabled in production until all legacy subscriptions have been migrated diff --git a/integrations/datadog/assets/horizontal.svg b/integrations/datadog/assets/horizontal.svg new file mode 100644 index 00000000..de5ec9d6 --- /dev/null +++ b/integrations/datadog/assets/horizontal.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/datadog/assets/square.svg b/integrations/datadog/assets/square.svg new file mode 100644 index 00000000..f39a6ac1 --- /dev/null +++ b/integrations/datadog/assets/square.svg @@ -0,0 +1,41 @@ + + + + + + diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json new file mode 100644 index 00000000..a4983cd4 --- /dev/null +++ b/integrations/datadog/manifest.json @@ -0,0 +1,60 @@ +{ + "name": "Datadog V2", + "version": "1.0.0", + "overview": "Monitor LaunchDarkly changes in Datadog", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Datadog.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/datadog", + "privacyPolicy": "https://www.datadoghq.com/legal/privacy" + }, + "categories": ["monitoring", "notifications"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + { + "key": "apiKey", + "name": "Datadog API key", + "type": "string", + "description": "Enter your Datadog [API key](https://app.datadoghq.com/account/settings#api).", + "isSecret": true + } + ], + "capabilities": { + "reservedCustomProperties": [ + { + "name": "Datadog tags", + "key": "datadog" + } + ], + "auditLogEventsHook": { + "endpoint": { + "url": "https://api.datadoghq.com/api/v1/events", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "DD-API-KEY", + "value": "{{apiKey}}" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/datadog/templates/default.json.hbs b/integrations/datadog/templates/default.json.hbs new file mode 100644 index 00000000..adcffe14 --- /dev/null +++ b/integrations/datadog/templates/default.json.hbs @@ -0,0 +1,25 @@ +{ + "title": "{{{title.plainText}}}", + "text": "{{#if details.plainText}}{{{details.plainText}}}{{#if comment}}\n{{/if}}{{/if}}{{#if comment}}comment: {{comment}}{{/if}}", + "date_happened": {{timestamp.seconds}}, + "tags": [ + {{#if customProperties}} + {{#if customProperties.datadog}} + {{#if customProperties.datadog.values}} + {{#with customProperties}} + {{#each datadog.values}} + "{{{this}}}", + {{/each}} + {{/with}} + {{/if}}{{/if}}{{/if}} + {{#each tags}} + "{{{this}}}", + {{/each}} + {{#if project.key}}"project_key:{{project.key}}", + {{#if project.environment.key}}"environment_key:{{project.environment.key}}",{{/if}}{{/if}} + "{{kind}}_key:{{key}}", + "action:{{verbKind}}", + "member:{{member.email}}" + ], + "source_type_name": "launchdarkly" +} diff --git a/integrations/datadog/templates/environment.json.hbs b/integrations/datadog/templates/environment.json.hbs new file mode 100644 index 00000000..b493485c --- /dev/null +++ b/integrations/datadog/templates/environment.json.hbs @@ -0,0 +1,24 @@ +{ + "title": "{{{title.plainText}}}", + "text": "{{#if details.plainText}}{{{details.plainText}}}{{#if comment}}\n{{/if}}{{/if}}{{#if comment}}comment: {{comment}}{{/if}}", + "date_happened": {{timestamp.seconds}}, + "tags": [ + {{#if customProperties}} + {{#if customProperties.datadog}} + {{#if customProperties.datadog.values}} + {{#with customProperties}} + {{#each datadog.values}} + "{{{this}}}", + {{/each}} + {{/with}} + {{/if}}{{/if}}{{/if}} + {{#each tags}} + "{{{this}}}", + {{/each}} + "project_key:{{project.key}}", + "environment_key:{{key}}", + "action:{{verbKind}}", + "member:{{member.email}}" + ], + "source_type_name": "launchdarkly" +} diff --git a/integrations/datadog/templates/project.json.hbs b/integrations/datadog/templates/project.json.hbs new file mode 100644 index 00000000..4f0f2745 --- /dev/null +++ b/integrations/datadog/templates/project.json.hbs @@ -0,0 +1,23 @@ +{ + "title": "{{{title.plainText}}}", + "text": "{{#if details.plainText}}{{{details.plainText}}}{{#if comment}}\n{{/if}}{{/if}}{{#if comment}}comment: {{comment}}{{/if}}", + "date_happened": {{timestamp.seconds}}, + "tags": [ + {{#if customProperties}} + {{#if customProperties.datadog}} + {{#if customProperties.datadog.values}} + {{#with customProperties}} + {{#each datadog.values}} + "{{{this}}}", + {{/each}} + {{/with}} + {{/if}}{{/if}}{{/if}} + {{#each tags}} + "{{{this}}}", + {{/each}} + {{#if project.key}}"project_key:{{project.key}}", + "action:{{verbKind}}", + "member:{{member.email}}" + ], + "source_type_name": "launchdarkly" +} diff --git a/preview.js b/preview.js index 15e5ffe8..fd97ce0f 100644 --- a/preview.js +++ b/preview.js @@ -5,7 +5,7 @@ const _ = require('lodash'); const { registerHelpers } = require('./helpers'); const jsonEscape = require('./utils/json-escape'); -const testFileName = 'update-all-environments.json'; +const testFileName = 'targeting-rule-update.json'; const flagUpdateContext = require(`./sample-context/flag/${testFileName}`); // Update the context to have a more recent timestamp. This is important diff --git a/sample-context/flag/targeting-rule-update.json b/sample-context/flag/targeting-rule-update.json index a33c4f79..b1e33203 100644 --- a/sample-context/flag/targeting-rule-update.json +++ b/sample-context/flag/targeting-rule-update.json @@ -43,7 +43,21 @@ } }, "key": "demo-flag", - "tags": [], + "tags": ["ops", "security"], + "customProperties": { + "dynatrace": { + "name": "Dynatrace tags", + "values": ["test1", "test2"] + }, + "datadog": { + "name": "Datadog tags", + "values": ["dd1", "dd2"] + }, + "jira": { + "name": "Jira", + "values": ["thing1", "thing2"] + } + }, "member": { "_links": { "parent": { diff --git a/sample-context/flag/toggle.json b/sample-context/flag/toggle.json index b4d10491..b7fe777a 100644 --- a/sample-context/flag/toggle.json +++ b/sample-context/flag/toggle.json @@ -44,6 +44,20 @@ }, "key": "demo-flag", "tags": [], + "customProperties": { + "dynatrace": { + "name": "Dynatrace tags", + "values": ["test1", "test2"] + }, + "datadog": { + "name": "Datadog tags", + "values": ["dd1", "dd2"] + }, + "jira": { + "name": "Jira", + "values": ["thing1", "thing2"] + } + }, "member": { "_links": { "parent": { diff --git a/sample-context/flag/update-all-environments.json b/sample-context/flag/update-all-environments.json index b733d623..1a49c786 100644 --- a/sample-context/flag/update-all-environments.json +++ b/sample-context/flag/update-all-environments.json @@ -46,9 +46,13 @@ "tags": [], "customProperties": { "dynatrace": { - "name": "Dynatrace", + "name": "Dynatrace tags", "values": ["test1", "test2"] }, + "datadog": { + "name": "Datadog tags", + "values": ["dd1", "dd2"] + }, "jira": { "name": "Jira", "values": ["thing1", "thing2"] From 113e69bc217d5a2a683dfa241a69f5487da21a68 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 26 Mar 2020 09:38:42 +0000 Subject: [PATCH 216/936] Add external condition to the manifest schema (#63) * Add support for split files and move reserved custom properties * Move auditLogEvents hook to new file * Add external condition to manifest and add sample external condition to sample-integration * remove test file * Usse JSON pointer in description * Address PR feedback * Remove arbitrary minLength --- .vscode/settings.json | 3 +- integrations/sample-integration/manifest.json | 16 ++ .../parsers/ticket-creation.json | 4 + .../ticket-creation-request.json.hbs | 0 manifest.schema.json | 144 +++++++++++++++++- schemas/base.json | 9 +- schemas/capabilities/auditLogEventsHook.json | 3 +- schemas/capabilities/externalCondition.json | 113 ++++++++++++++ 8 files changed, 285 insertions(+), 7 deletions(-) create mode 100644 integrations/sample-integration/parsers/ticket-creation.json create mode 100644 integrations/sample-integration/templates/ticket-creation-request.json.hbs create mode 100644 schemas/capabilities/externalCondition.json diff --git a/.vscode/settings.json b/.vscode/settings.json index 90b58cad..a2d8489b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,6 @@ "fileMatch": ["manifest.json"], "url": "./manifest.schema.json" } - ] + ], + "editor.tabSize": 2 } diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 381623c5..182493f3 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -92,6 +92,22 @@ "actions": ["*"] } ] + }, + "externalCondition": { + "creation": { + "endpoint": { + "url": "https://example.com/create-condition", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "template": "templates/ticket-creation-request.json.hbs", + "parser": "parsers/ticket-creation.json" + } } } } diff --git a/integrations/sample-integration/parsers/ticket-creation.json b/integrations/sample-integration/parsers/ticket-creation.json new file mode 100644 index 00000000..6baab538 --- /dev/null +++ b/integrations/sample-integration/parsers/ticket-creation.json @@ -0,0 +1,4 @@ +{ + "id": "/id", + "url": "/links/self/href" +} diff --git a/integrations/sample-integration/templates/ticket-creation-request.json.hbs b/integrations/sample-integration/templates/ticket-creation-request.json.hbs new file mode 100644 index 00000000..e69de29b diff --git a/manifest.schema.json b/manifest.schema.json index d0db669b..bab83ebc 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -292,7 +292,8 @@ "propertyNames": { "enum": [ "auditLogEventsHook", - "reservedCustomProperties" + "reservedCustomProperties", + "externalCondition" ] }, "properties": { @@ -326,8 +327,7 @@ "$id": "#/properties/capability/audit-log-events-hook/url", "title": "URL", "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url.", - "minLength": 3 + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." }, "method": { "$id": "#/properties/capability/audit-log-events-hook/method", @@ -583,6 +583,144 @@ }, "minLength": 1, "maxLength": 3 + }, + "externalCondition": { + "$id": "#/properties/capability/external-condition", + "title": "External condition", + "description": "This capability is used to manage external feature workflow conditions", + "type": "object", + "propertyNames": { + "enum": [ + "creation" + ] + }, + "required": [ + "creation" + ], + "properties": { + "creation": { + "$id": "#/properties/capability/external-condition/creation", + "title": "Creation", + "description": "Properties that describe a request to an integration-controlled API endpoint to establish the external condition", + "type": "object", + "propertyNames": { + "enum": [ + "endpoint", + "template", + "parser" + ] + }, + "required": [ + "endpoint", + "template", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/properties/capability/external-condition/creation/endpoint", + "title": "Creation endpoint", + "description": "Properties that describe the HTTP endpoint LaunchDarkly will use to create an external condition", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "required": [ + "url" + ], + "properties": { + "url": { + "$id": "#/properties/capability/external-condition/creation/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/properties/capability/external-condition/creation/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH" + ], + "default": "POST" + }, + "headers": { + "$id": "#/properties/capability/external-condition/creation/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/properties/capability/external-condition/creation/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/properties/capability/external-condition/creation/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/properties/capability/external-condition/creation/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + } + }, + "template": { + "$id": "#/properties/capability/external-condition/creation/template", + "title": "Creation template", + "description": "Relative path to template used to render external condition creation request body", + "type": "string" + }, + "parser": { + "$id": "#/properties/capability/external-condition/creation/parser", + "title": "Creation parser", + "description": "Relative path to JSON object containing mappings of attributes to JSON pointer statements", + "type": "string" + } + } + } + } } } } diff --git a/schemas/base.json b/schemas/base.json index d38062b6..e172152d 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -260,7 +260,11 @@ "description": "Specify which capabilities you'd like your integration to have", "type": "object", "propertyNames": { - "enum": ["auditLogEventsHook", "reservedCustomProperties"] + "enum": [ + "auditLogEventsHook", + "reservedCustomProperties", + "externalCondition" + ] }, "properties": { "auditLogEventsHook": { @@ -268,6 +272,9 @@ }, "reservedCustomProperties": { "$ref": "schemas/capabilities/reservedCustomProperties.json#/reservedCustomProperties" + }, + "externalCondition": { + "$ref": "schemas/capabilities/externalCondition.json#/externalCondition" } } } diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index df042214..e53fcd9d 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -22,8 +22,7 @@ "$id": "#/properties/capability/audit-log-events-hook/url", "title": "URL", "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url.", - "minLength": 3 + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." }, "method": { "$id": "#/properties/capability/audit-log-events-hook/method", diff --git a/schemas/capabilities/externalCondition.json b/schemas/capabilities/externalCondition.json new file mode 100644 index 00000000..584f587b --- /dev/null +++ b/schemas/capabilities/externalCondition.json @@ -0,0 +1,113 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "externalCondition": { + "$id": "#/properties/capability/external-condition", + "title": "External condition", + "description": "This capability is used to manage external feature workflow conditions", + "type": "object", + "propertyNames": { + "enum": ["creation"] + }, + "required": ["creation"], + "properties": { + "creation": { + "$id": "#/properties/capability/external-condition/creation", + "title": "Creation", + "description": "Properties that describe a request to an integration-controlled API endpoint to establish the external condition", + "type": "object", + "propertyNames": { + "enum": ["endpoint", "template", "parser"] + }, + "required": ["endpoint", "template", "parser"], + "properties": { + "endpoint": { + "$id": "#/properties/capability/external-condition/creation/endpoint", + "title": "Creation endpoint", + "description": "Properties that describe the HTTP endpoint LaunchDarkly will use to create an external condition", + "type": "object", + "propertyNames": { + "enum": ["url", "method", "headers"] + }, + "required": ["url"], + "properties": { + "url": { + "$id": "#/properties/capability/external-condition/creation/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/properties/capability/external-condition/creation/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": ["POST", "PUT", "PATCH"], + "default": "POST" + }, + "headers": { + "$id": "#/properties/capability/external-condition/creation/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/properties/capability/external-condition/creation/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": ["name", "value"] + }, + "properties": { + "name": { + "$id": "#/properties/capability/external-condition/creation/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/properties/capability/external-condition/creation/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": ["name", "value"] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + } + }, + "template": { + "$id": "#/properties/capability/external-condition/creation/template", + "title": "Creation template", + "description": "Relative path to template used to render external condition creation request body", + "type": "string" + }, + "parser": { + "$id": "#/properties/capability/external-condition/creation/parser", + "title": "Creation parser", + "description": "Relative path to JSON object containing mappings of attributes to JSON pointer statements", + "type": "string" + } + } + } + } + } +} From 6819ff53f66e21ad3c7328f9feb2e147b41f26d1 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 27 Mar 2020 14:02:46 +0000 Subject: [PATCH 217/936] Add parser schema, sampleResponse, and tests (#64) * Add support for split files and move reserved custom properties * Move auditLogEvents hook to new file * Add external condition to manifest and add sample external condition to sample-integration * remove test file * Usse JSON pointer in description * Move manifest schema up a directory * Add parser schema to parser script and update VS code settings * Update url * Add sample response * Add JSON pointer tests * Add tests for template file * Address PR feedback * Adjust template regex pattern * Remove arbitrary minLength * Move parser into manifest --- .vscode/settings.json | 4 ++ __tests__/validateExternalCondition.js | 71 +++++++++++++++++++ bundleSchema.js => bundleSchemas.js | 6 +- integrations/sample-integration/manifest.json | 6 +- .../parsers/ticket-creation.json | 4 -- .../sample-responses/ticket-creation.json | 9 +++ manifest.schema.json | 38 ++++++++-- package-lock.json | 6 ++ package.json | 3 +- schemas/capabilities/externalCondition.json | 16 +++-- schemas/capabilities/parser/parser.json | 23 ++++++ 11 files changed, 165 insertions(+), 21 deletions(-) create mode 100644 __tests__/validateExternalCondition.js rename bundleSchema.js => bundleSchemas.js (57%) delete mode 100644 integrations/sample-integration/parsers/ticket-creation.json create mode 100644 integrations/sample-integration/sample-responses/ticket-creation.json create mode 100644 schemas/capabilities/parser/parser.json diff --git a/.vscode/settings.json b/.vscode/settings.json index a2d8489b..f14af75b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,10 @@ { "fileMatch": ["manifest.json"], "url": "./manifest.schema.json" + }, + { + "fileMatch": ["/**/parsers/*.json"], + "url": "./parser.schema.json" } ], "editor.tabSize": 2 diff --git a/__tests__/validateExternalCondition.js b/__tests__/validateExternalCondition.js new file mode 100644 index 00000000..85c19663 --- /dev/null +++ b/__tests__/validateExternalCondition.js @@ -0,0 +1,71 @@ +const { readdirSync, existsSync, readFileSync } = require('fs'); +const _ = require('lodash'); +const jsonpointer = require('jsonpointer'); + +const getDirectories = source => + readdirSync(source, { withFileTypes: true }) + .filter(dir => dir.isDirectory()) + .map(dir => dir.name); + +let manifests = []; + +const integrationDirs = getDirectories('integrations'); +integrationDirs.forEach(dir => { + const manifest = require(`../integrations/${dir}/manifest.json`); + manifests.push([dir, manifest]); +}); + +externalConditionManifests = manifests.filter(manifest => { + return _.get(manifest[1], 'capabilities.externalCondition', null) !== null; +}); + +describe('All externalCondition integrations', () => { + test.each(externalConditionManifests)( + 'Validate %s externalCondition', + (key, manifest) => { + // Validate creation parser is defined + const creationParser = _.get( + manifest, + 'capabilities.externalCondition.creation.parser', + undefined + ); + expect( + creationParser, + `${key}: creation parser must be defined` + ).toBeDefined(); + + // Validate sample response exists and matches up with the parser + const sampleResponsePath = _.get( + manifest, + 'capabilities.externalCondition.creation.sampleResponse', + undefined + ); + const fullResponsePath = `./integrations/${key}/${sampleResponsePath}`; + expect( + existsSync(fullResponsePath), + `${key}: sample response file must exist` + ).toBe(true); + + const sampleResponse = require('.' + fullResponsePath); + _.forIn(creationParser, (pointer, k) => { + responseValue = jsonpointer.get(sampleResponse, pointer); + expect( + responseValue, + `${key}: ${k} pointer ${pointer} must point to a value in the sample response` + ).toBeDefined(); + }); + + // Validate the template path is correct + const templatePath = _.get( + manifest, + 'capabilities.externalCondition.creation.template', + undefined + ); + const fullTemplatePath = `./integrations/${key}/${templatePath}`; + expect( + existsSync(fullTemplatePath), + `${key}: creation template file must exist` + ).toBe(true); + } + ); +}); diff --git a/bundleSchema.js b/bundleSchemas.js similarity index 57% rename from bundleSchema.js rename to bundleSchemas.js index cb432cd8..45183476 100644 --- a/bundleSchema.js +++ b/bundleSchemas.js @@ -1,14 +1,14 @@ const fs = require('fs'); const $RefParser = require('@apidevtools/json-schema-ref-parser'); -const baseSchema = require('./schemas/base.json'); +const manifestBaseSchema = require('./schemas/base.json'); const bundle = async () => { try { - const schema = await $RefParser.bundle(baseSchema); + const manifestSchema = await $RefParser.bundle(manifestBaseSchema); fs.writeFileSync( 'manifest.schema.json', - JSON.stringify(schema, null, 2) + '\n' + JSON.stringify(manifestSchema, null, 2) + '\n' ); } catch (e) { console.error(e); diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 182493f3..37bb779a 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -106,7 +106,11 @@ ] }, "template": "templates/ticket-creation-request.json.hbs", - "parser": "parsers/ticket-creation.json" + "parser": { + "id": "/id", + "url": "/links/self/href" + }, + "sampleResponse": "sample-responses/ticket-creation.json" } } } diff --git a/integrations/sample-integration/parsers/ticket-creation.json b/integrations/sample-integration/parsers/ticket-creation.json deleted file mode 100644 index 6baab538..00000000 --- a/integrations/sample-integration/parsers/ticket-creation.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "id": "/id", - "url": "/links/self/href" -} diff --git a/integrations/sample-integration/sample-responses/ticket-creation.json b/integrations/sample-integration/sample-responses/ticket-creation.json new file mode 100644 index 00000000..a350c895 --- /dev/null +++ b/integrations/sample-integration/sample-responses/ticket-creation.json @@ -0,0 +1,9 @@ +{ + "id": "e207f6bc-75d0-4142-98f1-ee102d0ca6ca", + "extra_field": "this is some extra response data", + "links": { + "self": { + "href": "https://example.com/ticket/e207f6bc-75d0-4142-98f1-ee102d0ca6ca" + } + } +} diff --git a/manifest.schema.json b/manifest.schema.json index bab83ebc..268f57f7 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -607,13 +607,15 @@ "enum": [ "endpoint", "template", - "parser" + "parser", + "sampleResponse" ] }, "required": [ "endpoint", "template", - "parser" + "parser", + "sampleResponse" ], "properties": { "endpoint": { @@ -713,10 +715,34 @@ "type": "string" }, "parser": { - "$id": "#/properties/capability/external-condition/creation/parser", - "title": "Creation parser", - "description": "Relative path to JSON object containing mappings of attributes to JSON pointer statements", - "type": "string" + "$id": "#/parser", + "title": "Response parser schema", + "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "$id": "#/properties/id", + "title": "JSON Pointer to external condition ID", + "type": "string" + }, + "url": { + "$id": "#/properties/url", + "title": "JSON Pointer to external condition url", + "type": "string" + } + }, + "required": [ + "id", + "url" + ] + }, + "sampleResponse": { + "$id": "#/properties/capability/external-condition/creation/sample-response", + "title": "Sample successful creation response", + "description": "relative path to sample JSON formatted response", + "type": "string", + "pattern": ".*\\.json$" } } } diff --git a/package-lock.json b/package-lock.json index aef284e2..4cf476e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2809,6 +2809,12 @@ } } }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", diff --git a/package.json b/package.json index 1643b4e1..e15a1449 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "jest", - "build": "node bundleSchema.js && prettier --write manifest.schema.json", + "build": "node bundleSchemas.js && prettier --write ./*.schema.json", "prettier:check": "prettier --list-different \"./**/*.{js,json}\"", "prettier:write": "prettier --write \"./**/*.{js,json}\"", "preview": "node preview.js", @@ -32,6 +32,7 @@ "handlebars": "4.7.3", "jest": "25.1.0", "jest-expect-message": "1.0.2", + "jsonpointer": "^4.0.1", "lodash": "^4.17.15", "prettier": "^2.0.1" } diff --git a/schemas/capabilities/externalCondition.json b/schemas/capabilities/externalCondition.json index 584f587b..6e61546b 100644 --- a/schemas/capabilities/externalCondition.json +++ b/schemas/capabilities/externalCondition.json @@ -16,9 +16,9 @@ "description": "Properties that describe a request to an integration-controlled API endpoint to establish the external condition", "type": "object", "propertyNames": { - "enum": ["endpoint", "template", "parser"] + "enum": ["endpoint", "template", "parser", "sampleResponse"] }, - "required": ["endpoint", "template", "parser"], + "required": ["endpoint", "template", "parser", "sampleResponse"], "properties": { "endpoint": { "$id": "#/properties/capability/external-condition/creation/endpoint", @@ -101,10 +101,14 @@ "type": "string" }, "parser": { - "$id": "#/properties/capability/external-condition/creation/parser", - "title": "Creation parser", - "description": "Relative path to JSON object containing mappings of attributes to JSON pointer statements", - "type": "string" + "$ref": "parser/parser.json#/parser" + }, + "sampleResponse": { + "$id": "#/properties/capability/external-condition/creation/sample-response", + "title": "Sample successful creation response", + "description": "relative path to sample JSON formatted response", + "type": "string", + "pattern": ".*\\.json$" } } } diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json new file mode 100644 index 00000000..b50d53f7 --- /dev/null +++ b/schemas/capabilities/parser/parser.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "parser": { + "$id": "#/parser", + "title": "Response parser schema", + "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "$id": "#/properties/id", + "title": "JSON Pointer to external condition ID", + "type": "string" + }, + "url": { + "$id": "#/properties/url", + "title": "JSON Pointer to external condition url", + "type": "string" + } + }, + "required": ["id", "url"] + } +} From 011bf372e9b79794c13d6d292c53b609e97ec88f Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 30 Mar 2020 13:59:38 +0100 Subject: [PATCH 218/936] Rename Parser (#66) --- manifest.schema.json | 2 +- schemas/capabilities/parser/parser.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.schema.json b/manifest.schema.json index 268f57f7..467ad7c1 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -716,7 +716,7 @@ }, "parser": { "$id": "#/parser", - "title": "Response parser schema", + "title": "Response parser", "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", "type": "object", "additionalProperties": false, diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index b50d53f7..5307d09d 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "parser": { "$id": "#/parser", - "title": "Response parser schema", + "title": "Response parser", "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", "type": "object", "additionalProperties": false, From 0785dd1903b7a9893857e3d3689fa7ff0291f22b Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Mon, 30 Mar 2020 10:30:41 -0700 Subject: [PATCH 219/936] Create manifest.json adding Sleuth manifest --- integrations/sleuth/manifest.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 integrations/sleuth/manifest.json diff --git a/integrations/sleuth/manifest.json b/integrations/sleuth/manifest.json new file mode 100644 index 00000000..ee48b62b --- /dev/null +++ b/integrations/sleuth/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Sleuth", + "version": "1.0.0", + "overview": "Track feature flags as a source of change in your DevOps stack", + "description": "Sleuth's native LaunchDarkly integration tracks the status and impact of feature flags relative to other source changes in your projects, such as code, issues, etc. With the Sleuth integration, Sleuth can capture the full state of feature flags at deployment time. This helps you keep track of the affected code deploys, what environment the change occurred in, who changed the flag, and flag descriptions and flag value states, both before and after code deploys.", + "author": "Sleuth", + "supportEmail": "support@sleuth.io", + "links": { + "site": "https://www.sleuth.io/post/integrating-launchdarkly-with-sleuth", + "privacyPolicy": "https://www.sleuth.io/privacy" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/images/logo_new_logo_symbol.svg", + "horizontal": "assets/images/logo_new_logo_dark.svg" + } + } From 769c001f6a9c6d5efe0a3775213bd71c3f861167 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Mon, 30 Mar 2020 10:31:24 -0700 Subject: [PATCH 220/936] Create assets --- integrations/sleuth/assets | 1 + 1 file changed, 1 insertion(+) create mode 100644 integrations/sleuth/assets diff --git a/integrations/sleuth/assets b/integrations/sleuth/assets new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/integrations/sleuth/assets @@ -0,0 +1 @@ + From e81c4ec19651b721f5c33dd16caa4cce53650ae8 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Mon, 30 Mar 2020 10:34:10 -0700 Subject: [PATCH 221/936] Delete assets --- integrations/sleuth/assets | 1 - 1 file changed, 1 deletion(-) delete mode 100644 integrations/sleuth/assets diff --git a/integrations/sleuth/assets b/integrations/sleuth/assets deleted file mode 100644 index 8b137891..00000000 --- a/integrations/sleuth/assets +++ /dev/null @@ -1 +0,0 @@ - From c0bdb7fb23463b8a121621a3657d498abe646964 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Mon, 30 Mar 2020 10:35:20 -0700 Subject: [PATCH 222/936] Create text Assets folder --- integrations/sleuth/assets/text | 1 + 1 file changed, 1 insertion(+) create mode 100644 integrations/sleuth/assets/text diff --git a/integrations/sleuth/assets/text b/integrations/sleuth/assets/text new file mode 100644 index 00000000..8e27be7d --- /dev/null +++ b/integrations/sleuth/assets/text @@ -0,0 +1 @@ +text From fc104ab82dc292d7771754640a5f146409498aa6 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Mon, 30 Mar 2020 10:35:37 -0700 Subject: [PATCH 223/936] Add files via upload --- integrations/sleuth/assets/logo_new_logo_dark.svg | 1 + integrations/sleuth/assets/logo_new_logo_mixed.svg | 1 + integrations/sleuth/assets/logo_new_logo_symbol.svg | 1 + integrations/sleuth/assets/logo_new_logo_white.svg | 1 + 4 files changed, 4 insertions(+) create mode 100644 integrations/sleuth/assets/logo_new_logo_dark.svg create mode 100644 integrations/sleuth/assets/logo_new_logo_mixed.svg create mode 100644 integrations/sleuth/assets/logo_new_logo_symbol.svg create mode 100644 integrations/sleuth/assets/logo_new_logo_white.svg diff --git a/integrations/sleuth/assets/logo_new_logo_dark.svg b/integrations/sleuth/assets/logo_new_logo_dark.svg new file mode 100644 index 00000000..9a8e303f --- /dev/null +++ b/integrations/sleuth/assets/logo_new_logo_dark.svg @@ -0,0 +1 @@ +logo_new \ No newline at end of file diff --git a/integrations/sleuth/assets/logo_new_logo_mixed.svg b/integrations/sleuth/assets/logo_new_logo_mixed.svg new file mode 100644 index 00000000..2c8d4fc9 --- /dev/null +++ b/integrations/sleuth/assets/logo_new_logo_mixed.svg @@ -0,0 +1 @@ +logo_new \ No newline at end of file diff --git a/integrations/sleuth/assets/logo_new_logo_symbol.svg b/integrations/sleuth/assets/logo_new_logo_symbol.svg new file mode 100644 index 00000000..a8f4815b --- /dev/null +++ b/integrations/sleuth/assets/logo_new_logo_symbol.svg @@ -0,0 +1 @@ +logo_new \ No newline at end of file diff --git a/integrations/sleuth/assets/logo_new_logo_white.svg b/integrations/sleuth/assets/logo_new_logo_white.svg new file mode 100644 index 00000000..cdc5b176 --- /dev/null +++ b/integrations/sleuth/assets/logo_new_logo_white.svg @@ -0,0 +1 @@ +logo_new \ No newline at end of file From 9c37113545e2af7ff0ed0bed658818db9068a411 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Mon, 30 Mar 2020 10:36:09 -0700 Subject: [PATCH 224/936] Delete text --- integrations/sleuth/assets/text | 1 - 1 file changed, 1 deletion(-) delete mode 100644 integrations/sleuth/assets/text diff --git a/integrations/sleuth/assets/text b/integrations/sleuth/assets/text deleted file mode 100644 index 8e27be7d..00000000 --- a/integrations/sleuth/assets/text +++ /dev/null @@ -1 +0,0 @@ -text From 3a3c1399303f6c6b465879e31142195d9ef68e74 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 1 Apr 2020 16:31:05 +0100 Subject: [PATCH 225/936] Run pre-commit hooks on Circle (#69) * Run pre-commit hooks in circle * Fix EOF and trailing whitespace and move pre-commit-ci.yml * Extend JSON pre-commit pattern --- .circleci/.pre-commit-ci.yaml | 11 +++++++++++ .circleci/config.yml | 3 +++ .pre-commit-config.yaml | 3 ++- integrations/azure-sso/assets/images/horizontal.svg | 2 +- integrations/azure-sso/assets/images/square.svg | 2 +- .../assets/images/bitbucket_horizontal.svg | 2 +- .../assets/images/bitbucket_square.svg | 2 +- .../circleci-coderefs/assets/images/horizontal.svg | 2 +- .../circleci-coderefs/assets/images/square.svg | 2 +- .../gitlab-coderefs/assets/images/horizontal.svg | 2 +- integrations/gitlab-coderefs/assets/images/square.svg | 2 +- integrations/googleapps-sso/assets/images/square.svg | 2 +- .../heap/assets/images/heapanalytics-rect.svg | 2 +- .../heap/assets/images/heapanalytics-square.svg | 2 +- integrations/jira/assets/images/horizontal.svg | 2 +- .../msteams/assets/images/microsoft-teams.svg | 2 +- integrations/onelogin/assets/images/square.svg | 2 +- integrations/pendo/assets/images/pendo_horizontal.svg | 2 +- integrations/signalfx/assets/images/horizontal.svg | 4 ++-- .../terraform/assets/images/terraform_horizontal.svg | 2 +- integrations/trello/assets/images/horizontal.svg | 2 +- integrations/trello/assets/images/square.svg | 2 +- integrations/vscode/assets/images/horizontal.svg | 2 +- integrations/vscode/assets/images/square.svg | 2 +- 24 files changed, 38 insertions(+), 23 deletions(-) create mode 100644 .circleci/.pre-commit-ci.yaml diff --git a/.circleci/.pre-commit-ci.yaml b/.circleci/.pre-commit-ci.yaml new file mode 100644 index 00000000..4c07dcf3 --- /dev/null +++ b/.circleci/.pre-commit-ci.yaml @@ -0,0 +1,11 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.4.0 + hooks: + - id: check-merge-conflict + - id: check-json + files: "(integrations/.*/manifest\\.json|sample-context/.*\\.json|schemas/.*\\.json)" + - id: check-symlinks + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-added-large-files diff --git a/.circleci/config.yml b/.circleci/config.yml index 7dfa9f1c..6c29e540 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,6 +2,7 @@ version: 2.1 orbs: aws-cli: circleci/aws-cli@0.1.16 + linter: thekevjames/linter@1.0.49 jobs: build: @@ -44,6 +45,8 @@ workflows: version: 2.1 build-and-deploy: jobs: + - linter/pre-commit: + config_file: .circleci/.pre-commit-ci.yaml - build - deploy-to-s3: requires: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 959dccb0..4fa387b4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,11 +4,12 @@ repos: hooks: - id: check-merge-conflict - id: check-json - files: 'integrations/*/manifest.json' + files: "(integrations/.*/manifest\\.json|sample-context/.*\\.json|schemas/.*\\.json)" - id: check-symlinks - id: trailing-whitespace - id: end-of-file-fixer - id: check-added-large-files + - repo: local hooks: - id: build-schema diff --git a/integrations/azure-sso/assets/images/horizontal.svg b/integrations/azure-sso/assets/images/horizontal.svg index 82ac4834..042d33fc 100644 --- a/integrations/azure-sso/assets/images/horizontal.svg +++ b/integrations/azure-sso/assets/images/horizontal.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/azure-sso/assets/images/square.svg b/integrations/azure-sso/assets/images/square.svg index 82ac4834..042d33fc 100644 --- a/integrations/azure-sso/assets/images/square.svg +++ b/integrations/azure-sso/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/bitbucket-flags/assets/images/bitbucket_horizontal.svg b/integrations/bitbucket-flags/assets/images/bitbucket_horizontal.svg index 380939e9..8537461b 100644 --- a/integrations/bitbucket-flags/assets/images/bitbucket_horizontal.svg +++ b/integrations/bitbucket-flags/assets/images/bitbucket_horizontal.svg @@ -1 +1 @@ -Bitbucket-blue \ No newline at end of file +Bitbucket-blue diff --git a/integrations/bitbucket-flags/assets/images/bitbucket_square.svg b/integrations/bitbucket-flags/assets/images/bitbucket_square.svg index dd465750..07cf7366 100644 --- a/integrations/bitbucket-flags/assets/images/bitbucket_square.svg +++ b/integrations/bitbucket-flags/assets/images/bitbucket_square.svg @@ -13,7 +13,7 @@ - + diff --git a/integrations/circleci-coderefs/assets/images/horizontal.svg b/integrations/circleci-coderefs/assets/images/horizontal.svg index 8eb6526a..0278345c 100644 --- a/integrations/circleci-coderefs/assets/images/horizontal.svg +++ b/integrations/circleci-coderefs/assets/images/horizontal.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/circleci-coderefs/assets/images/square.svg b/integrations/circleci-coderefs/assets/images/square.svg index c4a6bc98..b7de58d8 100644 --- a/integrations/circleci-coderefs/assets/images/square.svg +++ b/integrations/circleci-coderefs/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/gitlab-coderefs/assets/images/horizontal.svg b/integrations/gitlab-coderefs/assets/images/horizontal.svg index b3c048f5..26d7a11a 100644 --- a/integrations/gitlab-coderefs/assets/images/horizontal.svg +++ b/integrations/gitlab-coderefs/assets/images/horizontal.svg @@ -1 +1 @@ -wm_no_bg \ No newline at end of file +wm_no_bg diff --git a/integrations/gitlab-coderefs/assets/images/square.svg b/integrations/gitlab-coderefs/assets/images/square.svg index ab63afd2..69c0cb93 100644 --- a/integrations/gitlab-coderefs/assets/images/square.svg +++ b/integrations/gitlab-coderefs/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/googleapps-sso/assets/images/square.svg b/integrations/googleapps-sso/assets/images/square.svg index 06dc52f0..8b68fb9d 100644 --- a/integrations/googleapps-sso/assets/images/square.svg +++ b/integrations/googleapps-sso/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/heap/assets/images/heapanalytics-rect.svg b/integrations/heap/assets/images/heapanalytics-rect.svg index 815c4e16..9d4aea61 100644 --- a/integrations/heap/assets/images/heapanalytics-rect.svg +++ b/integrations/heap/assets/images/heapanalytics-rect.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/heap/assets/images/heapanalytics-square.svg b/integrations/heap/assets/images/heapanalytics-square.svg index 7053e681..2c2e28e5 100644 --- a/integrations/heap/assets/images/heapanalytics-square.svg +++ b/integrations/heap/assets/images/heapanalytics-square.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/jira/assets/images/horizontal.svg b/integrations/jira/assets/images/horizontal.svg index f97d510b..2866db0c 100644 --- a/integrations/jira/assets/images/horizontal.svg +++ b/integrations/jira/assets/images/horizontal.svg @@ -1 +1 @@ -Jira Software-blue \ No newline at end of file +Jira Software-blue diff --git a/integrations/msteams/assets/images/microsoft-teams.svg b/integrations/msteams/assets/images/microsoft-teams.svg index 1e75bf94..dc4ea78a 100644 --- a/integrations/msteams/assets/images/microsoft-teams.svg +++ b/integrations/msteams/assets/images/microsoft-teams.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/onelogin/assets/images/square.svg b/integrations/onelogin/assets/images/square.svg index 24983478..c767c049 100644 --- a/integrations/onelogin/assets/images/square.svg +++ b/integrations/onelogin/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/pendo/assets/images/pendo_horizontal.svg b/integrations/pendo/assets/images/pendo_horizontal.svg index 328d1287..756bce58 100644 --- a/integrations/pendo/assets/images/pendo_horizontal.svg +++ b/integrations/pendo/assets/images/pendo_horizontal.svg @@ -14,4 +14,4 @@ - \ No newline at end of file + diff --git a/integrations/signalfx/assets/images/horizontal.svg b/integrations/signalfx/assets/images/horizontal.svg index cfd126d7..9aee85db 100755 --- a/integrations/signalfx/assets/images/horizontal.svg +++ b/integrations/signalfx/assets/images/horizontal.svg @@ -10,12 +10,12 @@ - - Asset 1 \ No newline at end of file +Asset 1 diff --git a/integrations/trello/assets/images/horizontal.svg b/integrations/trello/assets/images/horizontal.svg index 3253f4e9..4b9d952d 100644 --- a/integrations/trello/assets/images/horizontal.svg +++ b/integrations/trello/assets/images/horizontal.svg @@ -29,4 +29,4 @@ - \ No newline at end of file + diff --git a/integrations/trello/assets/images/square.svg b/integrations/trello/assets/images/square.svg index f8e2bd47..ad530f87 100644 --- a/integrations/trello/assets/images/square.svg +++ b/integrations/trello/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/vscode/assets/images/horizontal.svg b/integrations/vscode/assets/images/horizontal.svg index a39f0d00..88487d77 100644 --- a/integrations/vscode/assets/images/horizontal.svg +++ b/integrations/vscode/assets/images/horizontal.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/vscode/assets/images/square.svg b/integrations/vscode/assets/images/square.svg index 67aee172..ec21b9de 100644 --- a/integrations/vscode/assets/images/square.svg +++ b/integrations/vscode/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + From aff93a2a0c1cfeb5688d6021723d549919df6a2e Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 1 Apr 2020 17:30:38 +0100 Subject: [PATCH 226/936] Only send slack notifications for master fails (#70) --- .circleci/config.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6c29e540..76ede668 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,12 @@ version: 2.1 +# Keep this at the top to reduce noise in chatrooms when we mess up circleci setup +experimental: + notify: + branches: + only: + - master + orbs: aws-cli: circleci/aws-cli@0.1.16 linter: thekevjames/linter@1.0.49 From 810676ad9b1fcc21a796a5c841aa2cac729b7b68 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 1 Apr 2020 17:37:02 +0100 Subject: [PATCH 227/936] Add rfc3339 timestamp to sample context (#68) * Add RFC3339 timestamp to sample context * Add trailing whitespace to all files as needed and update pre-commit hook to catch all json --- sample-context/environment/create.json | 3 ++- sample-context/environment/delete.json | 3 ++- sample-context/environment/update.json | 3 ++- sample-context/flag/archive.json | 3 ++- sample-context/flag/copy.json | 3 ++- sample-context/flag/create.json | 3 ++- sample-context/flag/targeting-rule-update.json | 3 ++- sample-context/flag/toggle.json | 3 ++- sample-context/flag/update-all-environments.json | 3 ++- sample-context/other/metric.create.json | 3 ++- sample-context/other/segment.create.json | 3 ++- sample-context/other/segment.update.json | 3 ++- sample-context/other/webhook.enable.json | 3 ++- sample-context/project/create.json | 3 ++- sample-context/project/delete.json | 3 ++- sample-context/project/update.json | 3 ++- 16 files changed, 32 insertions(+), 16 deletions(-) diff --git a/sample-context/environment/create.json b/sample-context/environment/create.json index 075dd46b..39092cc3 100644 --- a/sample-context/environment/create.json +++ b/sample-context/environment/create.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580778632128, - "seconds": 1580778632 + "seconds": 1580778632, + "rfc3339": "2020-02-04T01:10:32Z" }, "kind": "environment", "name": "Local dev", diff --git a/sample-context/environment/delete.json b/sample-context/environment/delete.json index 5201a221..b8ab420a 100644 --- a/sample-context/environment/delete.json +++ b/sample-context/environment/delete.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580778870198, - "seconds": 1580778870 + "seconds": 1580778870, + "rfc3339": "2020-02-04T01:14:30Z" }, "kind": "environment", "name": "Local dev", diff --git a/sample-context/environment/update.json b/sample-context/environment/update.json index 6c194c17..8b695358 100644 --- a/sample-context/environment/update.json +++ b/sample-context/environment/update.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580778761928, - "seconds": 1580778761 + "seconds": 1580778761, + "rfc3339": "2020-02-04T01:12:41Z" }, "kind": "environment", "name": "Local dev", diff --git a/sample-context/flag/archive.json b/sample-context/flag/archive.json index f0dacc7e..30a97032 100644 --- a/sample-context/flag/archive.json +++ b/sample-context/flag/archive.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580778134028, - "seconds": 1580778134 + "seconds": 1580778134, + "rfc3339": "2020-02-04T01:02:14Z" }, "kind": "flag", "name": "A brand new flag", diff --git a/sample-context/flag/copy.json b/sample-context/flag/copy.json index e6f99059..f9af27df 100644 --- a/sample-context/flag/copy.json +++ b/sample-context/flag/copy.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580778239748, - "seconds": 1580778239 + "seconds": 1580778239, + "rfc3339": "2020-02-04T01:03:59Z" }, "kind": "flag", "name": "Demo flag", diff --git a/sample-context/flag/create.json b/sample-context/flag/create.json index d06597cb..b7895fbc 100644 --- a/sample-context/flag/create.json +++ b/sample-context/flag/create.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580777968396, - "seconds": 1580777968 + "seconds": 1580777968, + "rfc3339": "2020-02-04T00:59:28Z" }, "kind": "flag", "name": "A brand new flag", diff --git a/sample-context/flag/targeting-rule-update.json b/sample-context/flag/targeting-rule-update.json index b1e33203..c1fe2429 100644 --- a/sample-context/flag/targeting-rule-update.json +++ b/sample-context/flag/targeting-rule-update.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580777685229, - "seconds": 1580777685 + "seconds": 1580777685, + "rfc3339": "2020-02-04T00:54:45Z" }, "kind": "flag", "name": "Demo flag", diff --git a/sample-context/flag/toggle.json b/sample-context/flag/toggle.json index b7fe777a..64b0a62f 100644 --- a/sample-context/flag/toggle.json +++ b/sample-context/flag/toggle.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580777319650, - "seconds": 1580777319 + "seconds": 1580777319, + "rfc3339": "2020-02-04T00:48:39Z" }, "kind": "flag", "name": "Demo flag", diff --git a/sample-context/flag/update-all-environments.json b/sample-context/flag/update-all-environments.json index 1a49c786..f2afd831 100644 --- a/sample-context/flag/update-all-environments.json +++ b/sample-context/flag/update-all-environments.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580777778959, - "seconds": 1580777778 + "seconds": 1580777778, + "rfc3339": "2020-02-04T00:56:18Z" }, "kind": "flag", "name": "Demo flag", diff --git a/sample-context/other/metric.create.json b/sample-context/other/metric.create.json index b8859be8..800d24dd 100644 --- a/sample-context/other/metric.create.json +++ b/sample-context/other/metric.create.json @@ -18,7 +18,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580779125858, - "seconds": 1580779125 + "seconds": 1580779125, + "rfc3339": "2020-02-04T00:56:18Z" }, "kind": "metric", "name": "New metric", diff --git a/sample-context/other/segment.create.json b/sample-context/other/segment.create.json index 3b943ed4..42d61faf 100644 --- a/sample-context/other/segment.create.json +++ b/sample-context/other/segment.create.json @@ -18,7 +18,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580778941643, - "seconds": 1580778941 + "seconds": 1580778941, + "rfc3339": "2020-02-04T01:15:41Z" }, "kind": "segment", "name": "New segment", diff --git a/sample-context/other/segment.update.json b/sample-context/other/segment.update.json index d9a69ffd..7debe9a0 100644 --- a/sample-context/other/segment.update.json +++ b/sample-context/other/segment.update.json @@ -18,7 +18,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580779027718, - "seconds": 1580779027 + "seconds": 1580779027, + "rfc3339": "2020-02-04T01:17:07Z" }, "kind": "segment", "name": "New segment", diff --git a/sample-context/other/webhook.enable.json b/sample-context/other/webhook.enable.json index a6ba7d6b..945e132e 100644 --- a/sample-context/other/webhook.enable.json +++ b/sample-context/other/webhook.enable.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580779057946, - "seconds": 1580779057 + "seconds": 1580779057, + "rfc3339": "2020-02-04T01:17:37Z" }, "kind": "webhook", "name": "Test webhook", diff --git a/sample-context/project/create.json b/sample-context/project/create.json index f0c20682..10af3b4e 100644 --- a/sample-context/project/create.json +++ b/sample-context/project/create.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580778499615, - "seconds": 1580778499 + "seconds": 1580778499, + "rfc3339": "2020-02-04T01:08:19Z" }, "kind": "project", "name": "A new project", diff --git a/sample-context/project/delete.json b/sample-context/project/delete.json index dba032c5..e082b9c2 100644 --- a/sample-context/project/delete.json +++ b/sample-context/project/delete.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580778556395, - "seconds": 1580778556 + "seconds": 1580778556, + "rfc3339": "2020-02-04T01:09:16Z" }, "kind": "project", "name": "A new project", diff --git a/sample-context/project/update.json b/sample-context/project/update.json index ab414bd7..e8ab0dca 100644 --- a/sample-context/project/update.json +++ b/sample-context/project/update.json @@ -22,7 +22,8 @@ "_accountId": "569f514156e003339cfd3917", "timestamp": { "milliseconds": 1580778360145, - "seconds": 1580778360 + "seconds": 1580778360, + "rfc3339": "2020-02-04T01:06:00Z" }, "kind": "project", "name": "The big project", From ac6cf62d5900a641d703ac54fd7258ecf908337e Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Wed, 1 Apr 2020 11:36:39 -0700 Subject: [PATCH 228/936] Update manifest.json formatted and remove a few stupid spaces --- integrations/sleuth/manifest.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/integrations/sleuth/manifest.json b/integrations/sleuth/manifest.json index ee48b62b..30addeb0 100644 --- a/integrations/sleuth/manifest.json +++ b/integrations/sleuth/manifest.json @@ -1,17 +1,17 @@ { - "name": "Sleuth", - "version": "1.0.0", - "overview": "Track feature flags as a source of change in your DevOps stack", - "description": "Sleuth's native LaunchDarkly integration tracks the status and impact of feature flags relative to other source changes in your projects, such as code, issues, etc. With the Sleuth integration, Sleuth can capture the full state of feature flags at deployment time. This helps you keep track of the affected code deploys, what environment the change occurred in, who changed the flag, and flag descriptions and flag value states, both before and after code deploys.", - "author": "Sleuth", - "supportEmail": "support@sleuth.io", - "links": { - "site": "https://www.sleuth.io/post/integrating-launchdarkly-with-sleuth", - "privacyPolicy": "https://www.sleuth.io/privacy" - }, - "categories": ["monitoring"], - "icons": { - "square": "assets/images/logo_new_logo_symbol.svg", - "horizontal": "assets/images/logo_new_logo_dark.svg" - } + "name": "Sleuth", + "version": "1.0.0", + "overview": "Track feature flags as a source of change in your DevOps stack", + "description": "Sleuth's native LaunchDarkly integration tracks the status and impact of feature flags relative to other source changes in your projects, such as code, issues, etc. With the Sleuth integration, Sleuth can capture the full state of feature flags at deployment time. This helps you keep track of the affected code deploys, what environment the change occurred in, who changed the flag, and flag descriptions and flag value states, both before and after code deploys.", + "author": "Sleuth", + "supportEmail": "support@sleuth.io", + "links": { + "site": "https://www.sleuth.io/post/integrating-launchdarkly-with-sleuth", + "privacyPolicy": "https://www.sleuth.io/privacy" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/images/logo_new_logo_symbol.svg", + "horizontal": "assets/images/logo_new_logo_dark.svg" } +} From d9c3215caf37c38be17087cf2fdcef17fe6ca675 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Wed, 1 Apr 2020 11:54:05 -0700 Subject: [PATCH 229/936] Update manifest.json format update From 1add6c4db84bfa731863046cb2bb33eb7d76bec6 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 2 Apr 2020 11:48:40 -0700 Subject: [PATCH 230/936] added all legecy integrations are dummy integraitons --- integrations/bitbucket/LICENSE.md | 13 +++++ .../bitbucket/assets/images/horizontal.svg | 5 ++ .../bitbucket/assets/images/square.svg | 1 + integrations/bitbucket/manifest.json | 17 +++++++ integrations/git/LICENSE.md | 13 +++++ integrations/git/assets/images/horizontal.svg | 33 +++++++++++++ integrations/git/assets/images/square.svg | 24 +++++++++ integrations/git/manifest.json | 17 +++++++ integrations/github/LICENSE.md | 13 +++++ .../github/assets/images/horizontal.svg | 1 + integrations/github/assets/images/square.svg | 1 + integrations/github/manifest.json | 17 +++++++ integrations/google-pubsub/LICENSE.md | 13 +++++ .../google-pubsub/assets/images/square.svg | 1 + integrations/google-pubsub/manifest.json | 17 +++++++ integrations/kinesis/LICENSE.md | 13 +++++ integrations/kinesis/assets/images/square.svg | 1 + integrations/kinesis/manifest.json | 17 +++++++ integrations/mparticle/LICENSE.md | 13 +++++ .../mparticle/assets/images/square.svg | 1 + integrations/mparticle/manifest.json | 17 +++++++ integrations/segment/LICENSE.md | 13 +++++ integrations/segment/assets/images/square.svg | 1 + integrations/segment/manifest.json | 17 +++++++ integrations/slack-app/LICENSE.md | 13 +++++ .../slack-app/assets/images/horizontal.svg | 49 +++++++++++++++++++ .../slack-app/assets/images/square.svg | 33 +++++++++++++ integrations/slack-app/manifest.json | 17 +++++++ integrations/slack-webhooks/LICENSE.md | 13 +++++ .../assets/images/horizontal.svg | 49 +++++++++++++++++++ .../slack-webhooks/assets/images/square.svg | 33 +++++++++++++ integrations/slack-webhooks/manifest.json | 17 +++++++ integrations/webhooks/LICENSE.md | 13 +++++ .../webhooks/assets/images/square.svg | 1 + integrations/webhooks/manifest.json | 17 +++++++ 35 files changed, 534 insertions(+) create mode 100644 integrations/bitbucket/LICENSE.md create mode 100644 integrations/bitbucket/assets/images/horizontal.svg create mode 100644 integrations/bitbucket/assets/images/square.svg create mode 100644 integrations/bitbucket/manifest.json create mode 100644 integrations/git/LICENSE.md create mode 100644 integrations/git/assets/images/horizontal.svg create mode 100644 integrations/git/assets/images/square.svg create mode 100644 integrations/git/manifest.json create mode 100644 integrations/github/LICENSE.md create mode 100644 integrations/github/assets/images/horizontal.svg create mode 100644 integrations/github/assets/images/square.svg create mode 100644 integrations/github/manifest.json create mode 100644 integrations/google-pubsub/LICENSE.md create mode 100644 integrations/google-pubsub/assets/images/square.svg create mode 100644 integrations/google-pubsub/manifest.json create mode 100644 integrations/kinesis/LICENSE.md create mode 100644 integrations/kinesis/assets/images/square.svg create mode 100644 integrations/kinesis/manifest.json create mode 100644 integrations/mparticle/LICENSE.md create mode 100644 integrations/mparticle/assets/images/square.svg create mode 100644 integrations/mparticle/manifest.json create mode 100644 integrations/segment/LICENSE.md create mode 100644 integrations/segment/assets/images/square.svg create mode 100644 integrations/segment/manifest.json create mode 100644 integrations/slack-app/LICENSE.md create mode 100644 integrations/slack-app/assets/images/horizontal.svg create mode 100644 integrations/slack-app/assets/images/square.svg create mode 100644 integrations/slack-app/manifest.json create mode 100644 integrations/slack-webhooks/LICENSE.md create mode 100644 integrations/slack-webhooks/assets/images/horizontal.svg create mode 100644 integrations/slack-webhooks/assets/images/square.svg create mode 100644 integrations/slack-webhooks/manifest.json create mode 100644 integrations/webhooks/LICENSE.md create mode 100644 integrations/webhooks/assets/images/square.svg create mode 100644 integrations/webhooks/manifest.json diff --git a/integrations/bitbucket/LICENSE.md b/integrations/bitbucket/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/bitbucket/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/bitbucket/assets/images/horizontal.svg b/integrations/bitbucket/assets/images/horizontal.svg new file mode 100644 index 00000000..d2c81cd5 --- /dev/null +++ b/integrations/bitbucket/assets/images/horizontal.svg @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/integrations/bitbucket/assets/images/square.svg b/integrations/bitbucket/assets/images/square.svg new file mode 100644 index 00000000..a1992420 --- /dev/null +++ b/integrations/bitbucket/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json new file mode 100644 index 00000000..55788798 --- /dev/null +++ b/integrations/bitbucket/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Bitbucket", + "version": "1.0.0", + "overview": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", + "description": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/git-code-references/bitbucket-pipes", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["version-control", "developer-tools"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/git/LICENSE.md b/integrations/git/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/git/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/git/assets/images/horizontal.svg b/integrations/git/assets/images/horizontal.svg new file mode 100644 index 00000000..4ab6fb1e --- /dev/null +++ b/integrations/git/assets/images/horizontal.svg @@ -0,0 +1,33 @@ + +image/svg+xml \ No newline at end of file diff --git a/integrations/git/assets/images/square.svg b/integrations/git/assets/images/square.svg new file mode 100644 index 00000000..1e7a48e1 --- /dev/null +++ b/integrations/git/assets/images/square.svg @@ -0,0 +1,24 @@ + +image/svg+xml \ No newline at end of file diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json new file mode 100644 index 00000000..f7d6af3f --- /dev/null +++ b/integrations/git/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Git", + "version": "1.0.0", + "overview": "Use our open-source utility to track references to flags in your code, running in your CI build.", + "description": "Use our open-source utility to track references to flags in your code, running in your CI build.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/git-code-references", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["version-control", "developer-tools"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/github/LICENSE.md b/integrations/github/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/github/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/github/assets/images/horizontal.svg b/integrations/github/assets/images/horizontal.svg new file mode 100644 index 00000000..863fd6ca --- /dev/null +++ b/integrations/github/assets/images/horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/github/assets/images/square.svg b/integrations/github/assets/images/square.svg new file mode 100644 index 00000000..c2175e14 --- /dev/null +++ b/integrations/github/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json new file mode 100644 index 00000000..62a751a8 --- /dev/null +++ b/integrations/github/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "GitHub", + "version": "1.0.0", + "overview": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", + "description": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://github.com/marketplace/actions/launchdarkly-code-references", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["version-control", "developer-tools"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/google-pubsub/LICENSE.md b/integrations/google-pubsub/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/google-pubsub/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/google-pubsub/assets/images/square.svg b/integrations/google-pubsub/assets/images/square.svg new file mode 100644 index 00000000..a4e2f753 --- /dev/null +++ b/integrations/google-pubsub/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/google-pubsub/manifest.json b/integrations/google-pubsub/manifest.json new file mode 100644 index 00000000..9b8e72b2 --- /dev/null +++ b/integrations/google-pubsub/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Google Cloud Pub/Sub", + "version": "1.0.0", + "overview": "Export real-time flag analytics data.", + "description": "Export your real-time flag analytics data to Google Cloud Pub/Sub.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/data-export/google-pubsub", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data", "infrastructure"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + } +} diff --git a/integrations/kinesis/LICENSE.md b/integrations/kinesis/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/kinesis/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/kinesis/assets/images/square.svg b/integrations/kinesis/assets/images/square.svg new file mode 100644 index 00000000..c130fd5c --- /dev/null +++ b/integrations/kinesis/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/kinesis/manifest.json b/integrations/kinesis/manifest.json new file mode 100644 index 00000000..c783a06d --- /dev/null +++ b/integrations/kinesis/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Amazon Kinesis", + "version": "1.0.0", + "overview": "Export real-time flag analytics data.", + "description": "Export your real-time flag analytics data to Amazon Kinesis.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/data-export/kinesis", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data", "infrastructure"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + } +} diff --git a/integrations/mparticle/LICENSE.md b/integrations/mparticle/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/mparticle/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/mparticle/assets/images/square.svg b/integrations/mparticle/assets/images/square.svg new file mode 100644 index 00000000..8f5d89ed --- /dev/null +++ b/integrations/mparticle/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/mparticle/manifest.json b/integrations/mparticle/manifest.json new file mode 100644 index 00000000..1e899bc6 --- /dev/null +++ b/integrations/mparticle/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "mParticle", + "version": "1.0.0", + "overview": "Export real-time flag analytics data.", + "description": "Export your real-time flag analytics data to mParticle.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/data-export/mparticle", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data", "infrastructure"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + } +} diff --git a/integrations/segment/LICENSE.md b/integrations/segment/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/segment/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/segment/assets/images/square.svg b/integrations/segment/assets/images/square.svg new file mode 100644 index 00000000..105c9b62 --- /dev/null +++ b/integrations/segment/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json new file mode 100644 index 00000000..553d095d --- /dev/null +++ b/integrations/segment/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Segment", + "version": "1.0.0", + "overview": "Export real-time flag analytics data.", + "description": "Export your real-time flag analytics data to Segment.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/data-export/segment", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data", "infrastructure"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + } +} diff --git a/integrations/slack-app/LICENSE.md b/integrations/slack-app/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/slack-app/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/slack-app/assets/images/horizontal.svg b/integrations/slack-app/assets/images/horizontal.svg new file mode 100644 index 00000000..e7433865 --- /dev/null +++ b/integrations/slack-app/assets/images/horizontal.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/slack-app/assets/images/square.svg b/integrations/slack-app/assets/images/square.svg new file mode 100644 index 00000000..c37dc5eb --- /dev/null +++ b/integrations/slack-app/assets/images/square.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json new file mode 100644 index 00000000..d8cf448a --- /dev/null +++ b/integrations/slack-app/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Slack App", + "version": "1.0.0", + "overview": "View, monitor, and control flags interactively from our official Slack app.", + "description": "With the LaunchDarkly Slack app, you can view, monitor, and control feature flags directly from your team's Slack workspace. Use the app to find feature flags, subscribe channels to notifications about flag changes, and toggle flags on or off.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://launchdarkly.slack.com/apps/AKEEF9DTM-launchdarkly", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["collaboration", "notifications"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/slack-webhooks/LICENSE.md b/integrations/slack-webhooks/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/slack-webhooks/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/slack-webhooks/assets/images/horizontal.svg b/integrations/slack-webhooks/assets/images/horizontal.svg new file mode 100644 index 00000000..e7433865 --- /dev/null +++ b/integrations/slack-webhooks/assets/images/horizontal.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/slack-webhooks/assets/images/square.svg b/integrations/slack-webhooks/assets/images/square.svg new file mode 100644 index 00000000..c37dc5eb --- /dev/null +++ b/integrations/slack-webhooks/assets/images/square.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/slack-webhooks/manifest.json b/integrations/slack-webhooks/manifest.json new file mode 100644 index 00000000..224bbdcf --- /dev/null +++ b/integrations/slack-webhooks/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Slack Incoming Webhooks", + "version": "1.0.0", + "overview": "Create webhook notifications filtered by roles or permissions.", + "description": "Create webhook notifications filtered by roles or permissions.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/slack/webhooks", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["notifications"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/webhooks/LICENSE.md b/integrations/webhooks/LICENSE.md new file mode 100644 index 00000000..aa12a4cb --- /dev/null +++ b/integrations/webhooks/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2019 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/webhooks/assets/images/square.svg b/integrations/webhooks/assets/images/square.svg new file mode 100644 index 00000000..9b9f4af1 --- /dev/null +++ b/integrations/webhooks/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/webhooks/manifest.json b/integrations/webhooks/manifest.json new file mode 100644 index 00000000..4fe584ca --- /dev/null +++ b/integrations/webhooks/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Webhooks", + "version": "1.0.0", + "overview": "Subscribe to changes in flags, users, and more.", + "description": "Subscribe to LaunchDarkly with webhooks that are notified about changes in flags, environments, users, and more.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/webhooks", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["developer-tools"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + } +} From 95a5d456c56d03db475411f7e71b82c2198f1aac Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Thu, 2 Apr 2020 12:50:43 -0700 Subject: [PATCH 231/936] Create logo_new_logo_dark.svg --- integrations/sleuth/assets/images/logo_new_logo_dark.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 integrations/sleuth/assets/images/logo_new_logo_dark.svg diff --git a/integrations/sleuth/assets/images/logo_new_logo_dark.svg b/integrations/sleuth/assets/images/logo_new_logo_dark.svg new file mode 100644 index 00000000..2f7a6aff --- /dev/null +++ b/integrations/sleuth/assets/images/logo_new_logo_dark.svg @@ -0,0 +1 @@ +logo_new From 60d57b5072606d0250325bbb9e52e350b94deda8 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Thu, 2 Apr 2020 12:51:12 -0700 Subject: [PATCH 232/936] Add files via upload --- integrations/sleuth/assets/images/logo_new_logo_mixed.svg | 1 + integrations/sleuth/assets/images/logo_new_logo_symbol.svg | 1 + integrations/sleuth/assets/images/logo_new_logo_white.svg | 1 + 3 files changed, 3 insertions(+) create mode 100644 integrations/sleuth/assets/images/logo_new_logo_mixed.svg create mode 100644 integrations/sleuth/assets/images/logo_new_logo_symbol.svg create mode 100644 integrations/sleuth/assets/images/logo_new_logo_white.svg diff --git a/integrations/sleuth/assets/images/logo_new_logo_mixed.svg b/integrations/sleuth/assets/images/logo_new_logo_mixed.svg new file mode 100644 index 00000000..8cefe789 --- /dev/null +++ b/integrations/sleuth/assets/images/logo_new_logo_mixed.svg @@ -0,0 +1 @@ +logo_new diff --git a/integrations/sleuth/assets/images/logo_new_logo_symbol.svg b/integrations/sleuth/assets/images/logo_new_logo_symbol.svg new file mode 100644 index 00000000..e7da7569 --- /dev/null +++ b/integrations/sleuth/assets/images/logo_new_logo_symbol.svg @@ -0,0 +1 @@ +logo_new diff --git a/integrations/sleuth/assets/images/logo_new_logo_white.svg b/integrations/sleuth/assets/images/logo_new_logo_white.svg new file mode 100644 index 00000000..bb28d9ce --- /dev/null +++ b/integrations/sleuth/assets/images/logo_new_logo_white.svg @@ -0,0 +1 @@ +logo_new From a16cefc78c4f3884bd334ce89619c8f83e1c3834 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Thu, 2 Apr 2020 12:52:01 -0700 Subject: [PATCH 233/936] Delete logo_new_logo_dark.svg --- integrations/sleuth/assets/images/logo_new_logo_dark.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 integrations/sleuth/assets/images/logo_new_logo_dark.svg diff --git a/integrations/sleuth/assets/images/logo_new_logo_dark.svg b/integrations/sleuth/assets/images/logo_new_logo_dark.svg deleted file mode 100644 index 2f7a6aff..00000000 --- a/integrations/sleuth/assets/images/logo_new_logo_dark.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new From d38f79fe0fe87c4613b8b90b5425fa0dc9ec1866 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Thu, 2 Apr 2020 12:52:21 -0700 Subject: [PATCH 234/936] Add files via upload --- integrations/sleuth/assets/images/logo_new_logo_dark.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 integrations/sleuth/assets/images/logo_new_logo_dark.svg diff --git a/integrations/sleuth/assets/images/logo_new_logo_dark.svg b/integrations/sleuth/assets/images/logo_new_logo_dark.svg new file mode 100644 index 00000000..2f7a6aff --- /dev/null +++ b/integrations/sleuth/assets/images/logo_new_logo_dark.svg @@ -0,0 +1 @@ +logo_new From cafa02976af4a5a05da6ffc5149f1003a5654e88 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Thu, 2 Apr 2020 12:54:56 -0700 Subject: [PATCH 235/936] Delete logo_new_logo_dark.svg --- integrations/sleuth/assets/logo_new_logo_dark.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 integrations/sleuth/assets/logo_new_logo_dark.svg diff --git a/integrations/sleuth/assets/logo_new_logo_dark.svg b/integrations/sleuth/assets/logo_new_logo_dark.svg deleted file mode 100644 index 9a8e303f..00000000 --- a/integrations/sleuth/assets/logo_new_logo_dark.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new \ No newline at end of file From 1752a28c00fdd07f7f8ab65764e79fde50d880a9 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Thu, 2 Apr 2020 12:55:07 -0700 Subject: [PATCH 236/936] Delete logo_new_logo_mixed.svg --- integrations/sleuth/assets/logo_new_logo_mixed.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 integrations/sleuth/assets/logo_new_logo_mixed.svg diff --git a/integrations/sleuth/assets/logo_new_logo_mixed.svg b/integrations/sleuth/assets/logo_new_logo_mixed.svg deleted file mode 100644 index 2c8d4fc9..00000000 --- a/integrations/sleuth/assets/logo_new_logo_mixed.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new \ No newline at end of file From 63fc0bbe061c65e7ea58cd19731f046c27a15e0a Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Thu, 2 Apr 2020 12:55:15 -0700 Subject: [PATCH 237/936] Delete logo_new_logo_symbol.svg --- integrations/sleuth/assets/logo_new_logo_symbol.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 integrations/sleuth/assets/logo_new_logo_symbol.svg diff --git a/integrations/sleuth/assets/logo_new_logo_symbol.svg b/integrations/sleuth/assets/logo_new_logo_symbol.svg deleted file mode 100644 index a8f4815b..00000000 --- a/integrations/sleuth/assets/logo_new_logo_symbol.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new \ No newline at end of file From d8fa7bf8cc00cb4151a0255b82f1c3659a55d043 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Thu, 2 Apr 2020 12:55:39 -0700 Subject: [PATCH 238/936] Delete logo_new_logo_white.svg --- integrations/sleuth/assets/logo_new_logo_white.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 integrations/sleuth/assets/logo_new_logo_white.svg diff --git a/integrations/sleuth/assets/logo_new_logo_white.svg b/integrations/sleuth/assets/logo_new_logo_white.svg deleted file mode 100644 index cdc5b176..00000000 --- a/integrations/sleuth/assets/logo_new_logo_white.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new \ No newline at end of file From ce55ed556017b3685885ae592cd3408c9cc150d3 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 2 Apr 2020 16:22:54 -0700 Subject: [PATCH 239/936] test minor change --- .../segment/assets/images/{square.svg => squaree.svg} | 2 +- integrations/segment/manifest.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename integrations/segment/assets/images/{square.svg => squaree.svg} (97%) diff --git a/integrations/segment/assets/images/square.svg b/integrations/segment/assets/images/squaree.svg similarity index 97% rename from integrations/segment/assets/images/square.svg rename to integrations/segment/assets/images/squaree.svg index 105c9b62..7b54e7a2 100644 --- a/integrations/segment/assets/images/square.svg +++ b/integrations/segment/assets/images/squaree.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json index 553d095d..4f269e87 100644 --- a/integrations/segment/manifest.json +++ b/integrations/segment/manifest.json @@ -11,7 +11,7 @@ }, "categories": ["data", "infrastructure"], "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/square.svg" + "square": "assets/images/squaree.svg", + "horizontal": "assets/images/squaree.svg" } } From db8dad643e4d4aa368014b04d25c7e12f5ad2321 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 2 Apr 2020 16:23:29 -0700 Subject: [PATCH 240/936] fix naming error --- .../segment/assets/images/{squaree.svg => square.svg} | 0 integrations/segment/manifest.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename integrations/segment/assets/images/{squaree.svg => square.svg} (100%) diff --git a/integrations/segment/assets/images/squaree.svg b/integrations/segment/assets/images/square.svg similarity index 100% rename from integrations/segment/assets/images/squaree.svg rename to integrations/segment/assets/images/square.svg diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json index 4f269e87..553d095d 100644 --- a/integrations/segment/manifest.json +++ b/integrations/segment/manifest.json @@ -11,7 +11,7 @@ }, "categories": ["data", "infrastructure"], "icons": { - "square": "assets/images/squaree.svg", - "horizontal": "assets/images/squaree.svg" + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" } } From 901f8418118c13e101842e1c2eb1ed8f28712404 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 2 Apr 2020 16:31:58 -0700 Subject: [PATCH 241/936] fixed some svg issues --- integrations/slack-app/assets/images/horizontal.svg | 4 +--- integrations/slack-app/assets/images/square.svg | 2 -- integrations/slack-webhooks/assets/images/horizontal.svg | 4 +--- integrations/slack-webhooks/assets/images/square.svg | 2 -- integrations/webhooks/assets/images/square.svg | 2 +- 5 files changed, 3 insertions(+), 11 deletions(-) diff --git a/integrations/slack-app/assets/images/horizontal.svg b/integrations/slack-app/assets/images/horizontal.svg index e7433865..0c866595 100644 --- a/integrations/slack-app/assets/images/horizontal.svg +++ b/integrations/slack-app/assets/images/horizontal.svg @@ -1,5 +1,3 @@ - - diff --git a/integrations/git/assets/images/square.svg b/integrations/git/assets/images/square.svg index 1e7a48e1..c6b86dca 100644 --- a/integrations/git/assets/images/square.svg +++ b/integrations/git/assets/images/square.svg @@ -21,4 +21,4 @@ id="g12"> \ No newline at end of file + d="M 901.543,500.352 500.352,901.527 c -23.094,23.11 -60.567,23.11 -83.692,0 L 333.359,818.211 439.031,712.535 c 24.563,8.293 52.727,2.727 72.297,-16.847 19.688,-19.696 25.203,-48.102 16.699,-72.75 L 629.883,521.094 c 24.648,8.496 53.066,3.004 72.754,-16.711 27.5,-27.492 27.5,-72.059 0,-99.574 -27.52,-27.516 -72.078,-27.516 -99.61,0 -20.683,20.703 -25.8,51.097 -15.312,76.582 l -95,94.992 V 326.414 c 6.699,-3.32 13.027,-7.742 18.613,-13.312 27.5,-27.497 27.5,-72.059 0,-99.598 -27.5,-27.488 -72.09,-27.488 -99.57,0 -27.5,27.539 -27.5,72.101 0,99.598 6.797,6.789 14.668,11.925 23.066,15.363 v 252.281 c -8.398,3.438 -16.25,8.531 -23.066,15.367 -20.828,20.821 -25.84,51.395 -15.156,76.977 L 292.422,777.285 17.3242,502.211 c -23.10545,-23.129 -23.10545,-60.602 0,-83.711 L 418.535,17.3242 c 23.098,-23.10545 60.559,-23.10545 83.692,0 L 901.543,416.641 c 23.113,23.113 23.113,60.605 0,83.711" /> diff --git a/integrations/github/assets/images/horizontal.svg b/integrations/github/assets/images/horizontal.svg index 863fd6ca..d49ba3b2 100644 --- a/integrations/github/assets/images/horizontal.svg +++ b/integrations/github/assets/images/horizontal.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/github/assets/images/square.svg b/integrations/github/assets/images/square.svg index c2175e14..05620534 100644 --- a/integrations/github/assets/images/square.svg +++ b/integrations/github/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/google-pubsub/assets/images/square.svg b/integrations/google-pubsub/assets/images/square.svg index a4e2f753..b91ade33 100644 --- a/integrations/google-pubsub/assets/images/square.svg +++ b/integrations/google-pubsub/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/kinesis/assets/images/square.svg b/integrations/kinesis/assets/images/square.svg index c130fd5c..1bd16a64 100644 --- a/integrations/kinesis/assets/images/square.svg +++ b/integrations/kinesis/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/mparticle/assets/images/square.svg b/integrations/mparticle/assets/images/square.svg index 8f5d89ed..a413f77f 100644 --- a/integrations/mparticle/assets/images/square.svg +++ b/integrations/mparticle/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + From 5696462eb0e7fbc383d4b576270106cccbd21cc1 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 6 Apr 2020 13:55:50 +0100 Subject: [PATCH 243/936] Fix vulnerability (#74) --- package-lock.json | 49 +++++++++++++++++++---------------------------- package.json | 2 +- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4cf476e1..ca6ca093 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1780,15 +1780,24 @@ "optional": true }, "handlebars": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz", - "integrity": "sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "dev": true, "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } } }, "har-schema": { @@ -3222,24 +3231,6 @@ "mimic-fn": "^2.1.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, "optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -4338,9 +4329,9 @@ } }, "uglify-js": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.0.tgz", - "integrity": "sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz", + "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==", "dev": true, "optional": true, "requires": { @@ -4552,9 +4543,9 @@ "dev": true }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrap-ansi": { diff --git a/package.json b/package.json index e15a1449..90a39920 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@apidevtools/json-schema-ref-parser": "^8.0.0", "ajv": "^6.10.2", - "handlebars": "4.7.3", + "handlebars": "^4.7.6", "jest": "25.1.0", "jest-expect-message": "1.0.2", "jsonpointer": "^4.0.1", From 5ae7924c69fc7255ed77f1e82d23efb112ba15f1 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Mon, 6 Apr 2020 09:42:51 -0700 Subject: [PATCH 244/936] Update manifest.json updated help docs url --- integrations/sleuth/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/sleuth/manifest.json b/integrations/sleuth/manifest.json index 30addeb0..d39861b1 100644 --- a/integrations/sleuth/manifest.json +++ b/integrations/sleuth/manifest.json @@ -6,7 +6,7 @@ "author": "Sleuth", "supportEmail": "support@sleuth.io", "links": { - "site": "https://www.sleuth.io/post/integrating-launchdarkly-with-sleuth", + "site": "https://help.sleuth.io/integrations/launchdarkly", "privacyPolicy": "https://www.sleuth.io/privacy" }, "categories": ["monitoring"], From ae70f5f0cf2cf7ea0401e0126679ead23b6e0f9c Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Mon, 6 Apr 2020 09:47:05 -0700 Subject: [PATCH 245/936] made suggested changes for PR --- integrations/appoptics/LICENSE.md | 2 +- integrations/bitbucket/LICENSE.md | 2 +- integrations/bitbucket/manifest.json | 2 +- integrations/dynatrace/LICENSE.md | 2 +- integrations/git/LICENSE.md | 2 +- integrations/git/manifest.json | 2 +- integrations/github/LICENSE.md | 2 +- integrations/github/manifest.json | 4 ++-- integrations/google-pubsub/LICENSE.md | 2 +- integrations/google-pubsub/manifest.json | 2 +- integrations/honeycomb/LICENSE.md | 2 +- integrations/kinesis/LICENSE.md | 2 +- integrations/kinesis/manifest.json | 2 +- integrations/mparticle/LICENSE.md | 2 +- integrations/mparticle/manifest.json | 2 +- integrations/msteams/LICENSE.md | 2 +- integrations/msteams/manifest.json | 2 +- integrations/sample-integration/LICENSE.md | 2 +- integrations/segment/LICENSE.md | 2 +- integrations/segment/manifest.json | 2 +- integrations/slack-app/LICENSE.md | 2 +- integrations/slack-app/manifest.json | 4 ++-- integrations/slack-webhooks/LICENSE.md | 2 +- integrations/slack-webhooks/manifest.json | 2 +- integrations/splunk/LICENSE.md | 2 +- integrations/webhooks/LICENSE.md | 2 +- integrations/webhooks/manifest.json | 2 +- 27 files changed, 29 insertions(+), 29 deletions(-) diff --git a/integrations/appoptics/LICENSE.md b/integrations/appoptics/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/appoptics/LICENSE.md +++ b/integrations/appoptics/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/bitbucket/LICENSE.md b/integrations/bitbucket/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/bitbucket/LICENSE.md +++ b/integrations/bitbucket/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json index 55788798..a652757b 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/integrations/git-code-references/bitbucket-pipes", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["version-control", "developer-tools"], + "categories": ["version-control"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/dynatrace/LICENSE.md b/integrations/dynatrace/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/dynatrace/LICENSE.md +++ b/integrations/dynatrace/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/git/LICENSE.md b/integrations/git/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/git/LICENSE.md +++ b/integrations/git/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json index f7d6af3f..805d1cea 100644 --- a/integrations/git/manifest.json +++ b/integrations/git/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/integrations/git-code-references", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["version-control", "developer-tools"], + "categories": ["version-control"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/github/LICENSE.md b/integrations/github/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/github/LICENSE.md +++ b/integrations/github/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index 62a751a8..ea4754c8 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -6,10 +6,10 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://github.com/marketplace/actions/launchdarkly-code-references", + "site": "https://docs.launchdarkly.com/integrations/git-code-references/github-actions", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["version-control", "developer-tools"], + "categories": ["version-control"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/google-pubsub/LICENSE.md b/integrations/google-pubsub/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/google-pubsub/LICENSE.md +++ b/integrations/google-pubsub/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/google-pubsub/manifest.json b/integrations/google-pubsub/manifest.json index 9b8e72b2..08de1f1c 100644 --- a/integrations/google-pubsub/manifest.json +++ b/integrations/google-pubsub/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/integrations/data-export/google-pubsub", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["data", "infrastructure"], + "categories": ["data"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" diff --git a/integrations/honeycomb/LICENSE.md b/integrations/honeycomb/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/honeycomb/LICENSE.md +++ b/integrations/honeycomb/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/kinesis/LICENSE.md b/integrations/kinesis/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/kinesis/LICENSE.md +++ b/integrations/kinesis/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/kinesis/manifest.json b/integrations/kinesis/manifest.json index c783a06d..7eec16f5 100644 --- a/integrations/kinesis/manifest.json +++ b/integrations/kinesis/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/integrations/data-export/kinesis", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["data", "infrastructure"], + "categories": ["data"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" diff --git a/integrations/mparticle/LICENSE.md b/integrations/mparticle/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/mparticle/LICENSE.md +++ b/integrations/mparticle/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/mparticle/manifest.json b/integrations/mparticle/manifest.json index 1e899bc6..1b022c0e 100644 --- a/integrations/mparticle/manifest.json +++ b/integrations/mparticle/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/integrations/data-export/mparticle", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["data", "infrastructure"], + "categories": ["data"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" diff --git a/integrations/msteams/LICENSE.md b/integrations/msteams/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/msteams/LICENSE.md +++ b/integrations/msteams/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index d927ae50..9a3cab5d 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/msteams", "privacyPolicy": "https://privacy.microsoft.com/en-us" }, - "categories": ["collaboration", "notifications"], + "categories": ["notifications"], "icons": { "square": "assets/images/microsoft-teams.svg", "horizontal": "assets/images/microsoft-teams.svg" diff --git a/integrations/sample-integration/LICENSE.md b/integrations/sample-integration/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/sample-integration/LICENSE.md +++ b/integrations/sample-integration/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/segment/LICENSE.md b/integrations/segment/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/segment/LICENSE.md +++ b/integrations/segment/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json index 553d095d..a455e04e 100644 --- a/integrations/segment/manifest.json +++ b/integrations/segment/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/integrations/data-export/segment", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["data", "infrastructure"], + "categories": ["data"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" diff --git a/integrations/slack-app/LICENSE.md b/integrations/slack-app/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/slack-app/LICENSE.md +++ b/integrations/slack-app/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index d8cf448a..7dee4228 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -6,10 +6,10 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://launchdarkly.slack.com/apps/AKEEF9DTM-launchdarkly", + "site": "https://slack.com/apps/AKEEF9DTM-launchdarkly", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["collaboration", "notifications"], + "categories": ["notifications"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/slack-webhooks/LICENSE.md b/integrations/slack-webhooks/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/slack-webhooks/LICENSE.md +++ b/integrations/slack-webhooks/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/slack-webhooks/manifest.json b/integrations/slack-webhooks/manifest.json index 224bbdcf..8f326a06 100644 --- a/integrations/slack-webhooks/manifest.json +++ b/integrations/slack-webhooks/manifest.json @@ -1,5 +1,5 @@ { - "name": "Slack Incoming Webhooks", + "name": "Slack incoming webhooks", "version": "1.0.0", "overview": "Create webhook notifications filtered by roles or permissions.", "description": "Create webhook notifications filtered by roles or permissions.", diff --git a/integrations/splunk/LICENSE.md b/integrations/splunk/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/splunk/LICENSE.md +++ b/integrations/splunk/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/webhooks/LICENSE.md b/integrations/webhooks/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/webhooks/LICENSE.md +++ b/integrations/webhooks/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/webhooks/manifest.json b/integrations/webhooks/manifest.json index 4fe584ca..0935bc29 100644 --- a/integrations/webhooks/manifest.json +++ b/integrations/webhooks/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/integrations/webhooks", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["developer-tools"], + "categories": ["notifications"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" From 1979e5e7326c1da4cfb1bf24f33d66e3e8e29582 Mon Sep 17 00:00:00 2001 From: Aaron Aldrich Date: Mon, 6 Apr 2020 16:12:35 -0400 Subject: [PATCH 246/936] Add Elastic integration (#71) Merging based on (@ldhenry's comments here)[https://github.com/launchdarkly/ld-integrations/pull/71#issuecomment-610003469]: > Feel free to update your branch and "squash and merge" whenever you're ready. * Create Elastic integration folder, update images, manifest * remove sample data and add handlebar template * set default template, remove conditional template choices * remove extra close bracket in integrations/elastic/manifest.json * remove LICENSE.md from elastic * fix JSON syntax errors * remove extra bracket in elastic/template.json.hbs * fix readme for elastic integration * Edit README title * Fix line endings on elastic/assets/images/*.svg * Fix horizontal svg again... * Create Elastic integration folder, update images, manifest * remove sample data and add handlebar template * set default template, remove conditional template choices * remove extra close bracket in integrations/elastic/manifest.json * remove LICENSE.md from elastic * fix JSON syntax errors * remove extra bracket in elastic/template.json.hbs * fix readme for elastic integration * Edit README title * Fix line endings on elastic/assets/images/*.svg * Fix horizontal svg again... * Update template to use rfc3339 timestamp * update timestamp and changes from bwoskow-ld * fix svg images as edited by rmanalan * add tags, details, comment to template --- integrations/elastic/README.md | 9 +++ .../elastic/assets/images/horizontal.svg | 16 ++++ integrations/elastic/assets/images/square.svg | 9 +++ integrations/elastic/manifest.json | 73 +++++++++++++++++++ .../elastic/templates/template.json.hbs | 40 ++++++++++ 5 files changed, 147 insertions(+) create mode 100644 integrations/elastic/README.md create mode 100644 integrations/elastic/assets/images/horizontal.svg create mode 100644 integrations/elastic/assets/images/square.svg create mode 100644 integrations/elastic/manifest.json create mode 100644 integrations/elastic/templates/template.json.hbs diff --git a/integrations/elastic/README.md b/integrations/elastic/README.md new file mode 100644 index 00000000..3def7082 --- /dev/null +++ b/integrations/elastic/README.md @@ -0,0 +1,9 @@ +# Elastic Integration + +[User documentation](https://TODO.com) + +[API documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) + +[Elastic Create API Key Documentation](https://www.elastic.co/guide/en/elasticsearch/reference/7.6/security-api-create-api-key.html) + +Run `npm run curl elastic` in the root repository directory to generate a `curl` command to send data to your Elastic cluster. diff --git a/integrations/elastic/assets/images/horizontal.svg b/integrations/elastic/assets/images/horizontal.svg new file mode 100644 index 00000000..83f81aec --- /dev/null +++ b/integrations/elastic/assets/images/horizontal.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/integrations/elastic/assets/images/square.svg b/integrations/elastic/assets/images/square.svg new file mode 100644 index 00000000..095d69aa --- /dev/null +++ b/integrations/elastic/assets/images/square.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/integrations/elastic/manifest.json b/integrations/elastic/manifest.json new file mode 100644 index 00000000..611cb1f3 --- /dev/null +++ b/integrations/elastic/manifest.json @@ -0,0 +1,73 @@ +{ + "name": "Elastic", + "version": "0.1.0", + "overview": "Observe LaunchDarkly flag changes in the Elastic (ELK) Stack", + "description": "This integration sends LaunchDarkly audit log events to an Elasticsearch endpoint.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://elastic.co", + "privacyPolicy": "https://www.elastic.co/legal/privacy-statement" + }, + "categories": ["monitoring", "notifications"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "url", + "name": "Elasticsearch endpoint URL", + "description": "Enter the URL for your Elasticsearch endpoint including socket", + "type": "uri", + "isSecret": false, + "placeholder": "https://cluster.region.aws.found.io:9243", + "isOptional": false + }, + { + "key": "token", + "name": "Authentication token", + "description": "Enter the [base64 _credentials_ based on your API Key](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html)", + "type": "string", + "isSecret": true, + "isOptional": false + }, + { + "key": "index", + "name": "Index", + "description": "Enter the index name where you want to store your LaunchDarkly data", + "type": "string", + "isSecret": false, + "isOptional": false, + "defaultValue": "launchdarkly-audit" + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{url}}/{{index}}/_doc", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "ApiKey {{token}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "default": "templates/template.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/elastic/templates/template.json.hbs b/integrations/elastic/templates/template.json.hbs new file mode 100644 index 00000000..49be7afe --- /dev/null +++ b/integrations/elastic/templates/template.json.hbs @@ -0,0 +1,40 @@ +{ + "date": "{{timestamp.rfc3339}}", + "event": { + "kind": "{{kind}}", + "action": "{{verbKind}}" + }, + "tags": "{{tags}}", + "target": { + "name": "{{name}}", + "key": "{{key}}", + "link": "{{target._links.site.href}}" + }, + {{#if project}} + "project": { + "name": "{{project.name}}", + "key": "{{project.key}}", + "tags": "{{project.tags}}" + }, + {{#if project.environment}} + "environment": { + "name": "{{project.environment.name}}", + "key": "{{project.environment.key}}", + "tags": "{{project.environment.tags}}" + }, + {{/if}} + {{/if}} + "user": { + "id": "{{member._id}}", + "email": "{{member.email}}", + "name": { + "first": "{{member.firstName}}", + "last": "{{member.lastName}}", + "full": "{{member.firstName}} {{member.lastName}}" + }, + "link": "{{member._links.self.href}}" + }, + "message": "{{{title.plainText}}}", + "details": "{{{details.plainText}}}", + "comment": "{{{comment}}}" +} From 68f3a336785dc4f131e2c41acaee4ece486806a2 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Mon, 6 Apr 2020 14:12:37 -0700 Subject: [PATCH 247/936] Added legacy field to schema --- integrations/google-pubsub/manifest.json | 3 +++ integrations/kinesis/manifest.json | 3 +++ integrations/mparticle/manifest.json | 3 +++ integrations/segment/manifest.json | 3 +++ integrations/slack-webhooks/manifest.json | 3 +++ integrations/webhooks/manifest.json | 3 +++ manifest.schema.json | 30 ++++++++++++++++++++++- schemas/base.json | 22 ++++++++++++++++- 8 files changed, 68 insertions(+), 2 deletions(-) diff --git a/integrations/google-pubsub/manifest.json b/integrations/google-pubsub/manifest.json index 08de1f1c..a2d759fe 100644 --- a/integrations/google-pubsub/manifest.json +++ b/integrations/google-pubsub/manifest.json @@ -13,5 +13,8 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "data_export" } } diff --git a/integrations/kinesis/manifest.json b/integrations/kinesis/manifest.json index 7eec16f5..beec41ef 100644 --- a/integrations/kinesis/manifest.json +++ b/integrations/kinesis/manifest.json @@ -13,5 +13,8 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "data_export" } } diff --git a/integrations/mparticle/manifest.json b/integrations/mparticle/manifest.json index 1b022c0e..cbdf60ab 100644 --- a/integrations/mparticle/manifest.json +++ b/integrations/mparticle/manifest.json @@ -13,5 +13,8 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "data_export" } } diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json index a455e04e..9e5946a6 100644 --- a/integrations/segment/manifest.json +++ b/integrations/segment/manifest.json @@ -13,5 +13,8 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "data_export" } } diff --git a/integrations/slack-webhooks/manifest.json b/integrations/slack-webhooks/manifest.json index 8f326a06..7499a7b5 100644 --- a/integrations/slack-webhooks/manifest.json +++ b/integrations/slack-webhooks/manifest.json @@ -13,5 +13,8 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "slack-webhooks" } } diff --git a/integrations/webhooks/manifest.json b/integrations/webhooks/manifest.json index 0935bc29..2ad73e38 100644 --- a/integrations/webhooks/manifest.json +++ b/integrations/webhooks/manifest.json @@ -13,5 +13,8 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "webhooks" } } diff --git a/manifest.schema.json b/manifest.schema.json index 467ad7c1..75b4b750 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -17,7 +17,8 @@ "categories", "icons", "formVariables", - "capabilities" + "capabilities", + "legacy" ] }, "properties": { @@ -178,6 +179,33 @@ "horizontal" ] }, + "legacy": { + "$id": "#/properties/legacy", + "title": "Is legacy integration", + "description": "Integration is legacy integrations", + "type": "object", + "propertyNames": { + "enum": [ + "kind" + ] + }, + "properties": { + "kind": { + "$id": "#/properties/legacy/kind", + "title": "Kind of integration", + "description": "Kind of legacy integration", + "type": "string", + "enum": [ + "data_export", + "webhooks", + "slack-webhooks" + ] + } + }, + "required": [ + "kind" + ] + }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", diff --git a/schemas/base.json b/schemas/base.json index e172152d..f2856ea3 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -17,7 +17,8 @@ "categories", "icons", "formVariables", - "capabilities" + "capabilities", + "legacy" ] }, "properties": { @@ -161,6 +162,25 @@ }, "required": ["square", "horizontal"] }, + "legacy": { + "$id": "#/properties/legacy", + "title": "Is legacy integration", + "description": "Integration is legacy integrations", + "type": "object", + "propertyNames": { + "enum": ["kind"] + }, + "properties": { + "kind": { + "$id": "#/properties/legacy/kind", + "title": "Kind of integration", + "description": "Kind of legacy integration", + "type": "string", + "enum": ["data_export", "webhooks", "slack-webhooks"] + } + }, + "required": ["kind"] + }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", From 33a1d690d3ac9f50dbfcbc41756865a71679ba26 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Mon, 6 Apr 2020 14:42:20 -0700 Subject: [PATCH 248/936] Revert "added all legacy integrations as dummy/placeholder integrations" --- integrations/appoptics/LICENSE.md | 2 +- integrations/bitbucket/LICENSE.md | 13 ----- .../bitbucket/assets/images/horizontal.svg | 5 -- .../bitbucket/assets/images/square.svg | 1 - integrations/bitbucket/manifest.json | 17 ------- integrations/dynatrace/LICENSE.md | 2 +- integrations/git/LICENSE.md | 13 ----- integrations/git/assets/images/horizontal.svg | 33 ------------- integrations/git/assets/images/square.svg | 24 ---------- integrations/git/manifest.json | 17 ------- integrations/github/LICENSE.md | 13 ----- .../github/assets/images/horizontal.svg | 1 - integrations/github/assets/images/square.svg | 1 - integrations/github/manifest.json | 17 ------- integrations/google-pubsub/LICENSE.md | 13 ----- .../google-pubsub/assets/images/square.svg | 1 - integrations/google-pubsub/manifest.json | 20 -------- integrations/honeycomb/LICENSE.md | 2 +- integrations/kinesis/LICENSE.md | 13 ----- integrations/kinesis/assets/images/square.svg | 1 - integrations/kinesis/manifest.json | 20 -------- integrations/mparticle/LICENSE.md | 13 ----- .../mparticle/assets/images/square.svg | 1 - integrations/mparticle/manifest.json | 20 -------- integrations/msteams/LICENSE.md | 2 +- integrations/msteams/manifest.json | 2 +- integrations/sample-integration/LICENSE.md | 2 +- integrations/segment/LICENSE.md | 13 ----- integrations/segment/assets/images/square.svg | 1 - integrations/segment/manifest.json | 20 -------- integrations/slack-app/LICENSE.md | 13 ----- .../slack-app/assets/images/horizontal.svg | 47 ------------------- .../slack-app/assets/images/square.svg | 31 ------------ integrations/slack-app/manifest.json | 17 ------- integrations/slack-webhooks/LICENSE.md | 13 ----- .../assets/images/horizontal.svg | 47 ------------------- .../slack-webhooks/assets/images/square.svg | 31 ------------ integrations/slack-webhooks/manifest.json | 20 -------- integrations/splunk/LICENSE.md | 2 +- integrations/webhooks/LICENSE.md | 13 ----- .../webhooks/assets/images/square.svg | 1 - integrations/webhooks/manifest.json | 20 -------- manifest.schema.json | 30 +----------- schemas/base.json | 22 +-------- 44 files changed, 9 insertions(+), 601 deletions(-) delete mode 100644 integrations/bitbucket/LICENSE.md delete mode 100644 integrations/bitbucket/assets/images/horizontal.svg delete mode 100644 integrations/bitbucket/assets/images/square.svg delete mode 100644 integrations/bitbucket/manifest.json delete mode 100644 integrations/git/LICENSE.md delete mode 100644 integrations/git/assets/images/horizontal.svg delete mode 100644 integrations/git/assets/images/square.svg delete mode 100644 integrations/git/manifest.json delete mode 100644 integrations/github/LICENSE.md delete mode 100644 integrations/github/assets/images/horizontal.svg delete mode 100644 integrations/github/assets/images/square.svg delete mode 100644 integrations/github/manifest.json delete mode 100644 integrations/google-pubsub/LICENSE.md delete mode 100644 integrations/google-pubsub/assets/images/square.svg delete mode 100644 integrations/google-pubsub/manifest.json delete mode 100644 integrations/kinesis/LICENSE.md delete mode 100644 integrations/kinesis/assets/images/square.svg delete mode 100644 integrations/kinesis/manifest.json delete mode 100644 integrations/mparticle/LICENSE.md delete mode 100644 integrations/mparticle/assets/images/square.svg delete mode 100644 integrations/mparticle/manifest.json delete mode 100644 integrations/segment/LICENSE.md delete mode 100644 integrations/segment/assets/images/square.svg delete mode 100644 integrations/segment/manifest.json delete mode 100644 integrations/slack-app/LICENSE.md delete mode 100644 integrations/slack-app/assets/images/horizontal.svg delete mode 100644 integrations/slack-app/assets/images/square.svg delete mode 100644 integrations/slack-app/manifest.json delete mode 100644 integrations/slack-webhooks/LICENSE.md delete mode 100644 integrations/slack-webhooks/assets/images/horizontal.svg delete mode 100644 integrations/slack-webhooks/assets/images/square.svg delete mode 100644 integrations/slack-webhooks/manifest.json delete mode 100644 integrations/webhooks/LICENSE.md delete mode 100644 integrations/webhooks/assets/images/square.svg delete mode 100644 integrations/webhooks/manifest.json diff --git a/integrations/appoptics/LICENSE.md b/integrations/appoptics/LICENSE.md index 9dcbe896..aa12a4cb 100644 --- a/integrations/appoptics/LICENSE.md +++ b/integrations/appoptics/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020 Catamorphic Co. +Copyright 2019 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/bitbucket/LICENSE.md b/integrations/bitbucket/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/bitbucket/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/bitbucket/assets/images/horizontal.svg b/integrations/bitbucket/assets/images/horizontal.svg deleted file mode 100644 index 2cb3544e..00000000 --- a/integrations/bitbucket/assets/images/horizontal.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/integrations/bitbucket/assets/images/square.svg b/integrations/bitbucket/assets/images/square.svg deleted file mode 100644 index 822e6372..00000000 --- a/integrations/bitbucket/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json deleted file mode 100644 index a652757b..00000000 --- a/integrations/bitbucket/manifest.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "Bitbucket", - "version": "1.0.0", - "overview": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", - "description": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/integrations/git-code-references/bitbucket-pipes", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["version-control"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - } -} diff --git a/integrations/dynatrace/LICENSE.md b/integrations/dynatrace/LICENSE.md index 9dcbe896..aa12a4cb 100644 --- a/integrations/dynatrace/LICENSE.md +++ b/integrations/dynatrace/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020 Catamorphic Co. +Copyright 2019 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/git/LICENSE.md b/integrations/git/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/git/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/git/assets/images/horizontal.svg b/integrations/git/assets/images/horizontal.svg deleted file mode 100644 index a02337b8..00000000 --- a/integrations/git/assets/images/horizontal.svg +++ /dev/null @@ -1,33 +0,0 @@ - -image/svg+xml diff --git a/integrations/git/assets/images/square.svg b/integrations/git/assets/images/square.svg deleted file mode 100644 index c6b86dca..00000000 --- a/integrations/git/assets/images/square.svg +++ /dev/null @@ -1,24 +0,0 @@ - -image/svg+xml diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json deleted file mode 100644 index 805d1cea..00000000 --- a/integrations/git/manifest.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "Git", - "version": "1.0.0", - "overview": "Use our open-source utility to track references to flags in your code, running in your CI build.", - "description": "Use our open-source utility to track references to flags in your code, running in your CI build.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/integrations/git-code-references", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["version-control"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - } -} diff --git a/integrations/github/LICENSE.md b/integrations/github/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/github/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/github/assets/images/horizontal.svg b/integrations/github/assets/images/horizontal.svg deleted file mode 100644 index d49ba3b2..00000000 --- a/integrations/github/assets/images/horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/github/assets/images/square.svg b/integrations/github/assets/images/square.svg deleted file mode 100644 index 05620534..00000000 --- a/integrations/github/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json deleted file mode 100644 index ea4754c8..00000000 --- a/integrations/github/manifest.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "GitHub", - "version": "1.0.0", - "overview": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", - "description": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/integrations/git-code-references/github-actions", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["version-control"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - } -} diff --git a/integrations/google-pubsub/LICENSE.md b/integrations/google-pubsub/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/google-pubsub/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/google-pubsub/assets/images/square.svg b/integrations/google-pubsub/assets/images/square.svg deleted file mode 100644 index b91ade33..00000000 --- a/integrations/google-pubsub/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/google-pubsub/manifest.json b/integrations/google-pubsub/manifest.json deleted file mode 100644 index a2d759fe..00000000 --- a/integrations/google-pubsub/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "Google Cloud Pub/Sub", - "version": "1.0.0", - "overview": "Export real-time flag analytics data.", - "description": "Export your real-time flag analytics data to Google Cloud Pub/Sub.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/integrations/data-export/google-pubsub", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["data"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/square.svg" - }, - "legacy": { - "kind": "data_export" - } -} diff --git a/integrations/honeycomb/LICENSE.md b/integrations/honeycomb/LICENSE.md index 9dcbe896..aa12a4cb 100644 --- a/integrations/honeycomb/LICENSE.md +++ b/integrations/honeycomb/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020 Catamorphic Co. +Copyright 2019 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/kinesis/LICENSE.md b/integrations/kinesis/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/kinesis/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/kinesis/assets/images/square.svg b/integrations/kinesis/assets/images/square.svg deleted file mode 100644 index 1bd16a64..00000000 --- a/integrations/kinesis/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/kinesis/manifest.json b/integrations/kinesis/manifest.json deleted file mode 100644 index beec41ef..00000000 --- a/integrations/kinesis/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "Amazon Kinesis", - "version": "1.0.0", - "overview": "Export real-time flag analytics data.", - "description": "Export your real-time flag analytics data to Amazon Kinesis.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/integrations/data-export/kinesis", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["data"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/square.svg" - }, - "legacy": { - "kind": "data_export" - } -} diff --git a/integrations/mparticle/LICENSE.md b/integrations/mparticle/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/mparticle/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/mparticle/assets/images/square.svg b/integrations/mparticle/assets/images/square.svg deleted file mode 100644 index a413f77f..00000000 --- a/integrations/mparticle/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/mparticle/manifest.json b/integrations/mparticle/manifest.json deleted file mode 100644 index cbdf60ab..00000000 --- a/integrations/mparticle/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "mParticle", - "version": "1.0.0", - "overview": "Export real-time flag analytics data.", - "description": "Export your real-time flag analytics data to mParticle.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/integrations/data-export/mparticle", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["data"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/square.svg" - }, - "legacy": { - "kind": "data_export" - } -} diff --git a/integrations/msteams/LICENSE.md b/integrations/msteams/LICENSE.md index 9dcbe896..aa12a4cb 100644 --- a/integrations/msteams/LICENSE.md +++ b/integrations/msteams/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020 Catamorphic Co. +Copyright 2019 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 9a3cab5d..d927ae50 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/msteams", "privacyPolicy": "https://privacy.microsoft.com/en-us" }, - "categories": ["notifications"], + "categories": ["collaboration", "notifications"], "icons": { "square": "assets/images/microsoft-teams.svg", "horizontal": "assets/images/microsoft-teams.svg" diff --git a/integrations/sample-integration/LICENSE.md b/integrations/sample-integration/LICENSE.md index 9dcbe896..aa12a4cb 100644 --- a/integrations/sample-integration/LICENSE.md +++ b/integrations/sample-integration/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020 Catamorphic Co. +Copyright 2019 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/segment/LICENSE.md b/integrations/segment/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/segment/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/segment/assets/images/square.svg b/integrations/segment/assets/images/square.svg deleted file mode 100644 index 7b54e7a2..00000000 --- a/integrations/segment/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json deleted file mode 100644 index 9e5946a6..00000000 --- a/integrations/segment/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "Segment", - "version": "1.0.0", - "overview": "Export real-time flag analytics data.", - "description": "Export your real-time flag analytics data to Segment.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/integrations/data-export/segment", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["data"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/square.svg" - }, - "legacy": { - "kind": "data_export" - } -} diff --git a/integrations/slack-app/LICENSE.md b/integrations/slack-app/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/slack-app/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/slack-app/assets/images/horizontal.svg b/integrations/slack-app/assets/images/horizontal.svg deleted file mode 100644 index 0c866595..00000000 --- a/integrations/slack-app/assets/images/horizontal.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/slack-app/assets/images/square.svg b/integrations/slack-app/assets/images/square.svg deleted file mode 100644 index 954f33fa..00000000 --- a/integrations/slack-app/assets/images/square.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json deleted file mode 100644 index 7dee4228..00000000 --- a/integrations/slack-app/manifest.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "Slack App", - "version": "1.0.0", - "overview": "View, monitor, and control flags interactively from our official Slack app.", - "description": "With the LaunchDarkly Slack app, you can view, monitor, and control feature flags directly from your team's Slack workspace. Use the app to find feature flags, subscribe channels to notifications about flag changes, and toggle flags on or off.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://slack.com/apps/AKEEF9DTM-launchdarkly", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["notifications"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - } -} diff --git a/integrations/slack-webhooks/LICENSE.md b/integrations/slack-webhooks/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/slack-webhooks/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/slack-webhooks/assets/images/horizontal.svg b/integrations/slack-webhooks/assets/images/horizontal.svg deleted file mode 100644 index 0c866595..00000000 --- a/integrations/slack-webhooks/assets/images/horizontal.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/slack-webhooks/assets/images/square.svg b/integrations/slack-webhooks/assets/images/square.svg deleted file mode 100644 index 954f33fa..00000000 --- a/integrations/slack-webhooks/assets/images/square.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/slack-webhooks/manifest.json b/integrations/slack-webhooks/manifest.json deleted file mode 100644 index 7499a7b5..00000000 --- a/integrations/slack-webhooks/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "Slack incoming webhooks", - "version": "1.0.0", - "overview": "Create webhook notifications filtered by roles or permissions.", - "description": "Create webhook notifications filtered by roles or permissions.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/integrations/slack/webhooks", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["notifications"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - "legacy": { - "kind": "slack-webhooks" - } -} diff --git a/integrations/splunk/LICENSE.md b/integrations/splunk/LICENSE.md index 9dcbe896..aa12a4cb 100644 --- a/integrations/splunk/LICENSE.md +++ b/integrations/splunk/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020 Catamorphic Co. +Copyright 2019 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/webhooks/LICENSE.md b/integrations/webhooks/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/webhooks/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/webhooks/assets/images/square.svg b/integrations/webhooks/assets/images/square.svg deleted file mode 100644 index d519b566..00000000 --- a/integrations/webhooks/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/webhooks/manifest.json b/integrations/webhooks/manifest.json deleted file mode 100644 index 2ad73e38..00000000 --- a/integrations/webhooks/manifest.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "Webhooks", - "version": "1.0.0", - "overview": "Subscribe to changes in flags, users, and more.", - "description": "Subscribe to LaunchDarkly with webhooks that are notified about changes in flags, environments, users, and more.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://docs.launchdarkly.com/integrations/webhooks", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["notifications"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/square.svg" - }, - "legacy": { - "kind": "webhooks" - } -} diff --git a/manifest.schema.json b/manifest.schema.json index 75b4b750..467ad7c1 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -17,8 +17,7 @@ "categories", "icons", "formVariables", - "capabilities", - "legacy" + "capabilities" ] }, "properties": { @@ -179,33 +178,6 @@ "horizontal" ] }, - "legacy": { - "$id": "#/properties/legacy", - "title": "Is legacy integration", - "description": "Integration is legacy integrations", - "type": "object", - "propertyNames": { - "enum": [ - "kind" - ] - }, - "properties": { - "kind": { - "$id": "#/properties/legacy/kind", - "title": "Kind of integration", - "description": "Kind of legacy integration", - "type": "string", - "enum": [ - "data_export", - "webhooks", - "slack-webhooks" - ] - } - }, - "required": [ - "kind" - ] - }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", diff --git a/schemas/base.json b/schemas/base.json index f2856ea3..e172152d 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -17,8 +17,7 @@ "categories", "icons", "formVariables", - "capabilities", - "legacy" + "capabilities" ] }, "properties": { @@ -162,25 +161,6 @@ }, "required": ["square", "horizontal"] }, - "legacy": { - "$id": "#/properties/legacy", - "title": "Is legacy integration", - "description": "Integration is legacy integrations", - "type": "object", - "propertyNames": { - "enum": ["kind"] - }, - "properties": { - "kind": { - "$id": "#/properties/legacy/kind", - "title": "Kind of integration", - "description": "Kind of legacy integration", - "type": "string", - "enum": ["data_export", "webhooks", "slack-webhooks"] - } - }, - "required": ["kind"] - }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", From 3d5dc3540d835e067d80c7b8daf69646a72ce9a7 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 7 Apr 2020 14:12:29 +0100 Subject: [PATCH 249/936] Remove additional properties and add test to prevent it from coming back (#76) --- ...ate.js => validateIntegrationManifests.js} | 0 __tests__/validateSchemas.js | 22 +++++++++++++++++++ manifest.schema.json | 2 -- schemas/base.json | 1 - schemas/capabilities/parser/parser.json | 1 - 5 files changed, 22 insertions(+), 4 deletions(-) rename __tests__/{validate.js => validateIntegrationManifests.js} (100%) create mode 100644 __tests__/validateSchemas.js diff --git a/__tests__/validate.js b/__tests__/validateIntegrationManifests.js similarity index 100% rename from __tests__/validate.js rename to __tests__/validateIntegrationManifests.js diff --git a/__tests__/validateSchemas.js b/__tests__/validateSchemas.js new file mode 100644 index 00000000..633a00f7 --- /dev/null +++ b/__tests__/validateSchemas.js @@ -0,0 +1,22 @@ +const schema = require('../manifest.schema.json'); + +//disallowsAdditionalProperties deeply checks if a json schema ever sets 'additionalProperties' +// to false. This setting is currently incompatible with the integrations framework. +const disallowsAdditionalProperties = schema => { + for (prop in schema) { + if (prop === 'additionalProperties' && schema[prop] === false) { + return true; + } + if ( + typeof schema[prop] === 'object' && + disallowsAdditionalProperties(schema[prop]) + ) { + return true; + } + } + return false; +}; + +test('Does not set additionalProperties:false', () => { + expect(disallowsAdditionalProperties(schema)).toBe(false); +}); diff --git a/manifest.schema.json b/manifest.schema.json index 467ad7c1..6ecfa796 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -4,7 +4,6 @@ "title": "LaunchDarkly Integrations Manifest", "description": "Describes the capabilities and intent of a LaunchDarkly integration", "type": "object", - "additionalProperties": false, "propertyNames": { "enum": [ "name", @@ -719,7 +718,6 @@ "title": "Response parser", "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", "type": "object", - "additionalProperties": false, "properties": { "id": { "$id": "#/properties/id", diff --git a/schemas/base.json b/schemas/base.json index e172152d..e974fbb5 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -4,7 +4,6 @@ "title": "LaunchDarkly Integrations Manifest", "description": "Describes the capabilities and intent of a LaunchDarkly integration", "type": "object", - "additionalProperties": false, "propertyNames": { "enum": [ "name", diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index 5307d09d..393ee08a 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -5,7 +5,6 @@ "title": "Response parser", "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", "type": "object", - "additionalProperties": false, "properties": { "id": { "$id": "#/properties/id", From 02c4515fac987f2bc8ef2a03555c5f6c4ed6adc8 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Tue, 7 Apr 2020 15:14:40 -0700 Subject: [PATCH 250/936] Added property "legacy" to manifest schema (#77) --- manifest.schema.json | 30 +++++++++++++++++++++++++++++- schemas/base.json | 22 +++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/manifest.schema.json b/manifest.schema.json index 6ecfa796..0abdad5b 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -16,7 +16,8 @@ "categories", "icons", "formVariables", - "capabilities" + "capabilities", + "legacy" ] }, "properties": { @@ -177,6 +178,33 @@ "horizontal" ] }, + "legacy": { + "$id": "#/properties/legacy", + "title": "Legacy", + "description": "Legacy integration", + "type": "object", + "propertyNames": { + "enum": [ + "kind" + ] + }, + "properties": { + "kind": { + "$id": "#/properties/legacy/kind", + "title": "Kind", + "description": "Kind of legacy integration", + "type": "string", + "enum": [ + "dataExport", + "webhooks", + "slackWebhooks" + ] + } + }, + "required": [ + "kind" + ] + }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", diff --git a/schemas/base.json b/schemas/base.json index e974fbb5..18bd2ad1 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -16,7 +16,8 @@ "categories", "icons", "formVariables", - "capabilities" + "capabilities", + "legacy" ] }, "properties": { @@ -160,6 +161,25 @@ }, "required": ["square", "horizontal"] }, + "legacy": { + "$id": "#/properties/legacy", + "title": "Legacy", + "description": "Legacy integration", + "type": "object", + "propertyNames": { + "enum": ["kind"] + }, + "properties": { + "kind": { + "$id": "#/properties/legacy/kind", + "title": "Kind", + "description": "Kind of legacy integration", + "type": "string", + "enum": ["dataExport", "webhooks", "slackWebhooks"] + } + }, + "required": ["kind"] + }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", From eec3ac6d2e0ccf51e8f7e899b99b3c40c4e0038e Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 8 Apr 2020 12:33:40 -0700 Subject: [PATCH 251/936] Added legacy integration manifests (#78) - Each legacy integration contains a legacy property. - Updated the copyright year on licenses. --- integrations/appoptics/LICENSE.md | 2 +- integrations/bitbucket/LICENSE.md | 13 +++++ .../bitbucket/assets/images/horizontal.svg | 5 ++ .../bitbucket/assets/images/square.svg | 1 + integrations/bitbucket/manifest.json | 17 +++++++ integrations/dynatrace/LICENSE.md | 2 +- integrations/git/LICENSE.md | 13 +++++ integrations/git/assets/images/horizontal.svg | 33 +++++++++++++ integrations/git/assets/images/square.svg | 24 ++++++++++ integrations/git/manifest.json | 17 +++++++ integrations/github/LICENSE.md | 13 +++++ .../github/assets/images/horizontal.svg | 1 + integrations/github/assets/images/square.svg | 1 + integrations/github/manifest.json | 17 +++++++ integrations/google-pubsub/LICENSE.md | 13 +++++ .../google-pubsub/assets/images/square.svg | 1 + integrations/google-pubsub/manifest.json | 20 ++++++++ integrations/honeycomb/LICENSE.md | 2 +- integrations/kinesis/LICENSE.md | 13 +++++ integrations/kinesis/assets/images/square.svg | 1 + integrations/kinesis/manifest.json | 20 ++++++++ integrations/mparticle/LICENSE.md | 13 +++++ .../mparticle/assets/images/square.svg | 1 + integrations/mparticle/manifest.json | 20 ++++++++ integrations/msteams/LICENSE.md | 2 +- integrations/msteams/manifest.json | 2 +- integrations/sample-integration/LICENSE.md | 2 +- integrations/segment/LICENSE.md | 13 +++++ integrations/segment/assets/images/square.svg | 1 + integrations/segment/manifest.json | 20 ++++++++ integrations/slack-app/LICENSE.md | 13 +++++ .../slack-app/assets/images/horizontal.svg | 47 +++++++++++++++++++ .../slack-app/assets/images/square.svg | 31 ++++++++++++ integrations/slack-app/manifest.json | 17 +++++++ integrations/slack-webhooks/LICENSE.md | 13 +++++ .../assets/images/horizontal.svg | 47 +++++++++++++++++++ .../slack-webhooks/assets/images/square.svg | 31 ++++++++++++ integrations/slack-webhooks/manifest.json | 20 ++++++++ integrations/splunk/LICENSE.md | 2 +- integrations/webhooks/LICENSE.md | 13 +++++ .../webhooks/assets/images/square.svg | 1 + integrations/webhooks/manifest.json | 20 ++++++++ 42 files changed, 551 insertions(+), 7 deletions(-) create mode 100644 integrations/bitbucket/LICENSE.md create mode 100644 integrations/bitbucket/assets/images/horizontal.svg create mode 100644 integrations/bitbucket/assets/images/square.svg create mode 100644 integrations/bitbucket/manifest.json create mode 100644 integrations/git/LICENSE.md create mode 100644 integrations/git/assets/images/horizontal.svg create mode 100644 integrations/git/assets/images/square.svg create mode 100644 integrations/git/manifest.json create mode 100644 integrations/github/LICENSE.md create mode 100644 integrations/github/assets/images/horizontal.svg create mode 100644 integrations/github/assets/images/square.svg create mode 100644 integrations/github/manifest.json create mode 100644 integrations/google-pubsub/LICENSE.md create mode 100644 integrations/google-pubsub/assets/images/square.svg create mode 100644 integrations/google-pubsub/manifest.json create mode 100644 integrations/kinesis/LICENSE.md create mode 100644 integrations/kinesis/assets/images/square.svg create mode 100644 integrations/kinesis/manifest.json create mode 100644 integrations/mparticle/LICENSE.md create mode 100644 integrations/mparticle/assets/images/square.svg create mode 100644 integrations/mparticle/manifest.json create mode 100644 integrations/segment/LICENSE.md create mode 100644 integrations/segment/assets/images/square.svg create mode 100644 integrations/segment/manifest.json create mode 100644 integrations/slack-app/LICENSE.md create mode 100644 integrations/slack-app/assets/images/horizontal.svg create mode 100644 integrations/slack-app/assets/images/square.svg create mode 100644 integrations/slack-app/manifest.json create mode 100644 integrations/slack-webhooks/LICENSE.md create mode 100644 integrations/slack-webhooks/assets/images/horizontal.svg create mode 100644 integrations/slack-webhooks/assets/images/square.svg create mode 100644 integrations/slack-webhooks/manifest.json create mode 100644 integrations/webhooks/LICENSE.md create mode 100644 integrations/webhooks/assets/images/square.svg create mode 100644 integrations/webhooks/manifest.json diff --git a/integrations/appoptics/LICENSE.md b/integrations/appoptics/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/appoptics/LICENSE.md +++ b/integrations/appoptics/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/bitbucket/LICENSE.md b/integrations/bitbucket/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/bitbucket/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/bitbucket/assets/images/horizontal.svg b/integrations/bitbucket/assets/images/horizontal.svg new file mode 100644 index 00000000..2cb3544e --- /dev/null +++ b/integrations/bitbucket/assets/images/horizontal.svg @@ -0,0 +1,5 @@ + diff --git a/integrations/bitbucket/assets/images/square.svg b/integrations/bitbucket/assets/images/square.svg new file mode 100644 index 00000000..822e6372 --- /dev/null +++ b/integrations/bitbucket/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json new file mode 100644 index 00000000..a652757b --- /dev/null +++ b/integrations/bitbucket/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Bitbucket", + "version": "1.0.0", + "overview": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", + "description": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/git-code-references/bitbucket-pipes", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["version-control"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/dynatrace/LICENSE.md b/integrations/dynatrace/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/dynatrace/LICENSE.md +++ b/integrations/dynatrace/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/git/LICENSE.md b/integrations/git/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/git/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/git/assets/images/horizontal.svg b/integrations/git/assets/images/horizontal.svg new file mode 100644 index 00000000..a02337b8 --- /dev/null +++ b/integrations/git/assets/images/horizontal.svg @@ -0,0 +1,33 @@ + +image/svg+xml diff --git a/integrations/git/assets/images/square.svg b/integrations/git/assets/images/square.svg new file mode 100644 index 00000000..c6b86dca --- /dev/null +++ b/integrations/git/assets/images/square.svg @@ -0,0 +1,24 @@ + +image/svg+xml diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json new file mode 100644 index 00000000..805d1cea --- /dev/null +++ b/integrations/git/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Git", + "version": "1.0.0", + "overview": "Use our open-source utility to track references to flags in your code, running in your CI build.", + "description": "Use our open-source utility to track references to flags in your code, running in your CI build.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/git-code-references", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["version-control"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/github/LICENSE.md b/integrations/github/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/github/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/github/assets/images/horizontal.svg b/integrations/github/assets/images/horizontal.svg new file mode 100644 index 00000000..d49ba3b2 --- /dev/null +++ b/integrations/github/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/github/assets/images/square.svg b/integrations/github/assets/images/square.svg new file mode 100644 index 00000000..05620534 --- /dev/null +++ b/integrations/github/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json new file mode 100644 index 00000000..ea4754c8 --- /dev/null +++ b/integrations/github/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "GitHub", + "version": "1.0.0", + "overview": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", + "description": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/git-code-references/github-actions", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["version-control"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/google-pubsub/LICENSE.md b/integrations/google-pubsub/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/google-pubsub/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/google-pubsub/assets/images/square.svg b/integrations/google-pubsub/assets/images/square.svg new file mode 100644 index 00000000..b91ade33 --- /dev/null +++ b/integrations/google-pubsub/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/google-pubsub/manifest.json b/integrations/google-pubsub/manifest.json new file mode 100644 index 00000000..9c6b8d1c --- /dev/null +++ b/integrations/google-pubsub/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Google Cloud Pub/Sub", + "version": "1.0.0", + "overview": "Export real-time flag analytics data.", + "description": "Export your real-time flag analytics data to Google Cloud Pub/Sub.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/data-export/google-pubsub", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "dataExport" + } +} diff --git a/integrations/honeycomb/LICENSE.md b/integrations/honeycomb/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/honeycomb/LICENSE.md +++ b/integrations/honeycomb/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/kinesis/LICENSE.md b/integrations/kinesis/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/kinesis/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/kinesis/assets/images/square.svg b/integrations/kinesis/assets/images/square.svg new file mode 100644 index 00000000..1bd16a64 --- /dev/null +++ b/integrations/kinesis/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/kinesis/manifest.json b/integrations/kinesis/manifest.json new file mode 100644 index 00000000..cd88a0ea --- /dev/null +++ b/integrations/kinesis/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Amazon Kinesis", + "version": "1.0.0", + "overview": "Export real-time flag analytics data.", + "description": "Export your real-time flag analytics data to Amazon Kinesis.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/data-export/kinesis", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "dataExport" + } +} diff --git a/integrations/mparticle/LICENSE.md b/integrations/mparticle/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/mparticle/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/mparticle/assets/images/square.svg b/integrations/mparticle/assets/images/square.svg new file mode 100644 index 00000000..a413f77f --- /dev/null +++ b/integrations/mparticle/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/mparticle/manifest.json b/integrations/mparticle/manifest.json new file mode 100644 index 00000000..246acbfc --- /dev/null +++ b/integrations/mparticle/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "mParticle", + "version": "1.0.0", + "overview": "Export real-time flag analytics data.", + "description": "Export your real-time flag analytics data to mParticle.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/data-export/mparticle", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "dataExport" + } +} diff --git a/integrations/msteams/LICENSE.md b/integrations/msteams/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/msteams/LICENSE.md +++ b/integrations/msteams/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index d927ae50..9a3cab5d 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -9,7 +9,7 @@ "site": "https://docs.launchdarkly.com/docs/msteams", "privacyPolicy": "https://privacy.microsoft.com/en-us" }, - "categories": ["collaboration", "notifications"], + "categories": ["notifications"], "icons": { "square": "assets/images/microsoft-teams.svg", "horizontal": "assets/images/microsoft-teams.svg" diff --git a/integrations/sample-integration/LICENSE.md b/integrations/sample-integration/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/sample-integration/LICENSE.md +++ b/integrations/sample-integration/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/segment/LICENSE.md b/integrations/segment/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/segment/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/segment/assets/images/square.svg b/integrations/segment/assets/images/square.svg new file mode 100644 index 00000000..7b54e7a2 --- /dev/null +++ b/integrations/segment/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json new file mode 100644 index 00000000..0550ca3b --- /dev/null +++ b/integrations/segment/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Segment", + "version": "1.0.0", + "overview": "Export real-time flag analytics data.", + "description": "Export your real-time flag analytics data to Segment.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/data-export/segment", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "dataExport" + } +} diff --git a/integrations/slack-app/LICENSE.md b/integrations/slack-app/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/slack-app/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/slack-app/assets/images/horizontal.svg b/integrations/slack-app/assets/images/horizontal.svg new file mode 100644 index 00000000..0c866595 --- /dev/null +++ b/integrations/slack-app/assets/images/horizontal.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/slack-app/assets/images/square.svg b/integrations/slack-app/assets/images/square.svg new file mode 100644 index 00000000..954f33fa --- /dev/null +++ b/integrations/slack-app/assets/images/square.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json new file mode 100644 index 00000000..7dee4228 --- /dev/null +++ b/integrations/slack-app/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "Slack App", + "version": "1.0.0", + "overview": "View, monitor, and control flags interactively from our official Slack app.", + "description": "With the LaunchDarkly Slack app, you can view, monitor, and control feature flags directly from your team's Slack workspace. Use the app to find feature flags, subscribe channels to notifications about flag changes, and toggle flags on or off.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://slack.com/apps/AKEEF9DTM-launchdarkly", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["notifications"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} diff --git a/integrations/slack-webhooks/LICENSE.md b/integrations/slack-webhooks/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/slack-webhooks/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/slack-webhooks/assets/images/horizontal.svg b/integrations/slack-webhooks/assets/images/horizontal.svg new file mode 100644 index 00000000..0c866595 --- /dev/null +++ b/integrations/slack-webhooks/assets/images/horizontal.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/slack-webhooks/assets/images/square.svg b/integrations/slack-webhooks/assets/images/square.svg new file mode 100644 index 00000000..954f33fa --- /dev/null +++ b/integrations/slack-webhooks/assets/images/square.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/slack-webhooks/manifest.json b/integrations/slack-webhooks/manifest.json new file mode 100644 index 00000000..56237722 --- /dev/null +++ b/integrations/slack-webhooks/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Slack incoming webhooks", + "version": "1.0.0", + "overview": "Create webhook notifications filtered by roles or permissions.", + "description": "Create webhook notifications filtered by roles or permissions.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/slack/webhooks", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["notifications"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "slackWebhooks" + } +} diff --git a/integrations/splunk/LICENSE.md b/integrations/splunk/LICENSE.md index aa12a4cb..9dcbe896 100644 --- a/integrations/splunk/LICENSE.md +++ b/integrations/splunk/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2019 Catamorphic Co. +Copyright 2020 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/integrations/webhooks/LICENSE.md b/integrations/webhooks/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/webhooks/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/webhooks/assets/images/square.svg b/integrations/webhooks/assets/images/square.svg new file mode 100644 index 00000000..d519b566 --- /dev/null +++ b/integrations/webhooks/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/webhooks/manifest.json b/integrations/webhooks/manifest.json new file mode 100644 index 00000000..2ad73e38 --- /dev/null +++ b/integrations/webhooks/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Webhooks", + "version": "1.0.0", + "overview": "Subscribe to changes in flags, users, and more.", + "description": "Subscribe to LaunchDarkly with webhooks that are notified about changes in flags, environments, users, and more.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/webhooks", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["notifications"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "webhooks" + } +} From c9a392f41aeea8ad4419f13787d534041cbfc947 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Fri, 10 Apr 2020 11:48:25 -0700 Subject: [PATCH 252/936] added coderef to enum for legacy. Implimented on git, github, bitbucket integrations (#79) --- integrations/bitbucket/manifest.json | 3 +++ integrations/git/manifest.json | 3 +++ integrations/github/manifest.json | 3 +++ manifest.schema.json | 3 ++- schemas/base.json | 2 +- 5 files changed, 12 insertions(+), 2 deletions(-) diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json index a652757b..9c2e7a38 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket/manifest.json @@ -13,5 +13,8 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "codeRefs" } } diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json index 805d1cea..f74bbf87 100644 --- a/integrations/git/manifest.json +++ b/integrations/git/manifest.json @@ -13,5 +13,8 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "codeRefs" } } diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index ea4754c8..afaf92a3 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -13,5 +13,8 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "codeRefs" } } diff --git a/manifest.schema.json b/manifest.schema.json index 0abdad5b..4f976e1d 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -197,7 +197,8 @@ "enum": [ "dataExport", "webhooks", - "slackWebhooks" + "slackWebhooks", + "codeRefs" ] } }, diff --git a/schemas/base.json b/schemas/base.json index 18bd2ad1..732814da 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -175,7 +175,7 @@ "title": "Kind", "description": "Kind of legacy integration", "type": "string", - "enum": ["dataExport", "webhooks", "slackWebhooks"] + "enum": ["dataExport", "webhooks", "slackWebhooks", "codeRefs"] } }, "required": ["kind"] From d79e636398f19531ae28dd8c17cc9e9059c49f89 Mon Sep 17 00:00:00 2001 From: Aaron Aldrich Date: Fri, 10 Apr 2020 16:58:37 -0400 Subject: [PATCH 253/936] fix name for consistency, update docs link (#81) * fix name for consistency, update docs link * remove the "the" --- integrations/elastic/README.md | 4 ++-- integrations/elastic/manifest.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/elastic/README.md b/integrations/elastic/README.md index 3def7082..e77816a4 100644 --- a/integrations/elastic/README.md +++ b/integrations/elastic/README.md @@ -1,6 +1,6 @@ -# Elastic Integration +# The Elastic (ELK) Stack Integration -[User documentation](https://TODO.com) +[User documentation](https://docs.launchdarkly.com/integrations/elastic) [API documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) diff --git a/integrations/elastic/manifest.json b/integrations/elastic/manifest.json index 611cb1f3..a5b79414 100644 --- a/integrations/elastic/manifest.json +++ b/integrations/elastic/manifest.json @@ -1,6 +1,6 @@ { - "name": "Elastic", - "version": "0.1.0", + "name": "Elastic (ELK) Stack", + "version": "1.0.0", "overview": "Observe LaunchDarkly flag changes in the Elastic (ELK) Stack", "description": "This integration sends LaunchDarkly audit log events to an Elasticsearch endpoint.", "author": "LaunchDarkly", From ff898b7cba11318e449bd1238c95834b42124eb5 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 16 Apr 2020 09:36:54 -0700 Subject: [PATCH 254/936] separate stg, catfood, and prod 'deploys' to s3 buckets (#82) --- .circleci/config.yml | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 76ede668..602c05c3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -27,26 +27,19 @@ jobs: name: Run tests command: npm test deploy-to-s3: + parameters: + bucket-name: + type: string machine: enabled: true steps: - checkout - aws-cli/install - run: - name: Deploy to production bucket + name: Deploy to s3 bucket command: ./scripts/copy_to_s3.sh environment: - BUCKET_NAME: launchdarkly-integrations-production - - run: - name: Deploy to staging bucket - command: ./scripts/copy_to_s3.sh - environment: - BUCKET_NAME: launchdarkly-integrations-staging - - run: - name: Deploy to catfood bucket - command: ./scripts/copy_to_s3.sh - environment: - BUCKET_NAME: launchdarkly-integrations-catamorphic + BUCKET_NAME: << parameters.bucket-name >> workflows: version: 2.1 @@ -61,3 +54,18 @@ workflows: filters: branches: only: master + bucket-name: launchdarkly-integrations-staging + - deploy-to-s3: + requires: + - build + filters: + branches: + only: deploy-catamorphic + bucket-name: launchdarkly-integrations-catamorphic + - deploy-to-s3: + requires: + - build + filters: + branches: + only: deploy-production + bucket-name: launchdarkly-integrations-production From 3e22d4d8826e7c0963c53c079ad02690ca0bb106 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Mon, 20 Apr 2020 15:40:36 -0700 Subject: [PATCH 255/936] added legacy version of DataDog Integration (#80) * added legacy version of datadog --- .../datadog-legacy/assets/horizontal.svg | 64 +++++++++++++++++++ integrations/datadog-legacy/assets/square.svg | 41 ++++++++++++ integrations/datadog-legacy/manifest.json | 20 ++++++ manifest.schema.json | 5 +- schemas/base.json | 8 ++- 5 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 integrations/datadog-legacy/assets/horizontal.svg create mode 100644 integrations/datadog-legacy/assets/square.svg create mode 100644 integrations/datadog-legacy/manifest.json diff --git a/integrations/datadog-legacy/assets/horizontal.svg b/integrations/datadog-legacy/assets/horizontal.svg new file mode 100644 index 00000000..de5ec9d6 --- /dev/null +++ b/integrations/datadog-legacy/assets/horizontal.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/datadog-legacy/assets/square.svg b/integrations/datadog-legacy/assets/square.svg new file mode 100644 index 00000000..f39a6ac1 --- /dev/null +++ b/integrations/datadog-legacy/assets/square.svg @@ -0,0 +1,41 @@ + + + + + + diff --git a/integrations/datadog-legacy/manifest.json b/integrations/datadog-legacy/manifest.json new file mode 100644 index 00000000..d15bcc99 --- /dev/null +++ b/integrations/datadog-legacy/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Datadog", + "version": "1.0.0", + "overview": "Monitor LaunchDarkly changes in Datadog", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Datadog.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com/integrations/datadog", + "privacyPolicy": "https://www.datadoghq.com/legal/privacy" + }, + "categories": ["monitoring", "notifications"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "legacy": { + "kind": "datadog" + } +} diff --git a/manifest.schema.json b/manifest.schema.json index 4f976e1d..f01bd32d 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -195,10 +195,11 @@ "description": "Kind of legacy integration", "type": "string", "enum": [ + "codeRefs", + "datadog", "dataExport", - "webhooks", "slackWebhooks", - "codeRefs" + "webhooks" ] } }, diff --git a/schemas/base.json b/schemas/base.json index 732814da..38759f6e 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -175,7 +175,13 @@ "title": "Kind", "description": "Kind of legacy integration", "type": "string", - "enum": ["dataExport", "webhooks", "slackWebhooks", "codeRefs"] + "enum": [ + "codeRefs", + "datadog", + "dataExport", + "slackWebhooks", + "webhooks" + ] } }, "required": ["kind"] From a80e02a68594339c0ecd1816da272cf3f57b0128 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 23 Apr 2020 13:57:43 -0700 Subject: [PATCH 256/936] modified svgs to remove white space border on slack icon (#84) --- .../slack-app/assets/images/square.svg | 39 +++++-------------- .../slack-webhooks/assets/images/square.svg | 39 +++++-------------- 2 files changed, 18 insertions(+), 60 deletions(-) diff --git a/integrations/slack-app/assets/images/square.svg b/integrations/slack-app/assets/images/square.svg index 954f33fa..108f005d 100644 --- a/integrations/slack-app/assets/images/square.svg +++ b/integrations/slack-app/assets/images/square.svg @@ -1,31 +1,10 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + diff --git a/integrations/slack-webhooks/assets/images/square.svg b/integrations/slack-webhooks/assets/images/square.svg index 954f33fa..108f005d 100644 --- a/integrations/slack-webhooks/assets/images/square.svg +++ b/integrations/slack-webhooks/assets/images/square.svg @@ -1,31 +1,10 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + From 10cc1adc35992ee480c2b513c060b985543ee459 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Thu, 23 Apr 2020 14:00:38 -0700 Subject: [PATCH 257/936] Added legacy property to slack app --- integrations/slack-app/manifest.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index 7dee4228..2891a260 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -13,5 +13,8 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "webhooks" } } From 046ff0dc8cdc40a2280bafecf01ae1f7d8340b01 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 24 Apr 2020 12:06:09 +0100 Subject: [PATCH 258/936] Imiller/ch69354/audit sentry template and manifest (#85) * change markdown to plaintext in message text * add more explicit instructions on how to find parameters * update placeholder to have the same number of digits as a sentry project id * triple bracket for formatting Co-Authored-By: Henry Barrow * fix wording * add some links to readme * add issue * change 'member name' to 'name' * Revert "change 'member name' to 'name'" - "member name" is how sentry maps the user's name to the user portion of the ui This reverts commit 1c0ba7946094c88451b443702d03d397dcf95e8e. * add launchdarkly_resource_key to tags * change launchdarkly_resource_key tag to launchdarkly_key * change hardcoded production server to baseUrl var * remove issue from readme * change baseUrl to baseURL Co-authored-by: Henry Barrow --- integrations/sentry/README.md | 4 +++- integrations/sentry/manifest.json | 6 +++--- integrations/sentry/templates/template.json.hbs | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/integrations/sentry/README.md b/integrations/sentry/README.md index e5d22588..bcd730ca 100644 --- a/integrations/sentry/README.md +++ b/integrations/sentry/README.md @@ -2,6 +2,8 @@ [User documentation](https://example.com) -[API documentation](https://example.com) +[API documentation](https://docs.sentry.io/api/) + +[API endpoint documentation](https://forum.sentry.io/t/how-can-i-post-with-curl-a-sentry-event-which-authentication-credentials/4759) Run `npm run curl sentry` in the root repository directory to generate a `curl` command to send data to Sentry. diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index 3faf6c2a..a5a1a5a6 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -25,15 +25,15 @@ { "key": "publicKey", "name": "Sentry public key", - "description": "Enter the public key associated with your Sentry account.", + "description": "Enter the public key associated with your Sentry account. This is the hash at the beginning of your [Sentry DSN](https://docs.sentry.io/error-reporting/configuration/).", "placeholder": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk=", "type": "string" }, { "key": "projectId", "name": "Project ID", - "description": "Enter the ID associated with your Sentry project. This ID will associate LaunchDarkly data with the corresponding Sentry project.", - "placeholder": "123", + "description": "Enter the ID associated with the Sentry project you want events sent to. This can be found in the URL of your project or at the end of your [Sentry DSN](https://docs.sentry.io/error-reporting/configuration/).", + "placeholder": "1234567", "type": "string" } ], diff --git a/integrations/sentry/templates/template.json.hbs b/integrations/sentry/templates/template.json.hbs index 098ebeab..7f645860 100644 --- a/integrations/sentry/templates/template.json.hbs +++ b/integrations/sentry/templates/template.json.hbs @@ -5,7 +5,7 @@ "platform": "other", "level": "info", "transaction": "{{ title.plainText }}", - "server_name": "app.launchdarkly.com", + "server_name": "{{ baseURL }}", "fingerprint": [ "{{ _links.site.href }}", "{{ kind }}", @@ -16,11 +16,12 @@ "tags": { "source": "LaunchDarkly", "launchdarkly_kind": "{{ kind }}", - "launchdarkly_name": "{{ name }}" + "launchdarkly_name": "{{ name }}", + "launchdarkly_key": "{{key}}" }, "message": { - "formatted": "{{ title.markdown }}\n{{ details.markdown }}{{#if comment}}\n\n{{ comment }}{{/if}}" + "formatted": "{{{ title.plainText }}}\n{{{ details.plainText }}}{{#if comment}}\n\n{{ comment }}{{/if}}" }, "user": { "id": "launchdarkly/member/{{ member._id }}", From b5b4011e7f475b4758512e77b84487af0283f6ad Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 24 Apr 2020 15:34:58 +0100 Subject: [PATCH 259/936] Add polling schema to manifest only (#86) * Add polling update schema changes and tests * Derefernce schema * Move sample response into parser and address PR feedback * Update schema for forwards compatibility * Remove sample response --- bundleSchemas.js | 7 +- manifest.schema.json | 270 +++++++++++++++++++- schemas/capabilities/externalCondition.json | 98 ++++++- schemas/capabilities/parser/parser.json | 51 +++- 4 files changed, 403 insertions(+), 23 deletions(-) diff --git a/bundleSchemas.js b/bundleSchemas.js index 45183476..bf5fd5de 100644 --- a/bundleSchemas.js +++ b/bundleSchemas.js @@ -5,10 +5,13 @@ const manifestBaseSchema = require('./schemas/base.json'); const bundle = async () => { try { - const manifestSchema = await $RefParser.bundle(manifestBaseSchema); + const bundledManifestSchema = await $RefParser.bundle(manifestBaseSchema); + const dereferencedManifestSchema = await $RefParser.dereference( + bundledManifestSchema + ); fs.writeFileSync( 'manifest.schema.json', - JSON.stringify(manifestSchema, null, 2) + '\n' + JSON.stringify(dereferencedManifestSchema, null, 2) + '\n' ); } catch (e) { console.error(e); diff --git a/manifest.schema.json b/manifest.schema.json index f01bd32d..7679669c 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -620,7 +620,8 @@ "type": "object", "propertyNames": { "enum": [ - "creation" + "creation", + "pollingUpdate" ] }, "required": [ @@ -643,8 +644,7 @@ "required": [ "endpoint", "template", - "parser", - "sampleResponse" + "parser" ], "properties": { "endpoint": { @@ -748,29 +748,277 @@ "title": "Response parser", "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", "type": "object", + "propertyNames": { + "enum": [ + "id", + "url", + "status", + "validation" + ] + }, "properties": { "id": { "$id": "#/properties/id", - "title": "JSON Pointer to external condition ID", + "title": "ID pointer", + "description": "JSON Pointer to external condition ID", "type": "string" }, "url": { "$id": "#/properties/url", - "title": "JSON Pointer to external condition url", + "title": "URL pointer", + "description": "JSON pointer to external condition url", "type": "string" + }, + "status": { + "$id": "#/properties/status", + "title": "Status parser", + "type": "object", + "propertyNames": { + "enum": [ + "pointer", + "completionMatcher" + ] + }, + "required": [ + "pointer", + "completionMatcher" + ], + "properties": { + "pointer": { + "$id": "#/properties/status/pointer", + "title": "Status pointer", + "description": "JSON pointer to condition status", + "type": "string" + }, + "completionMatcher": { + "$id": "#/properties/status/completion-matcher", + "title": "Completion matcher", + "description": "regex pattern used to determine if the response should be considered 'complete'", + "type": "string" + } + } + }, + "validation": { + "$id": "#/properties/validation", + "title": "Validation", + "description": "Validation helpers (only used for testing)", + "type": "object", + "propertyNames": { + "enum": [ + "sampleResponse" + ] + }, + "required": [ + "sampleResponse" + ], + "properties": { + "sampleResponse": { + "$id": "#/properties/validation/sample-response", + "title": "Sample response", + "description": "relative path to sample JSON formatted sample successful response", + "type": "string", + "pattern": ".*\\.json$" + } + } } }, "required": [ "id", "url" ] + } + } + }, + "pollingUpdate": { + "$id": "#/properties/capability/external-condition/polling-update", + "title": "Polling Update", + "description": "Properties that describe a polling request to get the status of the external condition", + "type": "object", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/properties/capability/external-condition/polling-update/endpoint", + "title": "Polling update endpoint", + "description": "Properties that describe the HTTP endpoint LaunchDarkly will use to get the status of an external condition via polling", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "required": [ + "url" + ], + "properties": { + "url": { + "$id": "#/properties/capability/external-condition/polling-update/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/properties/capability/external-condition/polling-update/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "GET", + "POST", + "PUT", + "PATCH" + ], + "default": "GET" + }, + "headers": { + "$id": "#/properties/capability/external-condition/polling-update/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + } }, - "sampleResponse": { - "$id": "#/properties/capability/external-condition/creation/sample-response", - "title": "Sample successful creation response", - "description": "relative path to sample JSON formatted response", - "type": "string", - "pattern": ".*\\.json$" + "parser": { + "$id": "#/parser", + "title": "Response parser", + "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": [ + "id", + "url", + "status", + "validation" + ] + }, + "properties": { + "id": { + "$id": "#/properties/id", + "title": "ID pointer", + "description": "JSON Pointer to external condition ID", + "type": "string" + }, + "url": { + "$id": "#/properties/url", + "title": "URL pointer", + "description": "JSON pointer to external condition url", + "type": "string" + }, + "status": { + "$id": "#/properties/status", + "title": "Status parser", + "type": "object", + "propertyNames": { + "enum": [ + "pointer", + "completionMatcher" + ] + }, + "required": [ + "pointer", + "completionMatcher" + ], + "properties": { + "pointer": { + "$id": "#/properties/status/pointer", + "title": "Status pointer", + "description": "JSON pointer to condition status", + "type": "string" + }, + "completionMatcher": { + "$id": "#/properties/status/completion-matcher", + "title": "Completion matcher", + "description": "regex pattern used to determine if the response should be considered 'complete'", + "type": "string" + } + } + }, + "validation": { + "$id": "#/properties/validation", + "title": "Validation", + "description": "Validation helpers (only used for testing)", + "type": "object", + "propertyNames": { + "enum": [ + "sampleResponse" + ] + }, + "required": [ + "sampleResponse" + ], + "properties": { + "sampleResponse": { + "$id": "#/properties/validation/sample-response", + "title": "Sample response", + "description": "relative path to sample JSON formatted sample successful response", + "type": "string", + "pattern": ".*\\.json$" + } + } + } + }, + "required": [ + "id", + "url" + ] } } } diff --git a/schemas/capabilities/externalCondition.json b/schemas/capabilities/externalCondition.json index 6e61546b..73103e98 100644 --- a/schemas/capabilities/externalCondition.json +++ b/schemas/capabilities/externalCondition.json @@ -6,7 +6,7 @@ "description": "This capability is used to manage external feature workflow conditions", "type": "object", "propertyNames": { - "enum": ["creation"] + "enum": ["creation", "pollingUpdate"] }, "required": ["creation"], "properties": { @@ -18,7 +18,7 @@ "propertyNames": { "enum": ["endpoint", "template", "parser", "sampleResponse"] }, - "required": ["endpoint", "template", "parser", "sampleResponse"], + "required": ["endpoint", "template", "parser"], "properties": { "endpoint": { "$id": "#/properties/capability/external-condition/creation/endpoint", @@ -102,13 +102,95 @@ }, "parser": { "$ref": "parser/parser.json#/parser" + } + } + }, + "pollingUpdate": { + "$id": "#/properties/capability/external-condition/polling-update", + "title": "Polling Update", + "description": "Properties that describe a polling request to get the status of the external condition", + "type": "object", + "propertyNames": { + "enum": ["endpoint", "parser"] + }, + "required": ["endpoint", "parser"], + "properties": { + "endpoint": { + "$id": "#/properties/capability/external-condition/polling-update/endpoint", + "title": "Polling update endpoint", + "description": "Properties that describe the HTTP endpoint LaunchDarkly will use to get the status of an external condition via polling", + "type": "object", + "propertyNames": { + "enum": ["url", "method", "headers"] + }, + "required": ["url"], + "properties": { + "url": { + "$id": "#/properties/capability/external-condition/polling-update/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/properties/capability/external-condition/polling-update/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": ["GET", "POST", "PUT", "PATCH"], + "default": "GET" + }, + "headers": { + "$id": "#/properties/capability/external-condition/polling-update/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": ["name", "value"] + }, + "properties": { + "name": { + "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": ["name", "value"] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + } }, - "sampleResponse": { - "$id": "#/properties/capability/external-condition/creation/sample-response", - "title": "Sample successful creation response", - "description": "relative path to sample JSON formatted response", - "type": "string", - "pattern": ".*\\.json$" + "parser": { + "$ref": "parser/parser.json#/parser" } } } diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index 393ee08a..8b958987 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -5,16 +5,63 @@ "title": "Response parser", "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", "type": "object", + "propertyNames": { + "enum": ["id", "url", "status", "validation"] + }, "properties": { "id": { "$id": "#/properties/id", - "title": "JSON Pointer to external condition ID", + "title": "ID pointer", + "description": "JSON Pointer to external condition ID", "type": "string" }, "url": { "$id": "#/properties/url", - "title": "JSON Pointer to external condition url", + "title": "URL pointer", + "description": "JSON pointer to external condition url", "type": "string" + }, + "status": { + "$id": "#/properties/status", + "title": "Status parser", + "type": "object", + "propertyNames": { + "enum": ["pointer", "completionMatcher"] + }, + "required": ["pointer", "completionMatcher"], + "properties": { + "pointer": { + "$id": "#/properties/status/pointer", + "title": "Status pointer", + "description": "JSON pointer to condition status", + "type": "string" + }, + "completionMatcher": { + "$id": "#/properties/status/completion-matcher", + "title": "Completion matcher", + "description": "regex pattern used to determine if the response should be considered 'complete'", + "type": "string" + } + } + }, + "validation": { + "$id": "#/properties/validation", + "title": "Validation", + "description": "Validation helpers (only used for testing)", + "type": "object", + "propertyNames": { + "enum": ["sampleResponse"] + }, + "required": ["sampleResponse"], + "properties": { + "sampleResponse": { + "$id": "#/properties/validation/sample-response", + "title": "Sample response", + "description": "relative path to sample JSON formatted sample successful response", + "type": "string", + "pattern": ".*\\.json$" + } + } } }, "required": ["id", "url"] From 2fab225622bbe54afd8a64f09d16540b256c612c Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Fri, 24 Apr 2020 13:08:18 -0700 Subject: [PATCH 260/936] Add files via upload --- integrations/sleuth/assets/images/logo_new_logo_symbol.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/sleuth/assets/images/logo_new_logo_symbol.svg b/integrations/sleuth/assets/images/logo_new_logo_symbol.svg index e7da7569..419ccf26 100644 --- a/integrations/sleuth/assets/images/logo_new_logo_symbol.svg +++ b/integrations/sleuth/assets/images/logo_new_logo_symbol.svg @@ -1 +1 @@ -logo_new + \ No newline at end of file From 6ec8478513635b36961583e16de14b32e7418fab Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Fri, 24 Apr 2020 13:12:03 -0700 Subject: [PATCH 261/936] Update logo_new_logo_symbol.svg --- integrations/sleuth/assets/images/logo_new_logo_symbol.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/sleuth/assets/images/logo_new_logo_symbol.svg b/integrations/sleuth/assets/images/logo_new_logo_symbol.svg index 419ccf26..bf29154d 100644 --- a/integrations/sleuth/assets/images/logo_new_logo_symbol.svg +++ b/integrations/sleuth/assets/images/logo_new_logo_symbol.svg @@ -1 +1 @@ - \ No newline at end of file + From 2f8355331ea5179776d55021bf6458b8fb731bd9 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Fri, 24 Apr 2020 14:12:51 -0700 Subject: [PATCH 262/936] Delete logo_new_logo_white.svg Not needed --- integrations/sleuth/assets/images/logo_new_logo_white.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 integrations/sleuth/assets/images/logo_new_logo_white.svg diff --git a/integrations/sleuth/assets/images/logo_new_logo_white.svg b/integrations/sleuth/assets/images/logo_new_logo_white.svg deleted file mode 100644 index bb28d9ce..00000000 --- a/integrations/sleuth/assets/images/logo_new_logo_white.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new From a6f007fd0be1979e77c719c1e486dd5debc30581 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Fri, 24 Apr 2020 14:13:06 -0700 Subject: [PATCH 263/936] Delete logo_new_logo_mixed.svg Not needed --- integrations/sleuth/assets/images/logo_new_logo_mixed.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 integrations/sleuth/assets/images/logo_new_logo_mixed.svg diff --git a/integrations/sleuth/assets/images/logo_new_logo_mixed.svg b/integrations/sleuth/assets/images/logo_new_logo_mixed.svg deleted file mode 100644 index 8cefe789..00000000 --- a/integrations/sleuth/assets/images/logo_new_logo_mixed.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new From 3213fba50d9bc1ba2ee15ff9ac6450c9bf1daec3 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Fri, 24 Apr 2020 14:13:23 -0700 Subject: [PATCH 264/936] Delete logo_new_logo_dark.svg Not needed --- integrations/sleuth/assets/images/logo_new_logo_dark.svg | 1 - 1 file changed, 1 deletion(-) delete mode 100644 integrations/sleuth/assets/images/logo_new_logo_dark.svg diff --git a/integrations/sleuth/assets/images/logo_new_logo_dark.svg b/integrations/sleuth/assets/images/logo_new_logo_dark.svg deleted file mode 100644 index 2f7a6aff..00000000 --- a/integrations/sleuth/assets/images/logo_new_logo_dark.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new From 8e38eb8e5f5a0608e9ab11a1bc14ef6d4b69b336 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Mon, 27 Apr 2020 15:40:49 -0700 Subject: [PATCH 265/936] Add files via upload adding back in the "dark" image needed for horizontal images --- integrations/sleuth/assets/images/logo_new_logo_dark.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 integrations/sleuth/assets/images/logo_new_logo_dark.svg diff --git a/integrations/sleuth/assets/images/logo_new_logo_dark.svg b/integrations/sleuth/assets/images/logo_new_logo_dark.svg new file mode 100644 index 00000000..9a8e303f --- /dev/null +++ b/integrations/sleuth/assets/images/logo_new_logo_dark.svg @@ -0,0 +1 @@ +logo_new \ No newline at end of file From 2c2e18d603663fb5a8dc8710d77427123ef106d3 Mon Sep 17 00:00:00 2001 From: Jared Jones <62678288+almostjones@users.noreply.github.com> Date: Mon, 27 Apr 2020 15:42:22 -0700 Subject: [PATCH 266/936] Update logo_new_logo_dark.svg whitespace fix --- integrations/sleuth/assets/images/logo_new_logo_dark.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/sleuth/assets/images/logo_new_logo_dark.svg b/integrations/sleuth/assets/images/logo_new_logo_dark.svg index 9a8e303f..2f7a6aff 100644 --- a/integrations/sleuth/assets/images/logo_new_logo_dark.svg +++ b/integrations/sleuth/assets/images/logo_new_logo_dark.svg @@ -1 +1 @@ -logo_new \ No newline at end of file +logo_new From 9b5abc32d823abf93901564d7812c2824965c9fb Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 28 Apr 2020 16:54:23 +0100 Subject: [PATCH 267/936] Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning --- integrations/sentry/README.md | 2 +- integrations/sentry/templates/template.json.hbs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/sentry/README.md b/integrations/sentry/README.md index bcd730ca..c2c13721 100644 --- a/integrations/sentry/README.md +++ b/integrations/sentry/README.md @@ -4,6 +4,6 @@ [API documentation](https://docs.sentry.io/api/) -[API endpoint documentation](https://forum.sentry.io/t/how-can-i-post-with-curl-a-sentry-event-which-authentication-credentials/4759) +[API endpoint documentation](https://forum.sentry.io/t/how-can-i-post-with-curl-a-sentry-event-which-authentication-credentials/4759) - It should be noted that the latest version this endpoint functions with is version 7 (header `X-Sentry-Auth: Sentry sentry_version=7`), i.e. it does not seem to have been brought along with more [recent releases](https://github.com/getsentry/sentry/releases). We were also not able to locate documentation of it in the official Sentry docs. This may eventually cause issues if the endpoint is either deprecated or no longer maintained. Run `npm run curl sentry` in the root repository directory to generate a `curl` command to send data to Sentry. diff --git a/integrations/sentry/templates/template.json.hbs b/integrations/sentry/templates/template.json.hbs index 7f645860..6e31fa99 100644 --- a/integrations/sentry/templates/template.json.hbs +++ b/integrations/sentry/templates/template.json.hbs @@ -4,7 +4,7 @@ "logger": "launchdarkly", "platform": "other", "level": "info", - "transaction": "{{ title.plainText }}", + "transaction": "{{{ title.plainText }}}", "server_name": "{{ baseURL }}", "fingerprint": [ "{{ _links.site.href }}", From 3755a0db65b41d697f01b7685d75e71a82fa8ce8 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Wed, 29 Apr 2020 15:39:43 -0700 Subject: [PATCH 268/936] Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document --- integrations/adfs/manifest.json | 3 ++- integrations/appdynamics/manifest.json | 4 ++-- integrations/appoptics/manifest.json | 2 +- integrations/azure-devops/manifest.json | 1 + integrations/azure-sso/manifest.json | 3 ++- integrations/bitbucket-flags/manifest.json | 1 + integrations/bitbucket/manifest.json | 1 + integrations/circleci-coderefs/manifest.json | 3 ++- integrations/datadog/manifest.json | 2 +- integrations/dynatrace/manifest.json | 2 +- integrations/git/manifest.json | 1 + integrations/github/manifest.json | 1 + integrations/gitlab-coderefs/manifest.json | 3 ++- integrations/googleapps-sso/manifest.json | 3 ++- integrations/heap/manifest.json | 1 + integrations/honeycomb/manifest.json | 2 +- integrations/jira/manifest.json | 5 +++-- integrations/logdna/manifest.json | 4 ++-- integrations/msteams/manifest.json | 2 +- integrations/new-relic/manifest.json | 2 +- integrations/okta/manifest.json | 3 ++- integrations/onelogin/manifest.json | 3 ++- integrations/pendo/manifest.json | 1 + integrations/sentry/manifest.json | 2 +- integrations/signalfx/manifest.json | 6 +++--- integrations/splunk/manifest.json | 2 +- integrations/terraform/manifest.json | 1 + integrations/trello/manifest.json | 2 +- integrations/vscode/manifest.json | 3 ++- manifest.schema.json | 10 ++++++++++ schemas/base.json | 10 ++++++++++ 31 files changed, 63 insertions(+), 26 deletions(-) diff --git a/integrations/adfs/manifest.json b/integrations/adfs/manifest.json index 826ff660..c386fc89 100644 --- a/integrations/adfs/manifest.json +++ b/integrations/adfs/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Provision users and manage single sign-on with ADFS (Enterprise only)", "description": "Use your ADFS identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "details": "Active Directory Federation Services (ADFS) is a service provided by Microsoft as a standard role for Windows Server. It provides a web login using existing Active Directory credentials. Provision your LaunchDarkly users and manage single sign-on with ADFS.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/adfs", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], "icons": { diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index a66a6e38..b0767d23 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -1,13 +1,13 @@ { "name": "AppDynamics", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in AppDynamics", + "overview": "Monitor LaunchDarkly flag events in AppDynamics", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to AppDynamics.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], "icons": { diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index e9968c06..3aa92eaf 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -1,7 +1,7 @@ { "name": "AppOptics", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in AppOptics", + "overview": "Monitor LaunchDarkly flag events in AppOptics", "description": "This integration sends LaunchDarkly audit events to AppOptics.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/azure-devops/manifest.json b/integrations/azure-devops/manifest.json index 359960bc..c49f51cd 100644 --- a/integrations/azure-devops/manifest.json +++ b/integrations/azure-devops/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Roll out features using Azure DevOps releases", "description": "The Azure DevOps integration lets you perform controlled rollouts to manage feature releases. With our integration, you can define a percentage rollout for your feature flags as part of a release task.", + "details": "Plan smarter, collaborate better, and ship faster with a set of modern dev services. Use all the DevOps services or choose just what you need to complement your existing workflows. Azure Pipelines lets you continuously build, test, and deploy to any platform and cloud. Perform controlled rollout to manage feature releases with LaunchDarkly.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/azure-sso/manifest.json b/integrations/azure-sso/manifest.json index d274984e..ccdf7947 100644 --- a/integrations/azure-sso/manifest.json +++ b/integrations/azure-sso/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Provision users and manage single sign-on with Azure AD (Enterprise only)", "description": "Use your Azure identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "details": "Azure Active Directory (Azure AD) is Microsoft’s cloud-based identity and access management service. Provision LaunchDarkly users and manage single sign-on with Azure AD.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/azure", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], "icons": { diff --git a/integrations/bitbucket-flags/manifest.json b/integrations/bitbucket-flags/manifest.json index 13ff8cc3..5991f44a 100644 --- a/integrations/bitbucket-flags/manifest.json +++ b/integrations/bitbucket-flags/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Create and enable feature flags using Bitbucket Pipelines", "description": "The LaunchDarkly integration lets you insert feature flag actions directly into your Pipeline's continuous delivery flow. Bitbucket Pipelines is a continuous delivery platform that lets your team build, test, and deploy from Bitbucket. It exists within Bitbucket, giving you end-to-end visibility from coding to deployment.", + "details": "Bitbucket is Git code management that gives teams one place to plan projects, collaborate on code, test, and deploy. Create and enable feature flags using Bitbucket Pipelines.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json index 9c2e7a38..45170e9c 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", "description": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", + "details": "Bitbucket is Git code management that gives teams one place to plan projects, collaborate on code, test, and deploy. Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json index b7f1e0bc..3d2c249c 100644 --- a/integrations/circleci-coderefs/manifest.json +++ b/integrations/circleci-coderefs/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Use our open-source utility to track flag references in your code, using CircleCI.", "description": "You can use this utility with CircleCI to automatically populate code references in LaunchDarkly.", + "details": "CircleCI is a leading CI/CD platform that lets you automate your development process quickly, safely, and at scale. Use our open-source utility to automatically send feature flag code references to LaunchDarkly.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/circleci-orbs", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["configuration", "version-control"], "icons": { diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index a4983cd4..0a401646 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -2,7 +2,7 @@ "name": "Datadog V2", "version": "1.0.0", "overview": "Monitor LaunchDarkly changes in Datadog", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Datadog.", + "description": "Monitor LaunchDarkly flag and other change events in DataDog. Correlate feature rollouts to changes in your system’s operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index f336eeba..92da1f97 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -2,7 +2,7 @@ "name": "Dynatrace", "version": "1.0.0", "overview": "Monitor LaunchDarkly flag changes in Dynatrace", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Dynatrace.", + "description": "Monitor LaunchDarkly flag change events alongside your Dynatrace performance graphs. Correlate feature rollouts to changes in your system’s operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json index f74bbf87..34f290bb 100644 --- a/integrations/git/manifest.json +++ b/integrations/git/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, running in your CI build.", "description": "Use our open-source utility to track references to flags in your code, running in your CI build.", + "details": "Git is the most widely used modern version control system in the world. It is a mature, actively maintained open-source project relied on by many leading software projects around the world. Use our open-source utility to track references to flags in your code, running in your CI build.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index afaf92a3..07244e6a 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", "description": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", + "details": "GitHub is a development platform inspired by the way you work. From open-source to business, you can host and review code, manage projects, and build software alongside 40 million developers. Use our open-source utility to track references to flags in your code, using GitHub Actions.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab-coderefs/manifest.json index 2ae3e502..0a7e0239 100644 --- a/integrations/gitlab-coderefs/manifest.json +++ b/integrations/gitlab-coderefs/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Use our open-source utility to track flag references in your code, using GitLab CI.", "description": "You can use this utility with GitLab CI to automatically populate code references in LaunchDarkly.", + "details": "GitLab CI/CD pipelines help you build, test, deploy, and monitor your code as part of a single, integrated workflow. Use our open-source utility to automatically send feature flag code references to LaunchDarkly.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/gitlab-ci", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["configuration", "version-control"], "icons": { diff --git a/integrations/googleapps-sso/manifest.json b/integrations/googleapps-sso/manifest.json index bef095ac..9d2e014e 100644 --- a/integrations/googleapps-sso/manifest.json +++ b/integrations/googleapps-sso/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Provision users and manage single sign-on with Google (Enterprise only)", "description": "Use your Google Apps identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "details": "Single sign-on (SSO) lets users sign in to all their enterprise cloud applications using their managed Google account credentials. Provision LaunchDarkly users and manage single sign-on with Google.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/google-apps", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], "icons": { diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index def003a3..466b95e8 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Add LaunchDarkly user IDs and feature flag events to Heap as user and event properties", "description": "To set this up, attach LaunchDarkly's user key and feature flags as user and event properties in Heap.", + "details": "Heap offers a smarter way to build digital products. With comprehensive data collection and structured processes, Heap helps Product Managers understand their users, make data-driven decisions, and craft delightful digital experiences. Add LaunchDarkly user IDs and feature flag events to Heap to better understand users and their experiences.", "author": "Heap", "supportEmail": "support@heap.io", "links": { diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 3626f880..2993019c 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -1,7 +1,7 @@ { "name": "Honeycomb", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in Honeycomb", + "overview": "Monitor LaunchDarkly flag events in Honeycomb.", "description": "This integration sends LaunchDarkly audit events to Honeycomb.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 492a8a8f..0d69fb35 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -2,12 +2,13 @@ "name": "Jira Cloud", "version": "1.0.0", "overview": "Link your feature flags with your team's Jira issues", - "description": "When a feature flag is turned on, off, or has its targeting rules update, its associated Jira issue pages display the flag's current status.", + "description": "Integrate LaunchDarkly with Jira to see your feature flags alongside your team's Jira issues.", + "details": "Jira is the #1 software development tool used by agile teams to plan, track, and release great software. Built for all team members, Jira enables collaboration by providing everyone with visibility into important information for planning and coordinating projects, tracking progress, and reporting results in real-time. Integrate LaunchDarkly with Jira to see your feature flags alongside your team's Jira issues.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/jira", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["task-management"], "icons": { diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 43258086..d1fe2af2 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -1,13 +1,13 @@ { "name": "LogDNA", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in LogDNA", + "overview": "Monitor LaunchDarkly flag events in LogDNA", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to LogDNA.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], "icons": { diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 9a3cab5d..2b12a090 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -2,7 +2,7 @@ "name": "Microsoft Teams", "version": "1.0.0", "overview": "Receive flag change notifications in your Teams workspaces", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Microsoft Teams.", + "description": "Receive LaunchDarkly notifications in your Teams workspaces. Subscribe to changes in flags, projects, and other resources.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index 5ee9e482..8917f2ec 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -1,7 +1,7 @@ { "name": "New Relic", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in New Relic", + "overview": "Monitor LaunchDarkly flag events in New Relic", "description": "This integration sends LaunchDarkly audit events to New Relic. Please note that it requires a paid Insights subscription to function.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/okta/manifest.json b/integrations/okta/manifest.json index 94e3553f..a2205d26 100644 --- a/integrations/okta/manifest.json +++ b/integrations/okta/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Provision users and manage single sign-on with Okta (Enterprise only)", "description": "Use your Okta identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "details": "Okta Single Sign-on is part of a complete identity and access management solution for organizations adopting and building for cloud and mobile who need to contain costs, fulfill user productivity targets, and avoid security risks. Provision LaunchDarkly users and manage single sign-on with Okta.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/okta", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], "icons": { diff --git a/integrations/onelogin/manifest.json b/integrations/onelogin/manifest.json index 194fa964..a1b7867e 100644 --- a/integrations/onelogin/manifest.json +++ b/integrations/onelogin/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Provision users and manage single sign-on with OneLogin (Enterprise only)", "description": "Use your OneLogin identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "details": "OneLogin’s SSO solution provides one click access to all of your apps, in the cloud and behind the firewall. Use OneLogin to manage your LaunchDarkly users.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/onelogin", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], "icons": { diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index 64ab5573..6d7055e7 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Target your Pendo audiences with LaunchDarkly rules", "description": "Product teams often want to roll out new features iteratively, measuring adoption and collecting feedback from a subset of users before making the feature generally available. Pendo and LaunchDarkly have partnered to help our joint customers use Pendo to better target and engage users during this process. Pendo data such as product adoption, renewal data, and ARR can help target the rollout of features through LaunchDarkly.", + "details": "Pendo helps product teams understand product usage, collect feedback, measure sentiment, onboard users, and announce new features in app—all without requiring engineering resources. Access Pendo audiences with LaunchDarkly targeting rules to deliver your new features to the right users.", "author": "Pendo", "supportEmail": "support@pendo.com", "links": { diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index a5a1a5a6..33b04318 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -1,7 +1,7 @@ { "name": "Sentry", "version": "0.0.1", - "overview": "Monitor LaunchDarkly flag changes in Sentry", + "overview": "Monitor LaunchDarkly flag events in Sentry", "description": "Send flag, environment, and project updates to Sentry.io", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index cbb58946..1b71bd7d 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -2,12 +2,12 @@ "name": "SignalFx", "version": "1.0.0", "overview": "Monitor LaunchDarkly flag changes in SignalFx", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to SignalFx.", + "description": "Monitor LaunchDarkly flag and other change events with clear data markers in SignalFx to correlate feature flag rollouts with changes in operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" + "site": "https://docs.launchdarkly.com/integrations/signalfx", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], "icons": { diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 2b3c9889..0fe094b6 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -2,7 +2,7 @@ "name": "Splunk", "version": "1.0.0", "overview": "Monitor LaunchDarkly flag changes in Splunk", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Splunk.", + "description": "Monitor LaunchDarkly flag and other change events in Splunk and include these events in your reports, charts, alerts and dashboards.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index 48ec9e92..0cba9edb 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Manage your LaunchDarkly resources as Terraform resources", "description": "Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more.", + "details": "Terraform is a tool for building, changing, and versioning infrastructure safely and efficiently. Terraform can manage existing and popular service providers as well as custom in-house solutions. Use Terraform to script and control your feature flag configurations.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index e20f8f56..5fc8b6d9 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://trello.com/power-ups/5d795c43ef5f7d1dc307da46/launchdarkly", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["task-management"], "icons": { diff --git a/integrations/vscode/manifest.json b/integrations/vscode/manifest.json index a0c6e4e4..eda60d38 100644 --- a/integrations/vscode/manifest.json +++ b/integrations/vscode/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Interact with feature flags from within VSCode", "description": "With this extension, you'll be able to view feature flag details when you hover over a feature flag key in your source code, autocomplete feature flag keys, and more -- all within VSCode!", + "details": "Visual Studio Code (VSCode) is a lightweight, powerful source code editor with built-in support for JavaScript, TypeScript and Node.js and has a rich ecosystem of extensions for other languages and runtimes. Interact with feature flags from within Visual Studio Code.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/visual-studio-code", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["developer-tools"], "icons": { diff --git a/manifest.schema.json b/manifest.schema.json index 7679669c..71e9ccb6 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -10,6 +10,7 @@ "version", "overview", "description", + "details", "author", "supportEmail", "links", @@ -61,6 +62,15 @@ "maxLength": 2048, "pattern": "^(.*)$" }, + "details": { + "#id": "#/properties/details", + "title": "Learn more details", + "description": "Details about your integration and next steps if the installation happens outside of LaunchDarkly", + "type": "string", + "minLength": 50, + "maxLength": 2048, + "pattern": "^(.*)$" + }, "author": { "$id": "#/properties/author", "title": "Author", diff --git a/schemas/base.json b/schemas/base.json index 38759f6e..37e163a4 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -10,6 +10,7 @@ "version", "overview", "description", + "details", "author", "supportEmail", "links", @@ -57,6 +58,15 @@ "maxLength": 2048, "pattern": "^(.*)$" }, + "details": { + "#id": "#/properties/details", + "title": "Learn more details", + "description": "Details about your integration and next steps if the installation happens outside of LaunchDarkly", + "type": "string", + "minLength": 50, + "maxLength": 2048, + "pattern": "^(.*)$" + }, "author": { "$id": "#/properties/author", "title": "Author", From b7d8b1d9f819df8eb68be98096b21f4d5d5ff630 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 6 May 2020 10:00:20 -0700 Subject: [PATCH 269/936] Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru --- integrations/adfs/manifest.json | 3 ++- integrations/appdynamics/manifest.json | 4 ++-- integrations/appoptics/manifest.json | 2 +- integrations/azure-devops/manifest.json | 1 + integrations/azure-sso/manifest.json | 3 ++- integrations/bitbucket-flags/manifest.json | 1 + integrations/bitbucket/manifest.json | 1 + integrations/circleci-coderefs/manifest.json | 3 ++- integrations/datadog/manifest.json | 2 +- integrations/dynatrace/manifest.json | 2 +- integrations/git/manifest.json | 1 + integrations/github/manifest.json | 1 + integrations/gitlab-coderefs/manifest.json | 3 ++- integrations/googleapps-sso/manifest.json | 3 ++- integrations/heap/manifest.json | 1 + integrations/honeycomb/manifest.json | 2 +- integrations/jira/manifest.json | 5 +++-- integrations/logdna/manifest.json | 4 ++-- integrations/msteams/manifest.json | 2 +- integrations/new-relic/manifest.json | 2 +- integrations/okta/manifest.json | 3 ++- integrations/onelogin/manifest.json | 3 ++- integrations/pendo/manifest.json | 1 + integrations/sentry/README.md | 2 +- integrations/sentry/manifest.json | 2 +- integrations/sentry/templates/template.json.hbs | 2 +- integrations/signalfx/manifest.json | 6 +++--- .../sleuth/assets/images/logo_new_logo_mixed.svg | 1 - .../sleuth/assets/images/logo_new_logo_symbol.svg | 2 +- .../sleuth/assets/images/logo_new_logo_white.svg | 1 - integrations/splunk/manifest.json | 2 +- integrations/terraform/manifest.json | 1 + integrations/trello/manifest.json | 2 +- integrations/vscode/manifest.json | 3 ++- manifest.schema.json | 10 ++++++++++ schemas/base.json | 10 ++++++++++ 36 files changed, 66 insertions(+), 31 deletions(-) delete mode 100644 integrations/sleuth/assets/images/logo_new_logo_mixed.svg delete mode 100644 integrations/sleuth/assets/images/logo_new_logo_white.svg diff --git a/integrations/adfs/manifest.json b/integrations/adfs/manifest.json index 826ff660..c386fc89 100644 --- a/integrations/adfs/manifest.json +++ b/integrations/adfs/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Provision users and manage single sign-on with ADFS (Enterprise only)", "description": "Use your ADFS identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "details": "Active Directory Federation Services (ADFS) is a service provided by Microsoft as a standard role for Windows Server. It provides a web login using existing Active Directory credentials. Provision your LaunchDarkly users and manage single sign-on with ADFS.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/adfs", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], "icons": { diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index a66a6e38..b0767d23 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -1,13 +1,13 @@ { "name": "AppDynamics", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in AppDynamics", + "overview": "Monitor LaunchDarkly flag events in AppDynamics", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to AppDynamics.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], "icons": { diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index e9968c06..3aa92eaf 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -1,7 +1,7 @@ { "name": "AppOptics", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in AppOptics", + "overview": "Monitor LaunchDarkly flag events in AppOptics", "description": "This integration sends LaunchDarkly audit events to AppOptics.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/azure-devops/manifest.json b/integrations/azure-devops/manifest.json index 359960bc..c49f51cd 100644 --- a/integrations/azure-devops/manifest.json +++ b/integrations/azure-devops/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Roll out features using Azure DevOps releases", "description": "The Azure DevOps integration lets you perform controlled rollouts to manage feature releases. With our integration, you can define a percentage rollout for your feature flags as part of a release task.", + "details": "Plan smarter, collaborate better, and ship faster with a set of modern dev services. Use all the DevOps services or choose just what you need to complement your existing workflows. Azure Pipelines lets you continuously build, test, and deploy to any platform and cloud. Perform controlled rollout to manage feature releases with LaunchDarkly.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/azure-sso/manifest.json b/integrations/azure-sso/manifest.json index d274984e..ccdf7947 100644 --- a/integrations/azure-sso/manifest.json +++ b/integrations/azure-sso/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Provision users and manage single sign-on with Azure AD (Enterprise only)", "description": "Use your Azure identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "details": "Azure Active Directory (Azure AD) is Microsoft’s cloud-based identity and access management service. Provision LaunchDarkly users and manage single sign-on with Azure AD.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/azure", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], "icons": { diff --git a/integrations/bitbucket-flags/manifest.json b/integrations/bitbucket-flags/manifest.json index 13ff8cc3..5991f44a 100644 --- a/integrations/bitbucket-flags/manifest.json +++ b/integrations/bitbucket-flags/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Create and enable feature flags using Bitbucket Pipelines", "description": "The LaunchDarkly integration lets you insert feature flag actions directly into your Pipeline's continuous delivery flow. Bitbucket Pipelines is a continuous delivery platform that lets your team build, test, and deploy from Bitbucket. It exists within Bitbucket, giving you end-to-end visibility from coding to deployment.", + "details": "Bitbucket is Git code management that gives teams one place to plan projects, collaborate on code, test, and deploy. Create and enable feature flags using Bitbucket Pipelines.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json index 9c2e7a38..45170e9c 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", "description": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", + "details": "Bitbucket is Git code management that gives teams one place to plan projects, collaborate on code, test, and deploy. Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json index b7f1e0bc..3d2c249c 100644 --- a/integrations/circleci-coderefs/manifest.json +++ b/integrations/circleci-coderefs/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Use our open-source utility to track flag references in your code, using CircleCI.", "description": "You can use this utility with CircleCI to automatically populate code references in LaunchDarkly.", + "details": "CircleCI is a leading CI/CD platform that lets you automate your development process quickly, safely, and at scale. Use our open-source utility to automatically send feature flag code references to LaunchDarkly.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/circleci-orbs", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["configuration", "version-control"], "icons": { diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index a4983cd4..0a401646 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -2,7 +2,7 @@ "name": "Datadog V2", "version": "1.0.0", "overview": "Monitor LaunchDarkly changes in Datadog", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Datadog.", + "description": "Monitor LaunchDarkly flag and other change events in DataDog. Correlate feature rollouts to changes in your system’s operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index f336eeba..92da1f97 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -2,7 +2,7 @@ "name": "Dynatrace", "version": "1.0.0", "overview": "Monitor LaunchDarkly flag changes in Dynatrace", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Dynatrace.", + "description": "Monitor LaunchDarkly flag change events alongside your Dynatrace performance graphs. Correlate feature rollouts to changes in your system’s operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json index f74bbf87..34f290bb 100644 --- a/integrations/git/manifest.json +++ b/integrations/git/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, running in your CI build.", "description": "Use our open-source utility to track references to flags in your code, running in your CI build.", + "details": "Git is the most widely used modern version control system in the world. It is a mature, actively maintained open-source project relied on by many leading software projects around the world. Use our open-source utility to track references to flags in your code, running in your CI build.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index afaf92a3..07244e6a 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", "description": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", + "details": "GitHub is a development platform inspired by the way you work. From open-source to business, you can host and review code, manage projects, and build software alongside 40 million developers. Use our open-source utility to track references to flags in your code, using GitHub Actions.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab-coderefs/manifest.json index 2ae3e502..0a7e0239 100644 --- a/integrations/gitlab-coderefs/manifest.json +++ b/integrations/gitlab-coderefs/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Use our open-source utility to track flag references in your code, using GitLab CI.", "description": "You can use this utility with GitLab CI to automatically populate code references in LaunchDarkly.", + "details": "GitLab CI/CD pipelines help you build, test, deploy, and monitor your code as part of a single, integrated workflow. Use our open-source utility to automatically send feature flag code references to LaunchDarkly.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/gitlab-ci", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["configuration", "version-control"], "icons": { diff --git a/integrations/googleapps-sso/manifest.json b/integrations/googleapps-sso/manifest.json index bef095ac..9d2e014e 100644 --- a/integrations/googleapps-sso/manifest.json +++ b/integrations/googleapps-sso/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Provision users and manage single sign-on with Google (Enterprise only)", "description": "Use your Google Apps identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "details": "Single sign-on (SSO) lets users sign in to all their enterprise cloud applications using their managed Google account credentials. Provision LaunchDarkly users and manage single sign-on with Google.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/google-apps", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], "icons": { diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index def003a3..466b95e8 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Add LaunchDarkly user IDs and feature flag events to Heap as user and event properties", "description": "To set this up, attach LaunchDarkly's user key and feature flags as user and event properties in Heap.", + "details": "Heap offers a smarter way to build digital products. With comprehensive data collection and structured processes, Heap helps Product Managers understand their users, make data-driven decisions, and craft delightful digital experiences. Add LaunchDarkly user IDs and feature flag events to Heap to better understand users and their experiences.", "author": "Heap", "supportEmail": "support@heap.io", "links": { diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 3626f880..2993019c 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -1,7 +1,7 @@ { "name": "Honeycomb", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in Honeycomb", + "overview": "Monitor LaunchDarkly flag events in Honeycomb.", "description": "This integration sends LaunchDarkly audit events to Honeycomb.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 492a8a8f..0d69fb35 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -2,12 +2,13 @@ "name": "Jira Cloud", "version": "1.0.0", "overview": "Link your feature flags with your team's Jira issues", - "description": "When a feature flag is turned on, off, or has its targeting rules update, its associated Jira issue pages display the flag's current status.", + "description": "Integrate LaunchDarkly with Jira to see your feature flags alongside your team's Jira issues.", + "details": "Jira is the #1 software development tool used by agile teams to plan, track, and release great software. Built for all team members, Jira enables collaboration by providing everyone with visibility into important information for planning and coordinating projects, tracking progress, and reporting results in real-time. Integrate LaunchDarkly with Jira to see your feature flags alongside your team's Jira issues.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/jira", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["task-management"], "icons": { diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 43258086..d1fe2af2 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -1,13 +1,13 @@ { "name": "LogDNA", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in LogDNA", + "overview": "Monitor LaunchDarkly flag events in LogDNA", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to LogDNA.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], "icons": { diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 9a3cab5d..2b12a090 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -2,7 +2,7 @@ "name": "Microsoft Teams", "version": "1.0.0", "overview": "Receive flag change notifications in your Teams workspaces", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Microsoft Teams.", + "description": "Receive LaunchDarkly notifications in your Teams workspaces. Subscribe to changes in flags, projects, and other resources.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index 5ee9e482..8917f2ec 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -1,7 +1,7 @@ { "name": "New Relic", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in New Relic", + "overview": "Monitor LaunchDarkly flag events in New Relic", "description": "This integration sends LaunchDarkly audit events to New Relic. Please note that it requires a paid Insights subscription to function.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/okta/manifest.json b/integrations/okta/manifest.json index 94e3553f..a2205d26 100644 --- a/integrations/okta/manifest.json +++ b/integrations/okta/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Provision users and manage single sign-on with Okta (Enterprise only)", "description": "Use your Okta identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "details": "Okta Single Sign-on is part of a complete identity and access management solution for organizations adopting and building for cloud and mobile who need to contain costs, fulfill user productivity targets, and avoid security risks. Provision LaunchDarkly users and manage single sign-on with Okta.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/okta", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], "icons": { diff --git a/integrations/onelogin/manifest.json b/integrations/onelogin/manifest.json index 194fa964..a1b7867e 100644 --- a/integrations/onelogin/manifest.json +++ b/integrations/onelogin/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Provision users and manage single sign-on with OneLogin (Enterprise only)", "description": "Use your OneLogin identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", + "details": "OneLogin’s SSO solution provides one click access to all of your apps, in the cloud and behind the firewall. Use OneLogin to manage your LaunchDarkly users.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/onelogin", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], "icons": { diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index 64ab5573..6d7055e7 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Target your Pendo audiences with LaunchDarkly rules", "description": "Product teams often want to roll out new features iteratively, measuring adoption and collecting feedback from a subset of users before making the feature generally available. Pendo and LaunchDarkly have partnered to help our joint customers use Pendo to better target and engage users during this process. Pendo data such as product adoption, renewal data, and ARR can help target the rollout of features through LaunchDarkly.", + "details": "Pendo helps product teams understand product usage, collect feedback, measure sentiment, onboard users, and announce new features in app—all without requiring engineering resources. Access Pendo audiences with LaunchDarkly targeting rules to deliver your new features to the right users.", "author": "Pendo", "supportEmail": "support@pendo.com", "links": { diff --git a/integrations/sentry/README.md b/integrations/sentry/README.md index bcd730ca..c2c13721 100644 --- a/integrations/sentry/README.md +++ b/integrations/sentry/README.md @@ -4,6 +4,6 @@ [API documentation](https://docs.sentry.io/api/) -[API endpoint documentation](https://forum.sentry.io/t/how-can-i-post-with-curl-a-sentry-event-which-authentication-credentials/4759) +[API endpoint documentation](https://forum.sentry.io/t/how-can-i-post-with-curl-a-sentry-event-which-authentication-credentials/4759) - It should be noted that the latest version this endpoint functions with is version 7 (header `X-Sentry-Auth: Sentry sentry_version=7`), i.e. it does not seem to have been brought along with more [recent releases](https://github.com/getsentry/sentry/releases). We were also not able to locate documentation of it in the official Sentry docs. This may eventually cause issues if the endpoint is either deprecated or no longer maintained. Run `npm run curl sentry` in the root repository directory to generate a `curl` command to send data to Sentry. diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index a5a1a5a6..33b04318 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -1,7 +1,7 @@ { "name": "Sentry", "version": "0.0.1", - "overview": "Monitor LaunchDarkly flag changes in Sentry", + "overview": "Monitor LaunchDarkly flag events in Sentry", "description": "Send flag, environment, and project updates to Sentry.io", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/sentry/templates/template.json.hbs b/integrations/sentry/templates/template.json.hbs index 7f645860..6e31fa99 100644 --- a/integrations/sentry/templates/template.json.hbs +++ b/integrations/sentry/templates/template.json.hbs @@ -4,7 +4,7 @@ "logger": "launchdarkly", "platform": "other", "level": "info", - "transaction": "{{ title.plainText }}", + "transaction": "{{{ title.plainText }}}", "server_name": "{{ baseURL }}", "fingerprint": [ "{{ _links.site.href }}", diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index cbb58946..1b71bd7d 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -2,12 +2,12 @@ "name": "SignalFx", "version": "1.0.0", "overview": "Monitor LaunchDarkly flag changes in SignalFx", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to SignalFx.", + "description": "Monitor LaunchDarkly flag and other change events with clear data markers in SignalFx to correlate feature flag rollouts with changes in operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" + "site": "https://docs.launchdarkly.com/integrations/signalfx", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], "icons": { diff --git a/integrations/sleuth/assets/images/logo_new_logo_mixed.svg b/integrations/sleuth/assets/images/logo_new_logo_mixed.svg deleted file mode 100644 index 8cefe789..00000000 --- a/integrations/sleuth/assets/images/logo_new_logo_mixed.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new diff --git a/integrations/sleuth/assets/images/logo_new_logo_symbol.svg b/integrations/sleuth/assets/images/logo_new_logo_symbol.svg index e7da7569..bf29154d 100644 --- a/integrations/sleuth/assets/images/logo_new_logo_symbol.svg +++ b/integrations/sleuth/assets/images/logo_new_logo_symbol.svg @@ -1 +1 @@ -logo_new + diff --git a/integrations/sleuth/assets/images/logo_new_logo_white.svg b/integrations/sleuth/assets/images/logo_new_logo_white.svg deleted file mode 100644 index bb28d9ce..00000000 --- a/integrations/sleuth/assets/images/logo_new_logo_white.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 2b3c9889..0fe094b6 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -2,7 +2,7 @@ "name": "Splunk", "version": "1.0.0", "overview": "Monitor LaunchDarkly flag changes in Splunk", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Splunk.", + "description": "Monitor LaunchDarkly flag and other change events in Splunk and include these events in your reports, charts, alerts and dashboards.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index 48ec9e92..0cba9edb 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -3,6 +3,7 @@ "version": "1.0.0", "overview": "Manage your LaunchDarkly resources as Terraform resources", "description": "Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more.", + "details": "Terraform is a tool for building, changing, and versioning infrastructure safely and efficiently. Terraform can manage existing and popular service providers as well as custom in-house solutions. Use Terraform to script and control your feature flag configurations.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index e20f8f56..5fc8b6d9 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://trello.com/power-ups/5d795c43ef5f7d1dc307da46/launchdarkly", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["task-management"], "icons": { diff --git a/integrations/vscode/manifest.json b/integrations/vscode/manifest.json index a0c6e4e4..eda60d38 100644 --- a/integrations/vscode/manifest.json +++ b/integrations/vscode/manifest.json @@ -3,11 +3,12 @@ "version": "1.0.0", "overview": "Interact with feature flags from within VSCode", "description": "With this extension, you'll be able to view feature flag details when you hover over a feature flag key in your source code, autocomplete feature flag keys, and more -- all within VSCode!", + "details": "Visual Studio Code (VSCode) is a lightweight, powerful source code editor with built-in support for JavaScript, TypeScript and Node.js and has a rich ecosystem of extensions for other languages and runtimes. Interact with feature flags from within Visual Studio Code.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/visual-studio-code", - "privacyPolicy": "https://example.com/privacy" + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["developer-tools"], "icons": { diff --git a/manifest.schema.json b/manifest.schema.json index 7679669c..71e9ccb6 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -10,6 +10,7 @@ "version", "overview", "description", + "details", "author", "supportEmail", "links", @@ -61,6 +62,15 @@ "maxLength": 2048, "pattern": "^(.*)$" }, + "details": { + "#id": "#/properties/details", + "title": "Learn more details", + "description": "Details about your integration and next steps if the installation happens outside of LaunchDarkly", + "type": "string", + "minLength": 50, + "maxLength": 2048, + "pattern": "^(.*)$" + }, "author": { "$id": "#/properties/author", "title": "Author", diff --git a/schemas/base.json b/schemas/base.json index 38759f6e..37e163a4 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -10,6 +10,7 @@ "version", "overview", "description", + "details", "author", "supportEmail", "links", @@ -57,6 +58,15 @@ "maxLength": 2048, "pattern": "^(.*)$" }, + "details": { + "#id": "#/properties/details", + "title": "Learn more details", + "description": "Details about your integration and next steps if the installation happens outside of LaunchDarkly", + "type": "string", + "minLength": 50, + "maxLength": 2048, + "pattern": "^(.*)$" + }, "author": { "$id": "#/properties/author", "title": "Author", From a7c6acd86881c627e76fa461bac90870abbf66d5 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 7 May 2020 15:38:11 -0700 Subject: [PATCH 270/936] deleting sentry (#95) --- integrations/sentry/README.md | 9 --- .../sentry/assets/images/sentry-banner.svg | 3 - integrations/sentry/assets/images/sentry.svg | 3 - integrations/sentry/manifest.json | 68 ------------------- .../sentry/templates/template.json.hbs | 31 --------- 5 files changed, 114 deletions(-) delete mode 100644 integrations/sentry/README.md delete mode 100644 integrations/sentry/assets/images/sentry-banner.svg delete mode 100644 integrations/sentry/assets/images/sentry.svg delete mode 100644 integrations/sentry/manifest.json delete mode 100644 integrations/sentry/templates/template.json.hbs diff --git a/integrations/sentry/README.md b/integrations/sentry/README.md deleted file mode 100644 index c2c13721..00000000 --- a/integrations/sentry/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Sentry - -[User documentation](https://example.com) - -[API documentation](https://docs.sentry.io/api/) - -[API endpoint documentation](https://forum.sentry.io/t/how-can-i-post-with-curl-a-sentry-event-which-authentication-credentials/4759) - It should be noted that the latest version this endpoint functions with is version 7 (header `X-Sentry-Auth: Sentry sentry_version=7`), i.e. it does not seem to have been brought along with more [recent releases](https://github.com/getsentry/sentry/releases). We were also not able to locate documentation of it in the official Sentry docs. This may eventually cause issues if the endpoint is either deprecated or no longer maintained. - -Run `npm run curl sentry` in the root repository directory to generate a `curl` command to send data to Sentry. diff --git a/integrations/sentry/assets/images/sentry-banner.svg b/integrations/sentry/assets/images/sentry-banner.svg deleted file mode 100644 index 984a84eb..00000000 --- a/integrations/sentry/assets/images/sentry-banner.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/integrations/sentry/assets/images/sentry.svg b/integrations/sentry/assets/images/sentry.svg deleted file mode 100644 index d3f083f1..00000000 --- a/integrations/sentry/assets/images/sentry.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json deleted file mode 100644 index 33b04318..00000000 --- a/integrations/sentry/manifest.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "Sentry", - "version": "0.0.1", - "overview": "Monitor LaunchDarkly flag events in Sentry", - "description": "Send flag, environment, and project updates to Sentry.io", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://sentry.io", - "privacyPolicy": "https://sentry.io/privacy/" - }, - "categories": ["monitoring", "notifications"], - "icons": { - "square": "assets/images/sentry.svg", - "horizontal": "assets/images/sentry-banner.svg" - }, - "formVariables": [ - { - "key": "host", - "name": "Sentry API host", - "description": "Enter the host used to access your Sentry account.", - "placeholder": "https://sentry.io", - "type": "string" - }, - { - "key": "publicKey", - "name": "Sentry public key", - "description": "Enter the public key associated with your Sentry account. This is the hash at the beginning of your [Sentry DSN](https://docs.sentry.io/error-reporting/configuration/).", - "placeholder": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk=", - "type": "string" - }, - { - "key": "projectId", - "name": "Project ID", - "description": "Enter the ID associated with the Sentry project you want events sent to. This can be found in the URL of your project or at the end of your [Sentry DSN](https://docs.sentry.io/error-reporting/configuration/).", - "placeholder": "1234567", - "type": "string" - } - ], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "{{host}}/api/{{projectId}}/store/", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "X-Sentry-Auth", - "value": "Sentry sentry_version=7, sentry_key={{ publicKey }}" - } - ] - }, - "templates": { - "default": "templates/template.json.hbs" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } -} diff --git a/integrations/sentry/templates/template.json.hbs b/integrations/sentry/templates/template.json.hbs deleted file mode 100644 index 6e31fa99..00000000 --- a/integrations/sentry/templates/template.json.hbs +++ /dev/null @@ -1,31 +0,0 @@ -{ - "event_id": "{{ _id }}00000000", - "culprit": "{{ _links.site.href }}", - "logger": "launchdarkly", - "platform": "other", - "level": "info", - "transaction": "{{{ title.plainText }}}", - "server_name": "{{ baseURL }}", - "fingerprint": [ - "{{ _links.site.href }}", - "{{ kind }}", - "{{ name }}", - "{{ title.plainText }}" - ], - - "tags": { - "source": "LaunchDarkly", - "launchdarkly_kind": "{{ kind }}", - "launchdarkly_name": "{{ name }}", - "launchdarkly_key": "{{key}}" - }, - - "message": { - "formatted": "{{{ title.plainText }}}\n{{{ details.plainText }}}{{#if comment}}\n\n{{ comment }}{{/if}}" - }, - "user": { - "id": "launchdarkly/member/{{ member._id }}", - "email": "{{ member.email }}", - "Member Name": "{{ member.firstName }} {{ member.lastName }}" - } -} From 9fe36b7a0d6daa064c92d1b576d9f1956a46ac85 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Mon, 11 May 2020 13:51:00 -0700 Subject: [PATCH 271/936] Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) --- .github/ISSUE_TEMPLATE/bug_report.md | 31 ++ .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/pull_request_template.md | 23 ++ LICENSE | 13 + README.md | 367 +------------------ docs/capabilities.md | 220 +++++++++++ docs/form-variables.md | 44 +++ docs/getting-started.md | 76 ++++ docs/manifest.md | 74 ++++ manifest.schema.json | 2 +- schemas/capabilities/auditLogEventsHook.json | 2 +- 11 files changed, 514 insertions(+), 358 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/pull_request_template.md create mode 100644 LICENSE create mode 100644 docs/capabilities.md create mode 100644 docs/form-variables.md create mode 100644 docs/getting-started.md create mode 100644 docs/manifest.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..2ef50036 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Is this a support request?** +This issue tracker is maintained by the LaunchDarkly integration team and is intended for feedback on the integration platform and integrations. If you're not sure whether the problem you are having is specifically related to the platform and integrations, or to the LaunchDarkly service overall, it may be more appropriate to contact the LaunchDarkly support team; they can help to investigate the problem and will consult the integration team if necessary. You can submit a support request by going [here](https://support.launchdarkly.com/) and clicking "submit a request", or by emailing support@launchdarkly.com. + +Note that issues filed on this issue tracker are publicly accessible. Do not provide any private account information on your issues. If your problem is specific to your account, you should submit a support request as described above. + +**Describe the bug** +A clear and concise description of what the bug is. + +**To reproduce** +Steps to reproduce the behavior. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Logs** +If applicable, add any log output related to your problem. + +**Integration** +The integration that you are using. + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..533b5a7a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I would love to see the integration platform [...does something new...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context about the feature request here. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..166037ee --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,23 @@ +**Requirements** + +- [ ] I have followed the repository's [pull request submission guidelines](../blob/master/README.md#submitting-pull-requests) +- [ ] I have updated my user documentation +- [ ] I have updated my developer documentation (my integration README) + +**Related issues** + +Provide links to any issues in this repository or elsewhere relating to this pull request. + +**Describe the solution you've provided** + +If you're adding a new integration, provide some context into how LaunchDarkly and the third-party service should interact. + +If you're modifying an existing integration, provide a clear and concise description of what you expect to happen. + +**Describe alternatives you've considered** + +If you're modifying an existing integration, provide a clear and concise description of any alternative solutions or features you've considered. + +**Additional context** + +Add any other context about the pull request here. diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..f711cb7d --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic, Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README.md b/README.md index bc3f09b2..df5922f8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# LaunchDarkly integrations +# LaunchDarkly Integration Framework [![CircleCI](https://circleci.com/gh/launchdarkly/ld-integrations.svg?style=svg&circle-token=c12dfaa51d070b8bbc8dea0c0adf4c402b5b9123)](https://circleci.com/gh/launchdarkly/ld-integrations) @@ -8,367 +8,22 @@ into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly to provide their users with more context. -## Getting started - -There are several steps to creating an integration with LaunchDarkly. - -### Step 0: Replicate your desired behavior with `curl` - -Prior to connecting LaunchDarkly with a third-party service, you should replicate your integration's desired behavior in an isolated environment (standalone from LaunchDarkly). The easiest way to do this is by using [`curl`](https://curl.haxx.se/docs/manpage.html). A lot of API documentation has `curl` example commands provided for developers to use. Find the API documentation for your third-party service and execute sample commands against it. Take note of the request semantics. This will help streamline your manifest and template definitions. - -### Step 1: Fork this Repository - -You will need to fork this repository to your own GitHub account. When you've -completed your integration, you can [submit a pull request to -LaunchDarkly](#step-7-submitting-your-integration) for it to get approved and -deployed. - -### Step 2: Create a new directory inside `./integrations` - -Create a new directory inside the [integrations](./integrations) directory named -after your organization or integration's name (e.g., `example-dot-com`). Make -sure the directory has no spaces and uses -[kebab-casing](https://wiki.c2.com/?KebabCase). - -You should only change files and directories inside your new directory. Our -validation process will reject any pull requests that attempt to modify content -outside of your directory. - -### Step 3: Create your integration manifest - -Create an empty -[`manifest.json`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#launchdarkly-integrations-manifest-properties) -file inside your new directory. The `manifest.json` file will describe your -integration's information and capabilities. - -The properties of LaunchDarkly's integration manifest are defined through a -[JSON schema](./manifest.schema.json) and has a [corresponding schema -documentation](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md). -Many IDEs can provide you inline help and validation while editing your -manifest. To enable this you can register the [JSON -schema](./manifest.schema.json) in your IDE. If you use -[VSCode](https://code.visualstudio.com/), VSCode will detect the settings in -this repository and apply the schema validation without any additional -configuration. - -![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) - -### Step 4: Describe your integration's basic information inside the manifest - -The first part of the manifest describes your organization, contacts, URLs, and -a few things we need to list your integration properly: - -``` -{ - "name": "Sample Integration", - "version": "1.0.0", - "overview": "Short one-liner describing your integration", - "description": "Send flag data to space. Markdown based description.", - "author": "Example Dot Com", - "supportEmail": "support@example.com", - "links": { - "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" - }, - "categories": ["apm", "monitoring", "alerts"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - ... -} -``` - -The example above describes the basic information about your integration. We -will use most of the information above when rendering your integration -configuration form inside the LaunchDarkly UI. - -There are a few properties in the manifest that can accept simple -[markdown](https://daringfireball.net/projects/markdown/). One of them is the -[`description`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#description). -This markdown format will get converted to HTML in LaunchDarkly's UI. Only use -simple markdown structures like links and basic text formatting. - -Notice that the -[`icons`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#icons) -described above are in SVG format. This is intentional. Your organization's (or -integration's) logo will be used in the LaunchDarkly UI but also inside a public -facing integrations listing on -[launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG -files allow your logo to scale nicely on different devices. We do not accept -other image formats. - -Also, notice that the `icon.square` and `icon.horizontal` properties point to a -relative path. This path is relative to your integration's directory. You are -free to create any directories and files that support your integration. - -You can also create a `README.md` inside your integration's directory that -provides additional information about your integration. If provided, we may use -your `README.md` as documentation to your integration. - -### Step 5: Collecting integration configuration data from LaunchDarkly users - -Most integrations will need to collect one or more pieces of configuration data -that supports the integration. Some examples include: - -- API token -- Webhook endpoint -- URLs +Currently, LaunchDarkly's integration framework allows you to build one-way integrations (LaunchDarkly to 3rd party). We currently support a small subset of capabilities that allow you to subscribe to events in LaunchDarkly to trigger an action or event in your service. You can think of this capability as a webhook, but with the added convenience of not having to write your own service to manage the integration. LaunchDarkly will manage the configuration, authentication, and transformation of our events to what your service expects without having to create an intermediary service. -To support these configurations, you can describe a set of -[`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) -that define these configuration properties. Here's an example: - -``` -{ - ... - "formVariables": [ - { - "key": "endpointUrl", - "name": "Webhook endpoint URL", - "description": "Enter the URL to the webhook endpoint", - "default": "https://example.com/inbound_webhook", - "type": "url", - "isSecret": false - }, - { - "key": "apiToken", - "name": "API Key", - "description": "Enter your [API key](https://example.com/api) here", - "type": "string", - "isSecret": true - } - ], - ... -} -``` - -The -[`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) -entry above will yield the following UI inside of the [LaunchDarkly Integration -page](https://app.launchdarkly.com/default/integrations): - -![Example configuration -form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) - -The `formVariables[].description` will be used as a field label on the UI. You -can use simple markdown to link a word or phrase to an external URL. - -### Step 6: Define your integration's capabilities - -The third part of defining your LaunchDarkly integration is describing its -[capabilities](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#capabilities). - -As of today, we support only one capability, [Audit Log Event -Hook](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook). -An Audit Log Event Hook is a webhook that's sent by LaunchDarkly whenever an -event happens inside of LaunchDarkly. This capability can be used to trigger an -event in another service. - -Here's an example of an Audit Log Event Hook capability that subscribes to flag -events in a LaunchDarkly account: - -``` -{ - ... - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "{{endpointUrl}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, - "templates": { - "flag": "templates/flag.json" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } - ... -} -``` - -The -[`auditLogEventsHook`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook) -has three properties: - -1. [`endpoint`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#endpoint): - Describes the HTTP handler that will receive the webhook. In the example - above, you'll notice that a few of the properties (`endpoint.url` and - `endpoint.headers[].value`) will accept template variables. These template - variables can reference any `formVariables` you've defined in your manifest. - The templating language we use is based off of - [Handlebars](https://handlebarsjs.com/) syntax. -2. [`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates): - A map of template paths relative to your integration's directory. These - templates can be any file type. -3. [`defaultPolicy`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#defaultpolicy): - An array of [LaunchDarkly - policies](https://docs.launchdarkly.com/docs/policies-in-custom-roles) that - act as a filter for which events to send to your webhook endpoint. These - policies can be overriden by users subscribing to your integration. We recommend the following default policy which specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects: - -```json - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] -``` - -#### Endpoint template variables - -There are a few properties that allow template variables to be substituted at -runtime. The main ones are the `endpoint.url` and the -`endpoint.headers[].value`. This will allow you to configure a dynamic endpoint -based on the `formVariables` your integration collects from the user. Here are -some examples: - -``` -This first example will utilize the `endpointUrl` formVariable as the URL of the endpoint and use the `apiToken` as a `Bearer` token in the `Authorization` header. -... - "endpoint": { - "url": "{{endpointUrl}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, -... - -This next example uses the `apiToken` formVariable as a query parameter on the URL. -... - "endpoint": { - "url": "https://example.com/apiToken?={{apiToken}}", - "method": "POST" - }, -... - -``` - -#### Template files - -Before the `auditLogEventsHook` capability sends the request to the endpoint -handling your webhook, you have the option to transform the body of the request -sent to your handler. If you don't provide one or more templates, LaunchDarkly -will send you a default JSON payload that looks like this: - -``` -{ - "_links": { - "canonical": { - "href": "/api/v2/flags/always-snippet/example-test", - "type": "application/json" - }, - "parent": { - "href": "/api/v2/auditlog", - "type": "application/json" - }, - "self": { - "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", - "type": "application/json" - }, - "site": { - "href": "/always-snippet/production/features/example-test", - "type": "text/html" - } - }, - "_id": "5defebd006121dd9f7ea90d0", - "_accountId": "", - "timestamp": { - "milliseconds": 1576004560130, - "seconds": 1576004560, - }, - "kind": "flag", - "name": "Example test", - "description": "", - "shortDescription": "", - "comment": "This is just a test", - "member": { - "_links": { - "parent": { - "href": "/api/v2/members", - "type": "application/json" - }, - "self": { - "href": "/api/v2/members/569f514183f2164430000002", - "type": "application/json" - } - }, - "_id": "569f514183f2164430000002", - "email": "testing@example.com", - "firstName": "Henry", - "lastName": "Barrow" - }, - "titleVerb": "", - "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", - "title": "Henrietta Powell turned on the flag Example test in 'Production'", - "target": { - "_links": null, - "name": "" - } -} -``` - -However, if you choose to provide one or more -[`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates), -LaunchDarkly will render your template using the context data above. Your -template can be any text based format, but make sure you specify the appropriate -`Content-Type` header in your `endpoint.headers` property to match the content -type of your template body. - -We use basic [Handlerbars](https://handlebarsjs.com/) template syntax to render -your template. Check out [Handlebars' Language -Guide](https://handlebarsjs.com/guide/) for more information on its syntax. In -addition to the basic language syntax, we support the following [built-in -helpers](https://github.com/aymerick/raymond#built-in-helpers): `if`, `unless`, -`each`, `with`, `lookup`, and `equal`. +## Getting started -To test your templates, you can use the [Handlebars -Sandbox](http://tryhandlebarsjs.com/). +Read our [step-by-step instructions](docs/getting-started.md) on getting started with building an integration. -### Step 7: Validating your integration +## Partnership program -Run `npm install` to install the validation dependencies. Run `npm test` to run the validation suite. In addition, we -recommend install pre-commit hooks with `pre-commit install` to have the validation suite run before every commit. +Leveraging the Integration Framework is just one step in creating a technology partnership with LaunchDarkly. Join our Technology Partner Program in order to unlock all of the partner benefits by emailing us at [partnerships@launchdarkly.com](mailto:partnerships@launchdarkly.com). -Run `npm run preview YOUR_INTEGRATION_DIR_NAME` to preview your integration's templates with sample data. Alternatively run `npm run curl YOUR_INTEGRATION_DIR_NAME` to produce a sample `curl` command to send data with your integration's service. +## Submitting bug reports and feature requests -### Step 8: Submitting your integration +The LaunchDarkly integration team monitors the [issue tracker](https://github.com/launchdarkly/ld-integrations/issues) in this repository. Bug reports and feature requests specific to the platform and integrations should be filed in this issue tracker. The integration team will respond to all newly filed issues within two business days. -Once you're done with your integration, [submit a pull request against this -repo](https://github.com/launchdarkly/ld-integrations/pull/new/master). Your -branch will run through some automated validations and will be reviewed by -someone on our team. Once everything checks out, we'll publish your integration -when you give us the green light. +If you want to reach out more privately, email [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com). -## Comments, suggestions, bug reports? +## Submitting pull requests -Visit us in our Slack channel -[#ext-integrations](https://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQhttps://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQ) -or log an issue or request -[here](https://github.com/launchdarkly/ld-integrations/issues). +We encourage pull requests and other contributions from the community. Before submitting pull requests, ensure that all temporary or unintended code is removed. Don't worry about adding reviewers to the pull request; the LaunchDarkly integration team will add themselves. The integration team will acknowledge all pull requests within two business days. diff --git a/docs/capabilities.md b/docs/capabilities.md new file mode 100644 index 00000000..123f5f61 --- /dev/null +++ b/docs/capabilities.md @@ -0,0 +1,220 @@ +# Capabilities + +The third part of defining your LaunchDarkly integration is describing its +`capabilities`. Your integration's `capabilities` describe how it interacts with LaunchDarkly. + +We currently support two capabilities: + +* [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`) +* [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) + +## Audit log events hook (`auditLogEventsHook`) + +An audit log events hook is a webhook that's sent by LaunchDarkly whenever an +event happens inside of LaunchDarkly. The name comes from the fact that each of these events will +result in an event being published to LaunchDarkly's audit log. +This capability can be used to send data to or trigger an event in another service. + +The `auditLogEventsHook` has three properties: + +1. [`endpoint`](#endpoint): + Describes the HTTP handler that will receive the webhook. +2. [`templates`](#templates): + A map of template paths relative to your integration's directory. Templates are used to transform the raw audit log events to a format that your integration expects. These templates can be any file type. +3. [`defaultPolicy`](#default-policy): + An array of [LaunchDarkly + policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) that + act as a filter for which events to send to your webhook endpoint. + +Here's an example of an audit log events hook capability that subscribes to flag +events in a LaunchDarkly account: + +```json + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, + "templates": { + "flag": "templates/flag.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +``` + +### Endpoint + +Every `auditLogEventsHook` capability must specify the endpoint to which webhook data should be sent. This specification must include all appropriate request semantics including the URL, method, and headers. + +In the example +above, you'll notice that a few of the properties (`endpoint.url` and +`endpoint.headers[].value`) will accept template variables. These template +variables can reference any `formVariables` you've defined in your manifest. +The templating language we use is based off of a subset of the +[Handlebars](https://handlebarsjs.com/) syntax. + +There are a few properties that allow template variables to be substituted at +runtime. The main ones are the `endpoint.url` and the +`endpoint.headers[].value`. This will allow you to configure a dynamic endpoint +based on the `formVariables` your integration collects from the user. + +Here are some examples. This first example will utilize the `endpointUrl` form variable as the URL of the endpoint and use the `apiToken` as a `Bearer` token in the `Authorization` header. + +```json + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, +``` + +This next example uses the `apiToken` formVariable as a query parameter on the URL. + +```json + "endpoint": { + "url": "https://example.com/apiToken?={{apiToken}}", + "method": "POST" + }, +``` + +### Templates + +Before the `auditLogEventsHook` capability sends the request to the endpoint +handling your webhook, you have the option to transform the body of the request +sent to your handler. If you don't provide one or more templates, LaunchDarkly +will send you a default JSON payload that looks like this: + +```json +{ + "_links": { + "canonical": { + "href": "/api/v2/flags/always-snippet/example-test", + "type": "application/json" + }, + "parent": { + "href": "/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", + "type": "application/json" + }, + "site": { + "href": "/always-snippet/production/features/example-test", + "type": "text/html" + } + }, + "_id": "5defebd006121dd9f7ea90d0", + "_accountId": "", + "timestamp": { + "milliseconds": 1576004560130, + "seconds": 1576004560, + }, + "kind": "flag", + "name": "Example test", + "description": "", + "shortDescription": "", + "comment": "This is just a test", + "member": { + "_links": { + "parent": { + "href": "/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@example.com", + "firstName": "Henry", + "lastName": "Barrow" + }, + "titleVerb": "", + "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", + "title": "Henrietta Powell turned on the flag Example test in 'Production'", + "target": { + "_links": null, + "name": "" + } +} +``` + +However, if you choose to provide one or more +`templates`, +LaunchDarkly will render your template using the context data above. Your +template can be any text based format, but make sure you specify the appropriate +`Content-Type` header in your `endpoint.headers` property to match the content +type of your template body. + +We use a basic subset of the [Handlebars](https://handlebarsjs.com/) template syntax to render +your template. Check out [Handlebars' Language +Guide](https://handlebarsjs.com/guide/) for more information on its syntax. In +addition to the basic language syntax, we support the following [built-in +helpers](https://github.com/aymerick/raymond#built-in-helpers): `if`, `unless`, +`each`, `with`, `lookup`, and `equal`. + +To test your templates, you can use the [Handlebars +Sandbox](http://tryhandlebarsjs.com/). + +### Default policy + +When configuring your integration, customers can specify an array of [LaunchDarkly +policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) that +act as a filter for which events to send to your webhook endpoint. To simplify your integration's onboarding, you can specify a default policy which follows best practices for your integration's use case. + +Assuming your integration only cares about flag activity, we recommend the following default policy which specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects: + +```json + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] +``` + +### Validation + +Run `npm run preview YOUR_INTEGRATION_DIR_NAME` to preview your integration's templates with sample data. + +Alternatively run `npm run curl YOUR_INTEGRATION_DIR_NAME` to produce a sample `curl` command to send data with your integration's service as if it was sent by the audit log event hook capability. + +## Reserved custom properties (`reservedCustomProperties`) + +Custom properties allow for data to be stored in LaunchDarkly alongside a feature flag. For example, custom properties are a great place to indicate flag-level associations with data on your service. If you don't have any flag-level associations or configurations, you don't need to use this capability. Read more about custom properties in [our documentation](https://docs.launchdarkly.com/home/advanced/custom-properties). + +By default, users need to specify a custom property name and key when attaching the custom property value to a feature flag. This step adds a bit of friction to using custom properties and introduces the opportunity for user error. As a result, developers can _reserve_ a custom property for their integration which makes it much easier for users to correctly add the property's value to feature flags. + +Reserved custom properties are simple to define -- they require a `name` and `key`. That's all. + +Once your integration is configured by a user, the custom property will start appearing in the dropdown on the flag settings page. diff --git a/docs/form-variables.md b/docs/form-variables.md new file mode 100644 index 00000000..5685dc82 --- /dev/null +++ b/docs/form-variables.md @@ -0,0 +1,44 @@ +# Form variables + +Most integrations will need to collect one or more pieces of configuration data +that supports the integration. Some examples include API tokens or webhook endpoints. + +To support these configurations, you can describe a set of +`formVariables` that define these configuration properties. + +Here's an example: + +```json + "formVariables": [ + { + "key": "endpointUrl", + "name": "Webhook endpoint URL", + "description": "Enter the URL to the webhook endpoint", + "default": "https://example.com/inbound_webhook", + "type": "url" + }, + { + "key": "apiToken", + "name": "API Key", + "description": "Enter your [API key](https://example.com/api) here", + "type": "string", + "isSecret": true + } + ], +``` + +The `formVariables` entry above will yield the following UI inside of the [LaunchDarkly Integrations +page](https://app.launchdarkly.com/default/integrations): + +![Example configuration +form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) + +Form variables apply to the entire integration configuration. There are no capability-specific form variables at this time. + +The `formVariables[].description` will be used as a field label on the UI. You +can use simple markdown to link a word or phrase to an external URL. + +Accepted form variable `type`s are `string`, `boolean`, `uri`, and `enum`. +You may optionally set `isSecret` or `isOptional` as appropriate or provide guidance with `placeholder` and `defaultValue`. + +Refer to the [manifest schema](../manifest.schema.json) for more information. diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 00000000..b703ac32 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,76 @@ +# Getting started + +There are several steps to building an integration with LaunchDarkly. + +## Step 0: Replicate your desired behavior with `curl` + +Prior to connecting LaunchDarkly with a third-party service, you should replicate your integration's desired behavior in an isolated environment (standalone from LaunchDarkly). The easiest way to do this is by using [`curl`](https://curl.haxx.se/docs/manpage.html). A lot of API documentation has `curl` example commands provided for developers to use. Find the API documentation for your third-party service and execute sample commands against it. Take note of the request semantics. This will help streamline your manifest and template definitions. + +## Step 1: Fork this Repository + +You will need to fork this repository to your own GitHub account. When you've +completed your integration, you can [submit a pull request to +LaunchDarkly](#step-8-submit-your-integration) for it to get approved and +deployed. + +## Step 2: Create a new directory inside `./integrations` + +Create a new directory inside the [integrations](../integrations) directory named +after your organization or integration's name (e.g., `example-dot-com`). Make +sure the directory has no spaces and uses +[kebab-casing](https://wiki.c2.com/?KebabCase). + +You should only change files and directories inside your new directory. Our +validation process will reject any pull requests that attempt to modify content +outside of your directory. + +## Step 3: Create your integration manifest + +Each integration contains a manifest defining how basics about your integration and organization, +and instructing how LaunchDarkly should interact with your integration. Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. + +[Read more](manifest.md). + +## Step 4: Collect integration configuration data from LaunchDarkly users + +Most integrations will need to collect one or more pieces of configuration data +that supports the integration. Some examples include API tokens or webhook endpoints. + +To support these configurations, you can describe a set of +`formVariables` that define these configuration properties. + +[Read more](form-variables.md). + +## Step 5: Define your integration's capabilities + +The third part of defining your LaunchDarkly integration is describing its +`capabilities`. Your integration's `capabilities` describe how it interacts with LaunchDarkly. + +[Read more](capabilities.md). + +## Step 6: Validate your integration + +Run `npm install` to install the validation dependencies. Run `npm test` to run the validation suite. In addition, we +recommend install [pre-commit](https://pre-commit.com/#install) hooks with `pre-commit install` to have the validation suite run before every commit. + +Additionally, some of the capabilities have their own validation tools. Refer to the [capabilities documentation](capabilities.md) for more information. + +## Step 7: Create your user documentation and README + +Now that your integration is built and validated, you'll want to provide documentation -- +both for users and integration maintainers. + +LaunchDarkly's user documentation is accessible on [docs.launchdarkly.com](https://docs.launchdarkly.com/integrations). Third-party contributions can be submitted to our [LaunchDarkly-Docs repository](https://github.com/launchdarkly/LaunchDarkly-Docs). You'll want to submit a pull request to this repository with a new integrations guide. Follow the pattern and language used by existing integration guides. + +In addition to user documentation, you'll want to provide guidance on how to maintain and test your integration. You should specify this developer-focused information in an integration README (`README.md`) in your integration's directory. Additionally +the README should link to your user documentation worked mentioned above. + +## Step 8: Submit your integration + +Once you're done with your integration, [submit a pull request against this +repo](https://github.com/launchdarkly/ld-integrations/pull/new/master). Your +branch will run through some automated validations and will be reviewed by +our team. Once everything checks out, we'll publish your integration +when you give us the green light. + +We'll also work with you on submitting and approving your user documentation to our [LaunchDarkly-Docs repository](https://github.com/launchdarkly/LaunchDarkly-Docs). diff --git a/docs/manifest.md b/docs/manifest.md new file mode 100644 index 00000000..33afbebb --- /dev/null +++ b/docs/manifest.md @@ -0,0 +1,74 @@ +# Integration manifest + +Each integration contains a manifest defining the basics about your integration and organization, +and instructing how LaunchDarkly should interact with your service. Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. + +## Introduction + +Create an empty +`manifest.json` file inside your new directory. The `manifest.json` file will describe your +integration's information and capabilities. + +The properties of LaunchDarkly's integration manifests are defined through a +[JSON schema](../manifest.schema.json). +Many IDEs can provide you inline help and validation while editing your +manifest. To enable this you can register the JSON +schema in your IDE. If you use +[VSCode](https://code.visualstudio.com/), VSCode will detect the settings in +this repository and apply the schema validation without any additional +configuration. + +![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) + +## Basics + +The first part of the manifest describes your organization, contacts, URLs, and +a few things we need to list your integration properly. We will use most of this +information when rendering your integration card and configuration form +inside the LaunchDarkly UI. + +```json +{ + "name": "Sample Integration", + "version": "1.0.0", + "overview": "Short one-liner describing your integration", + "description": "Send flag data to space. Markdown based description.", + "author": "Example Dot Com", + "supportEmail": "support@example.com", + "links": { + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} +``` + + +There are a few properties in the manifest that can accept simple +[markdown](https://daringfireball.net/projects/markdown/). One of them is the +`description`. +This markdown format will get converted to HTML in LaunchDarkly's UI. Only use +simple markdown structures like links and basic text formatting. + +Notice that the `icons` described above are in SVG format. This is intentional. Your organization's (or +integration's) logo will be used in the LaunchDarkly UI but also inside a public +facing integrations listing on +[launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG +files allow your logo to scale nicely on different devices. We do not accept other image formats. +In order for your logos to look great wherever we use them in LaunchDarkly, make sure your +SVG logos don't have any padding around the logo. + +Also, notice that the `icon.square` and `icon.horizontal` properties point to +relative paths. These paths are relative to your integration's directory. You are +free to create any directories and files that support your integration. + +## Form variables and capabilities + +Form variables and capabilities make up the most important part of the manifest as they +define the primary interactions that LaunchDarkly and users will have with your integration. + +Read more about [form variables](form-variables.md) and [capabilities](capabilities.md). diff --git a/manifest.schema.json b/manifest.schema.json index 71e9ccb6..2d224a5f 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -338,7 +338,7 @@ "properties": { "auditLogEventsHook": { "$id": "#/properties/capability/audit-log-events-hook", - "title": "Audit Log Events Hook", + "title": "Audit log events hook", "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", "type": "object", "propertyNames": { diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index e53fcd9d..43c0a972 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "auditLogEventsHook": { "$id": "#/properties/capability/audit-log-events-hook", - "title": "Audit Log Events Hook", + "title": "Audit log events hook", "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", "type": "object", "propertyNames": { From e2c6a5ca0076694f5d25cb2570cbb7446efc7966 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 12 May 2020 11:37:30 +0100 Subject: [PATCH 272/936] Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow --- __tests__/validateIntegrationManifests.js | 32 +++++++++++++++++-- integrations/sample-integration/manifest.json | 1 + manifest.schema.json | 13 ++++++-- preview.js | 13 ++++++++ schemas/base.json | 12 +++++-- 5 files changed, 65 insertions(+), 6 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 99cf8940..204d079e 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -9,6 +9,7 @@ const schema = require('../manifest.schema.json'); const flagContext = require('../sample-context/flag/update-all-environments'); const projectContext = require('../sample-context/project/update'); const environmentContext = require('../sample-context/environment/update'); +const OAUTH_INTEGRATIONS = ['sample-integration']; // add oauth integrations here registerHelpers(); @@ -40,6 +41,17 @@ const getFormVariableContext = formVariables => { return endpointContext; }; +const getOAuthContext = requiresOAuth => { + if (requiresOAuth) { + const oauthContext = { + baseURI: '$OAUTH_BASE_URI', + accessToken: '$OAUTH_ACCESS_TOKEN', + }; + return oauthContext; + } + return null; +}; + const isJSONTemplate = templateFilename => { const lowercase = templateFilename.toLowerCase(); return lowercase.endsWith('.json') || lowercase.endsWith('.json.hbs'); @@ -65,11 +77,13 @@ const getTemplate = path => { const getFullContext = (manifest, context, isJSON) => { const formVariables = _.get(manifest, 'formVariables', null); - const formVariableContext = getFormVariableContext(formVariables); + const requiresOAuth = _.get(manifest, 'requiresOAuth', null); + const endpointContext = getFormVariableContext(formVariables); + endpointContext.oauth = getOAuthContext(requiresOAuth); const fullContext = isJSON ? jsonEscape(Object.assign({}, context)) : Object.assign({}, context); - fullContext.formVariables = formVariableContext; + fullContext.formVariables = endpointContext; return fullContext; }; @@ -93,6 +107,7 @@ describe('All integrations', () => { 'Referenced form variables exist for %s', (key, manifest) => { const formVariables = _.get(manifest, 'formVariables', null); + const requiresOAuth = _.get(manifest, 'requiresOAuth', null); const endpoint = _.get( manifest, 'capabilities.auditLogEventsHook.endpoint', @@ -101,6 +116,7 @@ describe('All integrations', () => { if (endpoint) { const endpointContext = getFormVariableContext(formVariables); endpointContext.context = flagContext; + endpointContext.oauth = getOAuthContext(requiresOAuth); const urlTemplate = Handlebars.compile(endpoint.url, { strict: true, }); @@ -121,6 +137,18 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'OAuth parameters are correctly set and accessible for %s', + (key, manifest) => { + const requiresOAuth = _.get(manifest, 'requiresOAuth', null); + if (requiresOAuth) { + expect(OAUTH_INTEGRATIONS).toEqual(expect.arrayContaining([key])); + const oauthContext = getOAuthContext(requiresOAuth); + expect(oauthContext).not.toBe(null); + } + } + ); + test.each(manifests)( 'defaultValue types match the type of the formVariable for %s', (key, manifest) => { diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 37bb779a..0caa047f 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -14,6 +14,7 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, + "requiresOAuth": true, "formVariables": [ { "key": "optional", diff --git a/manifest.schema.json b/manifest.schema.json index 2d224a5f..aa262e57 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -18,7 +18,8 @@ "icons", "formVariables", "capabilities", - "legacy" + "legacy", + "requiresOAuth" ] }, "properties": { @@ -217,6 +218,13 @@ "kind" ] }, + "requiresOAuth": { + "$id": "#/properties/requires-oauth", + "title": "Requires OAuth", + "type": "boolean", + "description": "Whether the integration authenticates using OAuth", + "default": false + }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", @@ -265,7 +273,8 @@ "string", "boolean", "uri", - "enum" + "enum", + "oauth" ] }, "description": { diff --git a/preview.js b/preview.js index fd97ce0f..ccd62229 100644 --- a/preview.js +++ b/preview.js @@ -41,6 +41,17 @@ const getFormVariableContext = formVariables => { return endpointContext; }; +const getOAuthContext = requiresOAuth => { + if (requiresOAuth) { + const oauthContext = { + baseURI: '$OAUTH_BASE_URI', + accessToken: '$OAUTH_ACCESS_TOKEN', + }; + return oauthContext; + } + return null; +}; + registerHelpers(); const curl = _.includes(args, '--curl'); @@ -68,9 +79,11 @@ const endpoint = _.get( 'capabilities.auditLogEventsHook.endpoint', null ); +const requiresOAuth = _.get(manifest, 'requiresOAuth', null); if (endpoint) { const endpointContext = getFormVariableContext(formVariables); + endpointContext.oauth = getOAuthContext(requiresOAuth); endpointContext.context = flagUpdateContext; const urlTemplate = Handlebars.compile(endpoint.url, { strict: true, diff --git a/schemas/base.json b/schemas/base.json index 37e163a4..0458803e 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -18,7 +18,8 @@ "icons", "formVariables", "capabilities", - "legacy" + "legacy", + "requiresOAuth" ] }, "properties": { @@ -196,6 +197,13 @@ }, "required": ["kind"] }, + "requiresOAuth": { + "$id": "#/properties/requires-oauth", + "title": "Requires OAuth", + "type": "boolean", + "description": "Whether the integration authenticates using OAuth", + "default": false + }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", @@ -240,7 +248,7 @@ "title": "Type", "type": "string", "description": "The type of the variable", - "enum": ["string", "boolean", "uri", "enum"] + "enum": ["string", "boolean", "uri", "enum", "oauth"] }, "description": { "$id": "#/properties/formVariables/variable/description", From b3815e73e9dd41997de8975eb03f5836d7f7ac16 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 12 May 2020 16:04:20 +0100 Subject: [PATCH 273/936] add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) --- __tests__/validateIntegrationManifests.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 204d079e..ea19334c 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -167,6 +167,20 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'no non-string formVariables have been set to isSecret for %s', + (key, manifest) => { + const formVariables = _.get(manifest, 'formVariables', null); + if (formVariables) { + formVariables.forEach(formVariable => { + if (formVariable.type != 'string') { + expect(formVariable.isSecret).not.toBe(true); + } + }); + } + } + ); + test.each(manifests)( 'Templates can be successfully rendered for %s', (key, manifest) => { From 89aa87929183d3ac4a881ec0d29c862c2ef0d00b Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Tue, 12 May 2020 10:48:46 -0700 Subject: [PATCH 274/936] final prep for public/private mirror split (#98) --- .circleci/config.yml | 5 ++++- README.md | 4 ++-- docs/getting-started.md | 2 +- package-lock.json | 2 +- package.json | 8 ++++---- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 602c05c3..47b96530 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -37,7 +37,10 @@ jobs: - aws-cli/install - run: name: Deploy to s3 bucket - command: ./scripts/copy_to_s3.sh + command: | + if [ "$CIRCLE_REPOSITORY_URL" = "git@github.com:launchdarkly/integration-framework-private.git" ]; then + ./scripts/copy_to_s3.sh + fi environment: BUCKET_NAME: << parameters.bucket-name >> diff --git a/README.md b/README.md index df5922f8..63a3d334 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # LaunchDarkly Integration Framework -[![CircleCI](https://circleci.com/gh/launchdarkly/ld-integrations.svg?style=svg&circle-token=c12dfaa51d070b8bbc8dea0c0adf4c402b5b9123)](https://circleci.com/gh/launchdarkly/ld-integrations) +[![CircleCI](https://circleci.com/gh/launchdarkly/integration-framework.svg?style=svg&circle-token=c12dfaa51d070b8bbc8dea0c0adf4c402b5b9123)](https://circleci.com/gh/launchdarkly/integration-framework) Feature flags not only provide you control over your deployment and rollout but also provides context to other related systems -- giving your team visibility @@ -20,7 +20,7 @@ Leveraging the Integration Framework is just one step in creating a technology p ## Submitting bug reports and feature requests -The LaunchDarkly integration team monitors the [issue tracker](https://github.com/launchdarkly/ld-integrations/issues) in this repository. Bug reports and feature requests specific to the platform and integrations should be filed in this issue tracker. The integration team will respond to all newly filed issues within two business days. +The LaunchDarkly integration team monitors the [issue tracker](https://github.com/launchdarkly/integration-framework/issues) in this repository. Bug reports and feature requests specific to the platform and integrations should be filed in this issue tracker. The integration team will respond to all newly filed issues within two business days. If you want to reach out more privately, email [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com). diff --git a/docs/getting-started.md b/docs/getting-started.md index b703ac32..1f9f5395 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -68,7 +68,7 @@ the README should link to your user documentation worked mentioned above. ## Step 8: Submit your integration Once you're done with your integration, [submit a pull request against this -repo](https://github.com/launchdarkly/ld-integrations/pull/new/master). Your +repo](https://github.com/launchdarkly/integration-framework/pull/new/master). Your branch will run through some automated validations and will be reviewed by our team. Once everything checks out, we'll publish your integration when you give us the green light. diff --git a/package-lock.json b/package-lock.json index ca6ca093..8f026e66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "ld-integrations", + "name": "integration-framework", "version": "1.0.0", "lockfileVersion": 1, "requires": true, diff --git a/package.json b/package.json index 90a39920..d7e15929 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "ld-integrations", + "name": "integration-framework", "version": "1.0.0", "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", "main": "index.js", @@ -18,14 +18,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/launchdarkly/ld-integrations.git" + "url": "git+https://github.com/launchdarkly/integration-framework.git" }, "author": "", "license": "ISC", "bugs": { - "url": "https://github.com/launchdarkly/ld-integrations/issues" + "url": "https://github.com/launchdarkly/integration-framework/issues" }, - "homepage": "https://github.com/launchdarkly/ld-integrations#readme", + "homepage": "https://github.com/launchdarkly/integration-framework#readme", "devDependencies": { "@apidevtools/json-schema-ref-parser": "^8.0.0", "ajv": "^6.10.2", From 80da84dd30d622c5e2c9e0509f8d38e25e497b78 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Tue, 12 May 2020 11:22:37 -0700 Subject: [PATCH 275/936] Fix status indicator for new repo (#99) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 63a3d334..26fa737e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # LaunchDarkly Integration Framework -[![CircleCI](https://circleci.com/gh/launchdarkly/integration-framework.svg?style=svg&circle-token=c12dfaa51d070b8bbc8dea0c0adf4c402b5b9123)](https://circleci.com/gh/launchdarkly/integration-framework) +[![CircleCI](https://circleci.com/gh/launchdarkly/integration-framework.svg?style=svg&circle-token=9a44436c3b22e7fb6a22df1ad9a2455a0d6f2d34)](https://circleci.com/gh/launchdarkly/integration-framework) Feature flags not only provide you control over your deployment and rollout but also provides context to other related systems -- giving your team visibility From eef14c250e3e72bc142dedb7e34ec84add801a8f Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Wed, 13 May 2020 13:31:08 -0700 Subject: [PATCH 276/936] Copyedits README (#100) --- README.md | 28 +++++++----- docs/capabilities.md | 97 ++++++++++++++++++++++++----------------- docs/form-variables.md | 16 +++---- docs/getting-started.md | 85 ++++++++++++++++++++---------------- docs/manifest.md | 47 +++++++++++--------- 5 files changed, 156 insertions(+), 117 deletions(-) diff --git a/README.md b/README.md index 26fa737e..d29c19af 100644 --- a/README.md +++ b/README.md @@ -2,28 +2,34 @@ [![CircleCI](https://circleci.com/gh/launchdarkly/integration-framework.svg?style=svg&circle-token=9a44436c3b22e7fb6a22df1ad9a2455a0d6f2d34)](https://circleci.com/gh/launchdarkly/integration-framework) -Feature flags not only provide you control over your deployment and rollout but -also provides context to other related systems -- giving your team visibility -into how your services react due to changes to flags. This repository contains +Feature flags give you control over your deployment and rollout, but that's not all they do. They also provide context to other related systems, giving your team visibility into how your services react due to flag changes. + +This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly to provide their users with more context. -Currently, LaunchDarkly's integration framework allows you to build one-way integrations (LaunchDarkly to 3rd party). We currently support a small subset of capabilities that allow you to subscribe to events in LaunchDarkly to trigger an action or event in your service. You can think of this capability as a webhook, but with the added convenience of not having to write your own service to manage the integration. LaunchDarkly will manage the configuration, authentication, and transformation of our events to what your service expects without having to create an intermediary service. +LaunchDarkly's integration framework lets you build one-way integrations from LaunchDarkly to a third party service. We support a small subset of actions that let you subscribe to LaunchDarkly events to trigger an action or event in your service. You can think of this capability as a webhook, with the added convenience of not having to write your own service to manage the integration. LaunchDarkly manages the configuration, authentication, and transformation of our events to what your service expects without having to create an intermediary service. + +## Building your own integrations -## Getting started +We've provided step-by-step instructions to help you build integrations. -Read our [step-by-step instructions](docs/getting-started.md) on getting started with building an integration. +To learn more, read [Getting started](docs/getting-started.md). -## Partnership program +## The LaunchDarkly Technology Partner Program -Leveraging the Integration Framework is just one step in creating a technology partnership with LaunchDarkly. Join our Technology Partner Program in order to unlock all of the partner benefits by emailing us at [partnerships@launchdarkly.com](mailto:partnerships@launchdarkly.com). +Using the LaunchDarkly Integration Framework is just one way to create a relationship with LaunchDarkly. You can unlock even more benefits by joining our Technology Partner Program. + +To join the program, email us at [partnerships@launchdarkly.com](mailto:partnerships@launchdarkly.com). ## Submitting bug reports and feature requests -The LaunchDarkly integration team monitors the [issue tracker](https://github.com/launchdarkly/integration-framework/issues) in this repository. Bug reports and feature requests specific to the platform and integrations should be filed in this issue tracker. The integration team will respond to all newly filed issues within two business days. +The LaunchDarkly integration team monitors this repository's [issue tracker](https://github.com/launchdarkly/integration-framework/issues). We respond to all new issues within two business days. Use the issue tracker to file bug reports and feature requests specific to the platform and integrations. -If you want to reach out more privately, email [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com). +If you want to reach out in private, email [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com). ## Submitting pull requests -We encourage pull requests and other contributions from the community. Before submitting pull requests, ensure that all temporary or unintended code is removed. Don't worry about adding reviewers to the pull request; the LaunchDarkly integration team will add themselves. The integration team will acknowledge all pull requests within two business days. +We encourage pull requests and other contributions from the community. The integration team responds to all new pull requests within two business days. + +Before you submit pull requests, make sure that all temporary or unintended code is removed. Don't worry about adding reviewers to the pull request; the LaunchDarkly integration team can add themselves. diff --git a/docs/capabilities.md b/docs/capabilities.md index 123f5f61..becd27d0 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -1,30 +1,29 @@ # Capabilities -The third part of defining your LaunchDarkly integration is describing its -`capabilities`. Your integration's `capabilities` describe how it interacts with LaunchDarkly. +Your integration's `capabilities` describe how it interacts with LaunchDarkly. -We currently support two capabilities: +We support two capabilities: -* [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`) +* [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`), and * [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) ## Audit log events hook (`auditLogEventsHook`) -An audit log events hook is a webhook that's sent by LaunchDarkly whenever an -event happens inside of LaunchDarkly. The name comes from the fact that each of these events will +An audit log events hook is a webhook that LaunchDarkly sends whenever an +event happens inside of LaunchDarkly. Each of these events result in an event being published to LaunchDarkly's audit log. -This capability can be used to send data to or trigger an event in another service. +You can use this capability to send data to or trigger an event in another service. The `auditLogEventsHook` has three properties: 1. [`endpoint`](#endpoint): Describes the HTTP handler that will receive the webhook. 2. [`templates`](#templates): - A map of template paths relative to your integration's directory. Templates are used to transform the raw audit log events to a format that your integration expects. These templates can be any file type. + A map of template paths relative to your integration's directory. You can use templates to transform the raw audit log events to a format that your integration expects. These templates can be any file type. 3. [`defaultPolicy`](#default-policy): An array of [LaunchDarkly policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) that - act as a filter for which events to send to your webhook endpoint. + act as a filter determining which events to send to your webhook endpoint. Here's an example of an audit log events hook capability that subscribes to flag events in a LaunchDarkly account: @@ -62,21 +61,23 @@ events in a LaunchDarkly account: ### Endpoint -Every `auditLogEventsHook` capability must specify the endpoint to which webhook data should be sent. This specification must include all appropriate request semantics including the URL, method, and headers. +Every `auditLogEventsHook` capability must specify the endpoint to which LaunchDarkly should send webhook data. This specification must include all appropriate request semantics including the URL, method, and headers. In the example -above, you'll notice that a few of the properties (`endpoint.url` and -`endpoint.headers[].value`) will accept template variables. These template +above, a few of the properties (`endpoint.url` and +`endpoint.headers[].value`) accept template variables. These template variables can reference any `formVariables` you've defined in your manifest. The templating language we use is based off of a subset of the -[Handlebars](https://handlebarsjs.com/) syntax. +Handlebars syntax. -There are a few properties that allow template variables to be substituted at +To learn more, read [Handlebars' documentation](https://handlebarsjs.com/). + +There are a few properties that allow you to substitute template variables at runtime. The main ones are the `endpoint.url` and the -`endpoint.headers[].value`. This will allow you to configure a dynamic endpoint -based on the `formVariables` your integration collects from the user. +`endpoint.headers[].value`. This lets you configure a dynamic endpoint +based on the `formVariables` your integration collects from the user. Examples follow. -Here are some examples. This first example will utilize the `endpointUrl` form variable as the URL of the endpoint and use the `apiToken` as a `Bearer` token in the `Authorization` header. +This example uses the `endpointUrl` form variable as the URL of the endpoint and the `apiToken` as a `Bearer` token in the `Authorization` header: ```json "endpoint": { @@ -95,7 +96,7 @@ Here are some examples. This first example will utilize the `endpointUrl` form v }, ``` -This next example uses the `apiToken` formVariable as a query parameter on the URL. +This example uses the `apiToken` formVariable as a query parameter on the URL: ```json "endpoint": { @@ -107,9 +108,11 @@ This next example uses the `apiToken` formVariable as a query parameter on the U ### Templates Before the `auditLogEventsHook` capability sends the request to the endpoint -handling your webhook, you have the option to transform the body of the request -sent to your handler. If you don't provide one or more templates, LaunchDarkly -will send you a default JSON payload that looks like this: +handling your webhook, you can transform the body of the request +sent to your handler. + +If you don't provide one or more templates, LaunchDarkly +sends you a default JSON payload that looks like this: ```json { @@ -168,30 +171,42 @@ will send you a default JSON payload that looks like this: } ``` -However, if you choose to provide one or more +If you choose to provide one or more `templates`, -LaunchDarkly will render your template using the context data above. Your -template can be any text based format, but make sure you specify the appropriate +LaunchDarkly renders your template using the context data above. Your +template can be any text based format, but you must specify the appropriate `Content-Type` header in your `endpoint.headers` property to match the content type of your template body. -We use a basic subset of the [Handlebars](https://handlebarsjs.com/) template syntax to render -your template. Check out [Handlebars' Language -Guide](https://handlebarsjs.com/guide/) for more information on its syntax. In -addition to the basic language syntax, we support the following [built-in -helpers](https://github.com/aymerick/raymond#built-in-helpers): `if`, `unless`, -`each`, `with`, `lookup`, and `equal`. +We use a basic subset of the Handlebars template syntax to render +your template. + +To learn more about Handlebars' sysntax, read [Handlebars' Language +Guide](https://handlebarsjs.com/guide/). + +In addition to the basic language syntax, we also support the following [built-in +helpers](https://github.com/aymerick/raymond#built-in-helpers): + +* `if` +* `unless` +* `each` +* `with` +* `lookup` +* `equal` To test your templates, you can use the [Handlebars Sandbox](http://tryhandlebarsjs.com/). ### Default policy -When configuring your integration, customers can specify an array of [LaunchDarkly -policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) that -act as a filter for which events to send to your webhook endpoint. To simplify your integration's onboarding, you can specify a default policy which follows best practices for your integration's use case. +When you configure your integration, customers can specify an array of [LaunchDarkly +policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) filter which events to send to your webhook endpoint. + +To simplify onboarding your integration, you can specify a default policy which follows best practices for your integration's use case. -Assuming your integration only cares about flag activity, we recommend the following default policy which specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects: +Assuming your integration only cares about flag activity, we recommend the following default policy. This policy specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects. + +Here is the policy: ```json "defaultPolicy": [ @@ -205,16 +220,18 @@ Assuming your integration only cares about flag activity, we recommend the follo ### Validation -Run `npm run preview YOUR_INTEGRATION_DIR_NAME` to preview your integration's templates with sample data. +To preview your integration's templates with sample data, run `npm run preview YOUR_INTEGRATION_DIR_NAME`. -Alternatively run `npm run curl YOUR_INTEGRATION_DIR_NAME` to produce a sample `curl` command to send data with your integration's service as if it was sent by the audit log event hook capability. +Alternatively, to produce a sample `curl` command, run `npm run curl YOUR_INTEGRATION_DIR_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. ## Reserved custom properties (`reservedCustomProperties`) -Custom properties allow for data to be stored in LaunchDarkly alongside a feature flag. For example, custom properties are a great place to indicate flag-level associations with data on your service. If you don't have any flag-level associations or configurations, you don't need to use this capability. Read more about custom properties in [our documentation](https://docs.launchdarkly.com/home/advanced/custom-properties). +Custom properties allow you to store data in LaunchDarkly alongside a feature flag. For example, you can use custom properties to indicate flag-level associations with data on your service. If you don't have any flag-level associations or configurations, you don't need to use this capability. + +To learn more, read [Custom properties](https://docs.launchdarkly.com/home/advanced/custom-properties). -By default, users need to specify a custom property name and key when attaching the custom property value to a feature flag. This step adds a bit of friction to using custom properties and introduces the opportunity for user error. As a result, developers can _reserve_ a custom property for their integration which makes it much easier for users to correctly add the property's value to feature flags. +By default, users must specify a custom property name and key when they attach the custom property value to a feature flag. This step introduces the possibility of user error. To prevent this, developers can _reserve_ a custom property for their integration, which makes it much easier for users to correctly add the property's value to feature flags. -Reserved custom properties are simple to define -- they require a `name` and `key`. That's all. +Reserved custom properties are simple to define. Their only requirements are a `name` and `key`. -Once your integration is configured by a user, the custom property will start appearing in the dropdown on the flag settings page. +After your integration is configured by a user, the custom property starts appearing in the dropdown on the flag's Settings page. diff --git a/docs/form-variables.md b/docs/form-variables.md index 5685dc82..7069ed34 100644 --- a/docs/form-variables.md +++ b/docs/form-variables.md @@ -1,9 +1,9 @@ # Form variables -Most integrations will need to collect one or more pieces of configuration data -that supports the integration. Some examples include API tokens or webhook endpoints. +Most integrations need to collect one or more pieces of configuration data +that supports the integration, such as API tokens or webhook endpoints. -To support these configurations, you can describe a set of +To support these configurations, describe a set of `formVariables` that define these configuration properties. Here's an example: @@ -27,18 +27,18 @@ Here's an example: ], ``` -The `formVariables` entry above will yield the following UI inside of the [LaunchDarkly Integrations +The `formVariables` entry above displays as the following UI in the [LaunchDarkly Integrations page](https://app.launchdarkly.com/default/integrations): ![Example configuration form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) -Form variables apply to the entire integration configuration. There are no capability-specific form variables at this time. +Form variables apply to the entire integration configuration. There are no capability-specific form variables. The `formVariables[].description` will be used as a field label on the UI. You can use simple markdown to link a word or phrase to an external URL. -Accepted form variable `type`s are `string`, `boolean`, `uri`, and `enum`. -You may optionally set `isSecret` or `isOptional` as appropriate or provide guidance with `placeholder` and `defaultValue`. +Accepted form variable types are `string`, `boolean`, `uri`, and `enum`. +Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. -Refer to the [manifest schema](../manifest.schema.json) for more information. +To learn more, read the [manifest schema](../manifest.schema.json). diff --git a/docs/getting-started.md b/docs/getting-started.md index 1f9f5395..97547098 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -2,75 +2,84 @@ There are several steps to building an integration with LaunchDarkly. -## Step 0: Replicate your desired behavior with `curl` +## Prerequisites -Prior to connecting LaunchDarkly with a third-party service, you should replicate your integration's desired behavior in an isolated environment (standalone from LaunchDarkly). The easiest way to do this is by using [`curl`](https://curl.haxx.se/docs/manpage.html). A lot of API documentation has `curl` example commands provided for developers to use. Find the API documentation for your third-party service and execute sample commands against it. Take note of the request semantics. This will help streamline your manifest and template definitions. +Before you connect LaunchDarkly with a third-party service, replicate your integration's desired behavior in an isolated standalone environment separate from LaunchDarkly. -## Step 1: Fork this Repository +The easiest way to do this is to use [`curl`](https://curl.haxx.se/docs/manpage.html). Find the API documentation for your third-party service and execute sample commands against it. A lot of API documentation has `curl` example commands provided for developers to use. -You will need to fork this repository to your own GitHub account. When you've -completed your integration, you can [submit a pull request to -LaunchDarkly](#step-8-submit-your-integration) for it to get approved and -deployed. +When you execute your sample commands, observe the request semantics. This helps streamline your manifest and template definitions. + +## Step 1: Fork this repository + +Fork this repository to your own GitHub account. + +After you finish building your integration, you can submit a pull request to LaunchDarkly to have it approved and deployed. + +To learn more about submitting a pull request, read [Step 8: Submit your integration](#step-8-submit-your-integration). ## Step 2: Create a new directory inside `./integrations` -Create a new directory inside the [integrations](../integrations) directory named -after your organization or integration's name (e.g., `example-dot-com`). Make -sure the directory has no spaces and uses +Create a new directory inside the [integrations](../integrations) directory. Name it +after your organization or give it the integration's name (For example, `your-company-name-dot-com`). + +The directory name must not have any spaces and must use [kebab-casing](https://wiki.c2.com/?KebabCase). -You should only change files and directories inside your new directory. Our -validation process will reject any pull requests that attempt to modify content -outside of your directory. +Only change files and directories inside your new directory. Our validation process rejects any pull requests with modified content outside of your directory. ## Step 3: Create your integration manifest -Each integration contains a manifest defining how basics about your integration and organization, -and instructing how LaunchDarkly should interact with your integration. Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. +Each integration contains a manifest defining basic concepts about your integration and organization. Manifests also instruct LaunchDarkly in how to interact with your integration. -[Read more](manifest.md). +Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. It's important to configure your manifest correctly. + +To learn more, read [Integration manifest](manifest.md). ## Step 4: Collect integration configuration data from LaunchDarkly users -Most integrations will need to collect one or more pieces of configuration data -that supports the integration. Some examples include API tokens or webhook endpoints. +Most integrations need to collect one or more pieces of configuration data +that support the integration (for example, API tokens or webhook endpoints). -To support these configurations, you can describe a set of -`formVariables` that define these configuration properties. +You can describe a set of `formVariables` that define these configuration properties. -[Read more](form-variables.md). +To learn more, read [Form variables](form-variables.md). ## Step 5: Define your integration's capabilities -The third part of defining your LaunchDarkly integration is describing its -`capabilities`. Your integration's `capabilities` describe how it interacts with LaunchDarkly. +The next step to define your LaunchDarkly integration is describing its +`capabilities`. Your integration's `capabilities` are how it interacts with LaunchDarkly. -[Read more](capabilities.md). +To learn more, read [Capabilities](capabilities.md). ## Step 6: Validate your integration -Run `npm install` to install the validation dependencies. Run `npm test` to run the validation suite. In addition, we -recommend install [pre-commit](https://pre-commit.com/#install) hooks with `pre-commit install` to have the validation suite run before every commit. +To validate your integration: + +1. Run `npm install` to install the validation dependencies. +2. Run `npm test` to run the validation suite. + +Additionally, we +recommend you install [pre-commit hooks](https://pre-commit.com/#install) with `pre-commit install`. This will make the validation suite run before every commit, saving you time if you need to troubleshoot anything. -Additionally, some of the capabilities have their own validation tools. Refer to the [capabilities documentation](capabilities.md) for more information. +Some of the capabilities have their own validation tools. To learn more, read [Capabilities](capabilities.md). ## Step 7: Create your user documentation and README -Now that your integration is built and validated, you'll want to provide documentation -- -both for users and integration maintainers. +Now that your integration is built and validated, you must provide documentation for users and integration maintainers. -LaunchDarkly's user documentation is accessible on [docs.launchdarkly.com](https://docs.launchdarkly.com/integrations). Third-party contributions can be submitted to our [LaunchDarkly-Docs repository](https://github.com/launchdarkly/LaunchDarkly-Docs). You'll want to submit a pull request to this repository with a new integrations guide. Follow the pattern and language used by existing integration guides. +Find LaunchDarkly's user documentation at [docs.launchdarkly.com](https://docs.launchdarkly.com/integrations). You can submit new docs to the [LaunchDarkly-Docs repository](https://github.com/launchdarkly/LaunchDarkly-Docs). -In addition to user documentation, you'll want to provide guidance on how to maintain and test your integration. You should specify this developer-focused information in an integration README (`README.md`) in your integration's directory. Additionally -the README should link to your user documentation worked mentioned above. +Submit a pull request to this repository with a new integrations guide. Follow the pattern and language used by existing integration guides. + +In addition to user documentation, you must to provide guidance on how to maintain and test your integration. Specify this developer-focused information in an integration README (`README.md`) in your integration's directory. The README should also link to the user documentation you provide. ## Step 8: Submit your integration -Once you're done with your integration, [submit a pull request against this -repo](https://github.com/launchdarkly/integration-framework/pull/new/master). Your -branch will run through some automated validations and will be reviewed by -our team. Once everything checks out, we'll publish your integration -when you give us the green light. +After you've built your integration, [submit a pull request against this +repo](https://github.com/launchdarkly/integration-framework/pull/new/master). + +When you do, your branch will run through some automated validations and be reviewed by +our team. If we're ready to publish your integration, we'll get your permission and make it live on our site. -We'll also work with you on submitting and approving your user documentation to our [LaunchDarkly-Docs repository](https://github.com/launchdarkly/LaunchDarkly-Docs). +We'll also work with you on submitting your user documentation to our [documentation site](https://github.com/launchdarkly/LaunchDarkly-Docs). diff --git a/docs/manifest.md b/docs/manifest.md index 33afbebb..53f08527 100644 --- a/docs/manifest.md +++ b/docs/manifest.md @@ -1,31 +1,35 @@ # Integration manifest -Each integration contains a manifest defining the basics about your integration and organization, -and instructing how LaunchDarkly should interact with your service. Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. +Each integration contains a manifest defining basic concepts about your integration and organization. Manifests also instruct LaunchDarkly in how to interact with your integration. + +Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. It's important to configure your manifest correctly. ## Introduction Create an empty -`manifest.json` file inside your new directory. The `manifest.json` file will describe your -integration's information and capabilities. +`manifest.json` file inside your new directory. You will use the `manifest.json` to describe your +integration's details and capabilities. The properties of LaunchDarkly's integration manifests are defined through a [JSON schema](../manifest.schema.json). Many IDEs can provide you inline help and validation while editing your -manifest. To enable this you can register the JSON -schema in your IDE. If you use -[VSCode](https://code.visualstudio.com/), VSCode will detect the settings in -this repository and apply the schema validation without any additional +manifest. You can register the JSON +schema in your IDE to enable this kind of help. + +If you use [VSCode](https://code.visualstudio.com/), it detects the settings in +this repository and aplies the schema validation without any additional configuration. ![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) -## Basics +## Getting started The first part of the manifest describes your organization, contacts, URLs, and -a few things we need to list your integration properly. We will use most of this -information when rendering your integration card and configuration form -inside the LaunchDarkly UI. +a few items LaunchDarkly needs to list your integration properly. + +We use most of this +information when we render your integration card and configuration form +in the LaunchDarkly UI. ```json { @@ -51,16 +55,19 @@ inside the LaunchDarkly UI. There are a few properties in the manifest that can accept simple [markdown](https://daringfireball.net/projects/markdown/). One of them is the `description`. -This markdown format will get converted to HTML in LaunchDarkly's UI. Only use -simple markdown structures like links and basic text formatting. -Notice that the `icons` described above are in SVG format. This is intentional. Your organization's (or -integration's) logo will be used in the LaunchDarkly UI but also inside a public +LaunchDarkly's UI converts markdown to HTML. To get the best results, only use +simple markdown, like links and basic text formatting. + +Notice that the `icons` described above are in SVG format. This is intentional. We do not accept other image formats. + +We use your organization's or +integration's logo in the LaunchDarkly UI and a public facing integrations listing on [launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG -files allow your logo to scale nicely on different devices. We do not accept other image formats. -In order for your logos to look great wherever we use them in LaunchDarkly, make sure your -SVG logos don't have any padding around the logo. +files allow your logo to scale nicely on different devices. +To make sure your logo appears correctly everywhere we use it, make sure that your +SVG logos don't have any padding around the image. Also, notice that the `icon.square` and `icon.horizontal` properties point to relative paths. These paths are relative to your integration's directory. You are @@ -68,7 +75,7 @@ free to create any directories and files that support your integration. ## Form variables and capabilities -Form variables and capabilities make up the most important part of the manifest as they +Form variables and capabilities are the most important part of the manifest. They define the primary interactions that LaunchDarkly and users will have with your integration. Read more about [form variables](form-variables.md) and [capabilities](capabilities.md). From be47a10498dec7e7832a44648361beeb2b11c4e6 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 14 May 2020 09:30:41 -0700 Subject: [PATCH 277/936] add merge-to-public script (#101) --- scripts/merge_to_public.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 scripts/merge_to_public.sh diff --git a/scripts/merge_to_public.sh b/scripts/merge_to_public.sh new file mode 100755 index 00000000..717f1157 --- /dev/null +++ b/scripts/merge_to_public.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# +# This script merges forward from the private mirror to the public one, +# one master branch to the other while squashing commits. +# +# Usage: ./merge_to_public.sh +# + +COMMIT_MSG=${1:-Releasing changes publicly} + +echo "Merging to the public mirror with message: ${COMMIT_MSG}" + +mkdir -p temp +git clone git@github.com:launchdarkly/integration-framework.git temp/repo +cd temp/repo +git remote add private git@github.com:launchdarkly/integration-framework-private.git +git checkout master +git fetch private +git merge private/master --squash +git commit -a -m "${1}" # Merge conflicts will need to be resolved manually +git push origin master + +cd ../.. +rm -rf temp From 08c32d1a8b1412ec55f9b7916abcb199f75d8fab Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 19 May 2020 17:48:24 +0100 Subject: [PATCH 278/936] Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers --- __tests__/validateIntegrationManifests.js | 3 +- docs/capabilities.md | 123 +++++++++--------- helpers/index.js | 6 + integrations/appdynamics/README.md | 12 +- integrations/appdynamics/manifest.json | 26 ++-- .../appdynamics/templates/template.json.hbs | 9 -- .../appdynamics/templates/template.text.hbs | 6 + 7 files changed, 97 insertions(+), 88 deletions(-) delete mode 100644 integrations/appdynamics/templates/template.json.hbs create mode 100644 integrations/appdynamics/templates/template.text.hbs diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index ea19334c..4a496d9d 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -9,7 +9,8 @@ const schema = require('../manifest.schema.json'); const flagContext = require('../sample-context/flag/update-all-environments'); const projectContext = require('../sample-context/project/update'); const environmentContext = require('../sample-context/environment/update'); -const OAUTH_INTEGRATIONS = ['sample-integration']; // add oauth integrations here + +const OAUTH_INTEGRATIONS = ['appdynamics', 'sample-integration']; // add oauth integrations here registerHelpers(); diff --git a/docs/capabilities.md b/docs/capabilities.md index becd27d0..f95e992a 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -4,8 +4,8 @@ Your integration's `capabilities` describe how it interacts with LaunchDarkly. We support two capabilities: -* [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`), and -* [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) +- [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`), and +- [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) ## Audit log events hook (`auditLogEventsHook`) @@ -116,58 +116,58 @@ sends you a default JSON payload that looks like this: ```json { - "_links": { - "canonical": { - "href": "/api/v2/flags/always-snippet/example-test", - "type": "application/json" - }, + "_links": { + "canonical": { + "href": "/api/v2/flags/always-snippet/example-test", + "type": "application/json" + }, + "parent": { + "href": "/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", + "type": "application/json" + }, + "site": { + "href": "/always-snippet/production/features/example-test", + "type": "text/html" + } + }, + "_id": "5defebd006121dd9f7ea90d0", + "_accountId": "", + "timestamp": { + "milliseconds": 1576004560130, + "seconds": 1576004560 + }, + "kind": "flag", + "name": "Example test", + "description": "", + "shortDescription": "", + "comment": "This is just a test", + "member": { + "_links": { "parent": { - "href": "/api/v2/auditlog", - "type": "application/json" + "href": "/api/v2/members", + "type": "application/json" }, "self": { - "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", - "type": "application/json" - }, - "site": { - "href": "/always-snippet/production/features/example-test", - "type": "text/html" + "href": "/api/v2/members/569f514183f2164430000002", + "type": "application/json" } - }, - "_id": "5defebd006121dd9f7ea90d0", - "_accountId": "", - "timestamp": { - "milliseconds": 1576004560130, - "seconds": 1576004560, - }, - "kind": "flag", - "name": "Example test", - "description": "", - "shortDescription": "", - "comment": "This is just a test", - "member": { - "_links": { - "parent": { - "href": "/api/v2/members", - "type": "application/json" - }, - "self": { - "href": "/api/v2/members/569f514183f2164430000002", - "type": "application/json" - } - }, - "_id": "569f514183f2164430000002", - "email": "testing@example.com", - "firstName": "Henry", - "lastName": "Barrow" - }, - "titleVerb": "", - "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", - "title": "Henrietta Powell turned on the flag Example test in 'Production'", - "target": { - "_links": null, - "name": "" - } + }, + "_id": "569f514183f2164430000002", + "email": "testing@example.com", + "firstName": "Henry", + "lastName": "Barrow" + }, + "titleVerb": "", + "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", + "title": "Henrietta Powell turned on the flag Example test in 'Production'", + "target": { + "_links": null, + "name": "" + } } ``` @@ -184,17 +184,22 @@ your template. To learn more about Handlebars' sysntax, read [Handlebars' Language Guide](https://handlebarsjs.com/guide/). -In addition to the basic language syntax, we also support the following [built-in -helpers](https://github.com/aymerick/raymond#built-in-helpers): +In addition to the basic language syntax, we support the following [built-in +helpers](https://handlebarsjs.com/guide/builtin-helpers.html): + +- `if` +- `unless` +- `each` +- `with` +- `lookup` + +Furthermore, the following custom helpers are supported: -* `if` -* `unless` -* `each` -* `with` -* `lookup` -* `equal` +- `equal` - renders a block if the string version of both arguments are equals +- `pathEncode` - URL path encodes the string version of the argument +- `queryEncode` - URL query encodes the string version of the argument -To test your templates, you can use the [Handlebars +To test your templates, you can run `npm run preview $INTEGRATION_NAME` or use the [Handlebars Sandbox](http://tryhandlebarsjs.com/). ### Default policy diff --git a/helpers/index.js b/helpers/index.js index 576bdb3d..75482f59 100644 --- a/helpers/index.js +++ b/helpers/index.js @@ -7,6 +7,12 @@ const registerHelpers = () => { } return options.inverse(this); }); + Handlebars.registerHelper('pathEncode', function (v) { + return encodeURI(v); + }); + Handlebars.registerHelper('queryEncode', function (v) { + return encodeURIComponent(v); + }); }; module.exports = { registerHelpers }; diff --git a/integrations/appdynamics/README.md b/integrations/appdynamics/README.md index 022a34ff..a4486839 100644 --- a/integrations/appdynamics/README.md +++ b/integrations/appdynamics/README.md @@ -2,6 +2,16 @@ [User documentation](https://example.com) -[API documentation](https://example.com) +1. Create a new OAuth API client within AppDynamics following the documentation outlined [here](https://docs.appdynamics.com/display/PRO45/API+Clients). Your client will need the **Create Events** permission. + +2. Navigate the the integrations page within LaunchDarkly and configure new AppDynamics integration. You will be prompted to connect via OAuth. At this point, input you will be prompted to enter your **base URL**, **client_id**, and **client_secret**. + +- **base URL**: something like https://launchdarkly-nfr.saas.appdynamics.com +- **client_id**: this will be your AppDynamics account name and name of your newly created API client in the format: `@` +- **client_secret**: This will be the secret generated in step 1. + +[API documentation](https://docs.appdynamics.com/display/PRO45/Events+and+Action+Suppression+API) + +App dynamics requires the client credentials OAuth 2.0 flow and event information be sent as query parameters. Ensure all query parameters utilize the `queryEncode` helper to avoid 400s. Run `npm run curl appdynamics` in the root repository directory to generate a `curl` command to send data to AppDynamics. diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index b0767d23..2b6551b0 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -14,6 +14,7 @@ "square": "assets/images/appdynamics_square.svg", "horizontal": "assets/images/appdynamics_horizontal.svg" }, + "requiresOAuth": true, "formVariables": [ { "key": "account", @@ -23,38 +24,27 @@ "isSecret": false }, { - "key": "username", - "name": "AppDynamics account username", - "description": "Enter your [AppDynamics username](https://docs.appdynamics.com/display/PRO45/API+Clients).", + "key": "applicationID", + "name": "Application Name", + "description": "Enter your AppDynamics application name or ID", "type": "string", "isSecret": false - }, - { - "key": "password", - "name": "AppDynamics account password", - "description": "Enter your [AppDynamics user password](https://docs.appdynamics.com/display/PRO45/API+Clients).", - "type": "string", - "isSecret": true } ], "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "http://{{account}}.saas.appdynamics.com/controller/rest/applications/5/events?", + "url": "{{oauth.baseURI}}/controller/rest/applications/{{pathEncode applicationID}}/events?summary={{queryEncode 'LaunchDarkly: '}}{{queryEncode context.title.html}}{{#if context.details.html}}%0D%0A{{queryEncode context.details.html}}{{/if}}{{#if context.comment}}&comment={{queryEncode context.comment}}{{/if}}&eventtype=CUSTOM&customeventtype=LaunchDarkly&severity=INFO", "method": "POST", "headers": [ { - "name": "user", - "value": "{{username}}@{{account}}:{{password}}" - }, - { - "name": "Content-Type", - "value": "application/json" + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" } ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.text.hbs" }, "defaultPolicy": [ { diff --git a/integrations/appdynamics/templates/template.json.hbs b/integrations/appdynamics/templates/template.json.hbs deleted file mode 100644 index 3042080c..00000000 --- a/integrations/appdynamics/templates/template.json.hbs +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "application_id": "LaunchDarkly", - "summary": "{{title.plainText}}", - "comment": "{{#if comment}}{{comment}}{{/if}}", - "eventtype": "APPLICATION_DEPLOYMENT", - "severity": "INFO" - } -] diff --git a/integrations/appdynamics/templates/template.text.hbs b/integrations/appdynamics/templates/template.text.hbs new file mode 100644 index 00000000..b232a6c7 --- /dev/null +++ b/integrations/appdynamics/templates/template.text.hbs @@ -0,0 +1,6 @@ +{{! +AppDynamics uses query parameters instead of a POST body. +In this case, a dummy template is used because the integrations-framework is configured +to not send events for empty templates. +}} +dummy From 4afcb93981ad3bddd4adbf85e2ea2983d4791610 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 21 May 2020 17:01:32 +0100 Subject: [PATCH 279/936] Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum --- integrations/datadog/manifest.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 0a401646..13a35de9 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -21,6 +21,17 @@ "type": "string", "description": "Enter your Datadog [API key](https://app.datadoghq.com/account/settings#api).", "isSecret": true + }, + { + "key": "hostURL", + "name": "Datadog host URL", + "description": "Your Datadog host URL. The default host URL is [https://api.datadoghq.com](https://api.datadoghq.com). Use [https://api.datadoghq.eu](https://api.datadoghq.eu) if you are on the Datadog EU site.", + "type": "enum", + "allowedValues": [ + "https://api.datadoghq.com", + "https://api.datadoghq.eu" + ], + "defaultValue": "https://api.datadoghq.com" } ], "capabilities": { @@ -32,7 +43,7 @@ ], "auditLogEventsHook": { "endpoint": { - "url": "https://api.datadoghq.com/api/v1/events", + "url": "{{hostURL}}/api/v1/events", "method": "POST", "headers": [ { From c917d302d7b27105d6b7a8bd6857cf32bc899d87 Mon Sep 17 00:00:00 2001 From: Aaron Aldrich Date: Thu, 21 May 2020 14:55:09 -0400 Subject: [PATCH 280/936] Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates --- integrations/datadog/templates/default.json.hbs | 2 +- integrations/datadog/templates/environment.json.hbs | 2 +- integrations/datadog/templates/project.json.hbs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/datadog/templates/default.json.hbs b/integrations/datadog/templates/default.json.hbs index adcffe14..79806a2e 100644 --- a/integrations/datadog/templates/default.json.hbs +++ b/integrations/datadog/templates/default.json.hbs @@ -1,6 +1,6 @@ { "title": "{{{title.plainText}}}", - "text": "{{#if details.plainText}}{{{details.plainText}}}{{#if comment}}\n{{/if}}{{/if}}{{#if comment}}comment: {{comment}}{{/if}}", + "text": "%%% \n {{{title.markdown}}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", "date_happened": {{timestamp.seconds}}, "tags": [ {{#if customProperties}} diff --git a/integrations/datadog/templates/environment.json.hbs b/integrations/datadog/templates/environment.json.hbs index b493485c..ce26fde9 100644 --- a/integrations/datadog/templates/environment.json.hbs +++ b/integrations/datadog/templates/environment.json.hbs @@ -1,6 +1,6 @@ { "title": "{{{title.plainText}}}", - "text": "{{#if details.plainText}}{{{details.plainText}}}{{#if comment}}\n{{/if}}{{/if}}{{#if comment}}comment: {{comment}}{{/if}}", + "text": "%%% \n {{{title.markdown}}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", "date_happened": {{timestamp.seconds}}, "tags": [ {{#if customProperties}} diff --git a/integrations/datadog/templates/project.json.hbs b/integrations/datadog/templates/project.json.hbs index 4f0f2745..5a746e06 100644 --- a/integrations/datadog/templates/project.json.hbs +++ b/integrations/datadog/templates/project.json.hbs @@ -1,6 +1,6 @@ { "title": "{{{title.plainText}}}", - "text": "{{#if details.plainText}}{{{details.plainText}}}{{#if comment}}\n{{/if}}{{/if}}{{#if comment}}comment: {{comment}}{{/if}}", + "text": "%%% \n {{{title.markdown}}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", "date_happened": {{timestamp.seconds}}, "tags": [ {{#if customProperties}} From e3ebdb07b4309f640fb37d2f9a5704e5cfb9c075 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 22 May 2020 15:53:13 +0100 Subject: [PATCH 281/936] Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich --- .circleci/config.yml | 5 +- .github/ISSUE_TEMPLATE/bug_report.md | 31 ++ .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/pull_request_template.md | 23 ++ LICENSE | 13 + README.md | 375 +----------------- __tests__/validateIntegrationManifests.js | 47 ++- docs/capabilities.md | 242 +++++++++++ docs/form-variables.md | 44 ++ docs/getting-started.md | 85 ++++ docs/manifest.md | 81 ++++ helpers/index.js | 6 + integrations/appdynamics/README.md | 12 +- integrations/appdynamics/manifest.json | 26 +- .../appdynamics/templates/template.json.hbs | 9 - .../appdynamics/templates/template.text.hbs | 6 + integrations/datadog/manifest.json | 13 +- .../datadog/templates/default.json.hbs | 2 +- .../datadog/templates/environment.json.hbs | 2 +- .../datadog/templates/project.json.hbs | 2 +- integrations/sample-integration/manifest.json | 1 + integrations/sentry/README.md | 9 - .../sentry/assets/images/sentry-banner.svg | 3 - integrations/sentry/assets/images/sentry.svg | 3 - integrations/sentry/manifest.json | 68 ---- .../sentry/templates/template.json.hbs | 31 -- manifest.schema.json | 15 +- package-lock.json | 2 +- package.json | 8 +- preview.js | 13 + schemas/base.json | 12 +- schemas/capabilities/auditLogEventsHook.json | 2 +- scripts/merge_to_public.sh | 24 ++ 33 files changed, 718 insertions(+), 517 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/pull_request_template.md create mode 100644 LICENSE create mode 100644 docs/capabilities.md create mode 100644 docs/form-variables.md create mode 100644 docs/getting-started.md create mode 100644 docs/manifest.md delete mode 100644 integrations/appdynamics/templates/template.json.hbs create mode 100644 integrations/appdynamics/templates/template.text.hbs delete mode 100644 integrations/sentry/README.md delete mode 100644 integrations/sentry/assets/images/sentry-banner.svg delete mode 100644 integrations/sentry/assets/images/sentry.svg delete mode 100644 integrations/sentry/manifest.json delete mode 100644 integrations/sentry/templates/template.json.hbs create mode 100755 scripts/merge_to_public.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 602c05c3..47b96530 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -37,7 +37,10 @@ jobs: - aws-cli/install - run: name: Deploy to s3 bucket - command: ./scripts/copy_to_s3.sh + command: | + if [ "$CIRCLE_REPOSITORY_URL" = "git@github.com:launchdarkly/integration-framework-private.git" ]; then + ./scripts/copy_to_s3.sh + fi environment: BUCKET_NAME: << parameters.bucket-name >> diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..2ef50036 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Is this a support request?** +This issue tracker is maintained by the LaunchDarkly integration team and is intended for feedback on the integration platform and integrations. If you're not sure whether the problem you are having is specifically related to the platform and integrations, or to the LaunchDarkly service overall, it may be more appropriate to contact the LaunchDarkly support team; they can help to investigate the problem and will consult the integration team if necessary. You can submit a support request by going [here](https://support.launchdarkly.com/) and clicking "submit a request", or by emailing support@launchdarkly.com. + +Note that issues filed on this issue tracker are publicly accessible. Do not provide any private account information on your issues. If your problem is specific to your account, you should submit a support request as described above. + +**Describe the bug** +A clear and concise description of what the bug is. + +**To reproduce** +Steps to reproduce the behavior. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Logs** +If applicable, add any log output related to your problem. + +**Integration** +The integration that you are using. + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..533b5a7a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I would love to see the integration platform [...does something new...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context about the feature request here. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..166037ee --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,23 @@ +**Requirements** + +- [ ] I have followed the repository's [pull request submission guidelines](../blob/master/README.md#submitting-pull-requests) +- [ ] I have updated my user documentation +- [ ] I have updated my developer documentation (my integration README) + +**Related issues** + +Provide links to any issues in this repository or elsewhere relating to this pull request. + +**Describe the solution you've provided** + +If you're adding a new integration, provide some context into how LaunchDarkly and the third-party service should interact. + +If you're modifying an existing integration, provide a clear and concise description of what you expect to happen. + +**Describe alternatives you've considered** + +If you're modifying an existing integration, provide a clear and concise description of any alternative solutions or features you've considered. + +**Additional context** + +Add any other context about the pull request here. diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..f711cb7d --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic, Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README.md b/README.md index bc3f09b2..d29c19af 100644 --- a/README.md +++ b/README.md @@ -1,374 +1,35 @@ -# LaunchDarkly integrations +# LaunchDarkly Integration Framework -[![CircleCI](https://circleci.com/gh/launchdarkly/ld-integrations.svg?style=svg&circle-token=c12dfaa51d070b8bbc8dea0c0adf4c402b5b9123)](https://circleci.com/gh/launchdarkly/ld-integrations) +[![CircleCI](https://circleci.com/gh/launchdarkly/integration-framework.svg?style=svg&circle-token=9a44436c3b22e7fb6a22df1ad9a2455a0d6f2d34)](https://circleci.com/gh/launchdarkly/integration-framework) -Feature flags not only provide you control over your deployment and rollout but -also provides context to other related systems -- giving your team visibility -into how your services react due to changes to flags. This repository contains +Feature flags give you control over your deployment and rollout, but that's not all they do. They also provide context to other related systems, giving your team visibility into how your services react due to flag changes. + +This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly to provide their users with more context. -## Getting started - -There are several steps to creating an integration with LaunchDarkly. - -### Step 0: Replicate your desired behavior with `curl` - -Prior to connecting LaunchDarkly with a third-party service, you should replicate your integration's desired behavior in an isolated environment (standalone from LaunchDarkly). The easiest way to do this is by using [`curl`](https://curl.haxx.se/docs/manpage.html). A lot of API documentation has `curl` example commands provided for developers to use. Find the API documentation for your third-party service and execute sample commands against it. Take note of the request semantics. This will help streamline your manifest and template definitions. - -### Step 1: Fork this Repository - -You will need to fork this repository to your own GitHub account. When you've -completed your integration, you can [submit a pull request to -LaunchDarkly](#step-7-submitting-your-integration) for it to get approved and -deployed. - -### Step 2: Create a new directory inside `./integrations` - -Create a new directory inside the [integrations](./integrations) directory named -after your organization or integration's name (e.g., `example-dot-com`). Make -sure the directory has no spaces and uses -[kebab-casing](https://wiki.c2.com/?KebabCase). - -You should only change files and directories inside your new directory. Our -validation process will reject any pull requests that attempt to modify content -outside of your directory. - -### Step 3: Create your integration manifest - -Create an empty -[`manifest.json`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#launchdarkly-integrations-manifest-properties) -file inside your new directory. The `manifest.json` file will describe your -integration's information and capabilities. - -The properties of LaunchDarkly's integration manifest are defined through a -[JSON schema](./manifest.schema.json) and has a [corresponding schema -documentation](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md). -Many IDEs can provide you inline help and validation while editing your -manifest. To enable this you can register the [JSON -schema](./manifest.schema.json) in your IDE. If you use -[VSCode](https://code.visualstudio.com/), VSCode will detect the settings in -this repository and apply the schema validation without any additional -configuration. - -![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) - -### Step 4: Describe your integration's basic information inside the manifest - -The first part of the manifest describes your organization, contacts, URLs, and -a few things we need to list your integration properly: - -``` -{ - "name": "Sample Integration", - "version": "1.0.0", - "overview": "Short one-liner describing your integration", - "description": "Send flag data to space. Markdown based description.", - "author": "Example Dot Com", - "supportEmail": "support@example.com", - "links": { - "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" - }, - "categories": ["apm", "monitoring", "alerts"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - ... -} -``` - -The example above describes the basic information about your integration. We -will use most of the information above when rendering your integration -configuration form inside the LaunchDarkly UI. - -There are a few properties in the manifest that can accept simple -[markdown](https://daringfireball.net/projects/markdown/). One of them is the -[`description`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#description). -This markdown format will get converted to HTML in LaunchDarkly's UI. Only use -simple markdown structures like links and basic text formatting. - -Notice that the -[`icons`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#icons) -described above are in SVG format. This is intentional. Your organization's (or -integration's) logo will be used in the LaunchDarkly UI but also inside a public -facing integrations listing on -[launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG -files allow your logo to scale nicely on different devices. We do not accept -other image formats. - -Also, notice that the `icon.square` and `icon.horizontal` properties point to a -relative path. This path is relative to your integration's directory. You are -free to create any directories and files that support your integration. - -You can also create a `README.md` inside your integration's directory that -provides additional information about your integration. If provided, we may use -your `README.md` as documentation to your integration. - -### Step 5: Collecting integration configuration data from LaunchDarkly users - -Most integrations will need to collect one or more pieces of configuration data -that supports the integration. Some examples include: - -- API token -- Webhook endpoint -- URLs - -To support these configurations, you can describe a set of -[`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) -that define these configuration properties. Here's an example: - -``` -{ - ... - "formVariables": [ - { - "key": "endpointUrl", - "name": "Webhook endpoint URL", - "description": "Enter the URL to the webhook endpoint", - "default": "https://example.com/inbound_webhook", - "type": "url", - "isSecret": false - }, - { - "key": "apiToken", - "name": "API Key", - "description": "Enter your [API key](https://example.com/api) here", - "type": "string", - "isSecret": true - } - ], - ... -} -``` - -The -[`formVariables`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#formvariables) -entry above will yield the following UI inside of the [LaunchDarkly Integration -page](https://app.launchdarkly.com/default/integrations): - -![Example configuration -form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) - -The `formVariables[].description` will be used as a field label on the UI. You -can use simple markdown to link a word or phrase to an external URL. - -### Step 6: Define your integration's capabilities - -The third part of defining your LaunchDarkly integration is describing its -[capabilities](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#capabilities). - -As of today, we support only one capability, [Audit Log Event -Hook](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook). -An Audit Log Event Hook is a webhook that's sent by LaunchDarkly whenever an -event happens inside of LaunchDarkly. This capability can be used to trigger an -event in another service. - -Here's an example of an Audit Log Event Hook capability that subscribes to flag -events in a LaunchDarkly account: - -``` -{ - ... - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "{{endpointUrl}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, - "templates": { - "flag": "templates/flag.json" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } - ... -} -``` - -The -[`auditLogEventsHook`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#auditlogeventshook) -has three properties: - -1. [`endpoint`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#endpoint): - Describes the HTTP handler that will receive the webhook. In the example - above, you'll notice that a few of the properties (`endpoint.url` and - `endpoint.headers[].value`) will accept template variables. These template - variables can reference any `formVariables` you've defined in your manifest. - The templating language we use is based off of - [Handlebars](https://handlebarsjs.com/) syntax. -2. [`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates): - A map of template paths relative to your integration's directory. These - templates can be any file type. -3. [`defaultPolicy`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#defaultpolicy): - An array of [LaunchDarkly - policies](https://docs.launchdarkly.com/docs/policies-in-custom-roles) that - act as a filter for which events to send to your webhook endpoint. These - policies can be overriden by users subscribing to your integration. We recommend the following default policy which specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects: - -```json - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] -``` - -#### Endpoint template variables - -There are a few properties that allow template variables to be substituted at -runtime. The main ones are the `endpoint.url` and the -`endpoint.headers[].value`. This will allow you to configure a dynamic endpoint -based on the `formVariables` your integration collects from the user. Here are -some examples: - -``` -This first example will utilize the `endpointUrl` formVariable as the URL of the endpoint and use the `apiToken` as a `Bearer` token in the `Authorization` header. -... - "endpoint": { - "url": "{{endpointUrl}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, -... - -This next example uses the `apiToken` formVariable as a query parameter on the URL. -... - "endpoint": { - "url": "https://example.com/apiToken?={{apiToken}}", - "method": "POST" - }, -... - -``` - -#### Template files +LaunchDarkly's integration framework lets you build one-way integrations from LaunchDarkly to a third party service. We support a small subset of actions that let you subscribe to LaunchDarkly events to trigger an action or event in your service. You can think of this capability as a webhook, with the added convenience of not having to write your own service to manage the integration. LaunchDarkly manages the configuration, authentication, and transformation of our events to what your service expects without having to create an intermediary service. -Before the `auditLogEventsHook` capability sends the request to the endpoint -handling your webhook, you have the option to transform the body of the request -sent to your handler. If you don't provide one or more templates, LaunchDarkly -will send you a default JSON payload that looks like this: +## Building your own integrations -``` -{ - "_links": { - "canonical": { - "href": "/api/v2/flags/always-snippet/example-test", - "type": "application/json" - }, - "parent": { - "href": "/api/v2/auditlog", - "type": "application/json" - }, - "self": { - "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", - "type": "application/json" - }, - "site": { - "href": "/always-snippet/production/features/example-test", - "type": "text/html" - } - }, - "_id": "5defebd006121dd9f7ea90d0", - "_accountId": "", - "timestamp": { - "milliseconds": 1576004560130, - "seconds": 1576004560, - }, - "kind": "flag", - "name": "Example test", - "description": "", - "shortDescription": "", - "comment": "This is just a test", - "member": { - "_links": { - "parent": { - "href": "/api/v2/members", - "type": "application/json" - }, - "self": { - "href": "/api/v2/members/569f514183f2164430000002", - "type": "application/json" - } - }, - "_id": "569f514183f2164430000002", - "email": "testing@example.com", - "firstName": "Henry", - "lastName": "Barrow" - }, - "titleVerb": "", - "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", - "title": "Henrietta Powell turned on the flag Example test in 'Production'", - "target": { - "_links": null, - "name": "" - } -} -``` +We've provided step-by-step instructions to help you build integrations. -However, if you choose to provide one or more -[`templates`](https://github.com/launchdarkly/ld-integrations/blob/master/MANIFEST.md#templates), -LaunchDarkly will render your template using the context data above. Your -template can be any text based format, but make sure you specify the appropriate -`Content-Type` header in your `endpoint.headers` property to match the content -type of your template body. +To learn more, read [Getting started](docs/getting-started.md). -We use basic [Handlerbars](https://handlebarsjs.com/) template syntax to render -your template. Check out [Handlebars' Language -Guide](https://handlebarsjs.com/guide/) for more information on its syntax. In -addition to the basic language syntax, we support the following [built-in -helpers](https://github.com/aymerick/raymond#built-in-helpers): `if`, `unless`, -`each`, `with`, `lookup`, and `equal`. +## The LaunchDarkly Technology Partner Program -To test your templates, you can use the [Handlebars -Sandbox](http://tryhandlebarsjs.com/). +Using the LaunchDarkly Integration Framework is just one way to create a relationship with LaunchDarkly. You can unlock even more benefits by joining our Technology Partner Program. -### Step 7: Validating your integration +To join the program, email us at [partnerships@launchdarkly.com](mailto:partnerships@launchdarkly.com). -Run `npm install` to install the validation dependencies. Run `npm test` to run the validation suite. In addition, we -recommend install pre-commit hooks with `pre-commit install` to have the validation suite run before every commit. +## Submitting bug reports and feature requests -Run `npm run preview YOUR_INTEGRATION_DIR_NAME` to preview your integration's templates with sample data. Alternatively run `npm run curl YOUR_INTEGRATION_DIR_NAME` to produce a sample `curl` command to send data with your integration's service. +The LaunchDarkly integration team monitors this repository's [issue tracker](https://github.com/launchdarkly/integration-framework/issues). We respond to all new issues within two business days. Use the issue tracker to file bug reports and feature requests specific to the platform and integrations. -### Step 8: Submitting your integration +If you want to reach out in private, email [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com). -Once you're done with your integration, [submit a pull request against this -repo](https://github.com/launchdarkly/ld-integrations/pull/new/master). Your -branch will run through some automated validations and will be reviewed by -someone on our team. Once everything checks out, we'll publish your integration -when you give us the green light. +## Submitting pull requests -## Comments, suggestions, bug reports? +We encourage pull requests and other contributions from the community. The integration team responds to all new pull requests within two business days. -Visit us in our Slack channel -[#ext-integrations](https://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQhttps://slack.com/share/IRL109MRU/5xRnR28csBsnn6zMDRlXHLAf/enQtODcwMDM0MzI3ODc4LWVkYzZkOTMwNGZkZGMxNjczYzdkNTMzMzE5M2ZmZjFiY2NkZjg3N2FlZjAwYWU1NjZkYzdhYzY1NzI5M2RiZjQ) -or log an issue or request -[here](https://github.com/launchdarkly/ld-integrations/issues). +Before you submit pull requests, make sure that all temporary or unintended code is removed. Don't worry about adding reviewers to the pull request; the LaunchDarkly integration team can add themselves. diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 99cf8940..4a496d9d 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -10,6 +10,8 @@ const flagContext = require('../sample-context/flag/update-all-environments'); const projectContext = require('../sample-context/project/update'); const environmentContext = require('../sample-context/environment/update'); +const OAUTH_INTEGRATIONS = ['appdynamics', 'sample-integration']; // add oauth integrations here + registerHelpers(); const getDirectories = source => @@ -40,6 +42,17 @@ const getFormVariableContext = formVariables => { return endpointContext; }; +const getOAuthContext = requiresOAuth => { + if (requiresOAuth) { + const oauthContext = { + baseURI: '$OAUTH_BASE_URI', + accessToken: '$OAUTH_ACCESS_TOKEN', + }; + return oauthContext; + } + return null; +}; + const isJSONTemplate = templateFilename => { const lowercase = templateFilename.toLowerCase(); return lowercase.endsWith('.json') || lowercase.endsWith('.json.hbs'); @@ -65,11 +78,13 @@ const getTemplate = path => { const getFullContext = (manifest, context, isJSON) => { const formVariables = _.get(manifest, 'formVariables', null); - const formVariableContext = getFormVariableContext(formVariables); + const requiresOAuth = _.get(manifest, 'requiresOAuth', null); + const endpointContext = getFormVariableContext(formVariables); + endpointContext.oauth = getOAuthContext(requiresOAuth); const fullContext = isJSON ? jsonEscape(Object.assign({}, context)) : Object.assign({}, context); - fullContext.formVariables = formVariableContext; + fullContext.formVariables = endpointContext; return fullContext; }; @@ -93,6 +108,7 @@ describe('All integrations', () => { 'Referenced form variables exist for %s', (key, manifest) => { const formVariables = _.get(manifest, 'formVariables', null); + const requiresOAuth = _.get(manifest, 'requiresOAuth', null); const endpoint = _.get( manifest, 'capabilities.auditLogEventsHook.endpoint', @@ -101,6 +117,7 @@ describe('All integrations', () => { if (endpoint) { const endpointContext = getFormVariableContext(formVariables); endpointContext.context = flagContext; + endpointContext.oauth = getOAuthContext(requiresOAuth); const urlTemplate = Handlebars.compile(endpoint.url, { strict: true, }); @@ -121,6 +138,18 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'OAuth parameters are correctly set and accessible for %s', + (key, manifest) => { + const requiresOAuth = _.get(manifest, 'requiresOAuth', null); + if (requiresOAuth) { + expect(OAUTH_INTEGRATIONS).toEqual(expect.arrayContaining([key])); + const oauthContext = getOAuthContext(requiresOAuth); + expect(oauthContext).not.toBe(null); + } + } + ); + test.each(manifests)( 'defaultValue types match the type of the formVariable for %s', (key, manifest) => { @@ -139,6 +168,20 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'no non-string formVariables have been set to isSecret for %s', + (key, manifest) => { + const formVariables = _.get(manifest, 'formVariables', null); + if (formVariables) { + formVariables.forEach(formVariable => { + if (formVariable.type != 'string') { + expect(formVariable.isSecret).not.toBe(true); + } + }); + } + } + ); + test.each(manifests)( 'Templates can be successfully rendered for %s', (key, manifest) => { diff --git a/docs/capabilities.md b/docs/capabilities.md new file mode 100644 index 00000000..f95e992a --- /dev/null +++ b/docs/capabilities.md @@ -0,0 +1,242 @@ +# Capabilities + +Your integration's `capabilities` describe how it interacts with LaunchDarkly. + +We support two capabilities: + +- [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`), and +- [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) + +## Audit log events hook (`auditLogEventsHook`) + +An audit log events hook is a webhook that LaunchDarkly sends whenever an +event happens inside of LaunchDarkly. Each of these events +result in an event being published to LaunchDarkly's audit log. +You can use this capability to send data to or trigger an event in another service. + +The `auditLogEventsHook` has three properties: + +1. [`endpoint`](#endpoint): + Describes the HTTP handler that will receive the webhook. +2. [`templates`](#templates): + A map of template paths relative to your integration's directory. You can use templates to transform the raw audit log events to a format that your integration expects. These templates can be any file type. +3. [`defaultPolicy`](#default-policy): + An array of [LaunchDarkly + policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) that + act as a filter determining which events to send to your webhook endpoint. + +Here's an example of an audit log events hook capability that subscribes to flag +events in a LaunchDarkly account: + +```json + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, + "templates": { + "flag": "templates/flag.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +``` + +### Endpoint + +Every `auditLogEventsHook` capability must specify the endpoint to which LaunchDarkly should send webhook data. This specification must include all appropriate request semantics including the URL, method, and headers. + +In the example +above, a few of the properties (`endpoint.url` and +`endpoint.headers[].value`) accept template variables. These template +variables can reference any `formVariables` you've defined in your manifest. +The templating language we use is based off of a subset of the +Handlebars syntax. + +To learn more, read [Handlebars' documentation](https://handlebarsjs.com/). + +There are a few properties that allow you to substitute template variables at +runtime. The main ones are the `endpoint.url` and the +`endpoint.headers[].value`. This lets you configure a dynamic endpoint +based on the `formVariables` your integration collects from the user. Examples follow. + +This example uses the `endpointUrl` form variable as the URL of the endpoint and the `apiToken` as a `Bearer` token in the `Authorization` header: + +```json + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, +``` + +This example uses the `apiToken` formVariable as a query parameter on the URL: + +```json + "endpoint": { + "url": "https://example.com/apiToken?={{apiToken}}", + "method": "POST" + }, +``` + +### Templates + +Before the `auditLogEventsHook` capability sends the request to the endpoint +handling your webhook, you can transform the body of the request +sent to your handler. + +If you don't provide one or more templates, LaunchDarkly +sends you a default JSON payload that looks like this: + +```json +{ + "_links": { + "canonical": { + "href": "/api/v2/flags/always-snippet/example-test", + "type": "application/json" + }, + "parent": { + "href": "/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", + "type": "application/json" + }, + "site": { + "href": "/always-snippet/production/features/example-test", + "type": "text/html" + } + }, + "_id": "5defebd006121dd9f7ea90d0", + "_accountId": "", + "timestamp": { + "milliseconds": 1576004560130, + "seconds": 1576004560 + }, + "kind": "flag", + "name": "Example test", + "description": "", + "shortDescription": "", + "comment": "This is just a test", + "member": { + "_links": { + "parent": { + "href": "/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@example.com", + "firstName": "Henry", + "lastName": "Barrow" + }, + "titleVerb": "", + "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", + "title": "Henrietta Powell turned on the flag Example test in 'Production'", + "target": { + "_links": null, + "name": "" + } +} +``` + +If you choose to provide one or more +`templates`, +LaunchDarkly renders your template using the context data above. Your +template can be any text based format, but you must specify the appropriate +`Content-Type` header in your `endpoint.headers` property to match the content +type of your template body. + +We use a basic subset of the Handlebars template syntax to render +your template. + +To learn more about Handlebars' sysntax, read [Handlebars' Language +Guide](https://handlebarsjs.com/guide/). + +In addition to the basic language syntax, we support the following [built-in +helpers](https://handlebarsjs.com/guide/builtin-helpers.html): + +- `if` +- `unless` +- `each` +- `with` +- `lookup` + +Furthermore, the following custom helpers are supported: + +- `equal` - renders a block if the string version of both arguments are equals +- `pathEncode` - URL path encodes the string version of the argument +- `queryEncode` - URL query encodes the string version of the argument + +To test your templates, you can run `npm run preview $INTEGRATION_NAME` or use the [Handlebars +Sandbox](http://tryhandlebarsjs.com/). + +### Default policy + +When you configure your integration, customers can specify an array of [LaunchDarkly +policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) filter which events to send to your webhook endpoint. + +To simplify onboarding your integration, you can specify a default policy which follows best practices for your integration's use case. + +Assuming your integration only cares about flag activity, we recommend the following default policy. This policy specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects. + +Here is the policy: + +```json + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] +``` + +### Validation + +To preview your integration's templates with sample data, run `npm run preview YOUR_INTEGRATION_DIR_NAME`. + +Alternatively, to produce a sample `curl` command, run `npm run curl YOUR_INTEGRATION_DIR_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. + +## Reserved custom properties (`reservedCustomProperties`) + +Custom properties allow you to store data in LaunchDarkly alongside a feature flag. For example, you can use custom properties to indicate flag-level associations with data on your service. If you don't have any flag-level associations or configurations, you don't need to use this capability. + +To learn more, read [Custom properties](https://docs.launchdarkly.com/home/advanced/custom-properties). + +By default, users must specify a custom property name and key when they attach the custom property value to a feature flag. This step introduces the possibility of user error. To prevent this, developers can _reserve_ a custom property for their integration, which makes it much easier for users to correctly add the property's value to feature flags. + +Reserved custom properties are simple to define. Their only requirements are a `name` and `key`. + +After your integration is configured by a user, the custom property starts appearing in the dropdown on the flag's Settings page. diff --git a/docs/form-variables.md b/docs/form-variables.md new file mode 100644 index 00000000..7069ed34 --- /dev/null +++ b/docs/form-variables.md @@ -0,0 +1,44 @@ +# Form variables + +Most integrations need to collect one or more pieces of configuration data +that supports the integration, such as API tokens or webhook endpoints. + +To support these configurations, describe a set of +`formVariables` that define these configuration properties. + +Here's an example: + +```json + "formVariables": [ + { + "key": "endpointUrl", + "name": "Webhook endpoint URL", + "description": "Enter the URL to the webhook endpoint", + "default": "https://example.com/inbound_webhook", + "type": "url" + }, + { + "key": "apiToken", + "name": "API Key", + "description": "Enter your [API key](https://example.com/api) here", + "type": "string", + "isSecret": true + } + ], +``` + +The `formVariables` entry above displays as the following UI in the [LaunchDarkly Integrations +page](https://app.launchdarkly.com/default/integrations): + +![Example configuration +form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) + +Form variables apply to the entire integration configuration. There are no capability-specific form variables. + +The `formVariables[].description` will be used as a field label on the UI. You +can use simple markdown to link a word or phrase to an external URL. + +Accepted form variable types are `string`, `boolean`, `uri`, and `enum`. +Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. + +To learn more, read the [manifest schema](../manifest.schema.json). diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 00000000..97547098 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,85 @@ +# Getting started + +There are several steps to building an integration with LaunchDarkly. + +## Prerequisites + +Before you connect LaunchDarkly with a third-party service, replicate your integration's desired behavior in an isolated standalone environment separate from LaunchDarkly. + +The easiest way to do this is to use [`curl`](https://curl.haxx.se/docs/manpage.html). Find the API documentation for your third-party service and execute sample commands against it. A lot of API documentation has `curl` example commands provided for developers to use. + +When you execute your sample commands, observe the request semantics. This helps streamline your manifest and template definitions. + +## Step 1: Fork this repository + +Fork this repository to your own GitHub account. + +After you finish building your integration, you can submit a pull request to LaunchDarkly to have it approved and deployed. + +To learn more about submitting a pull request, read [Step 8: Submit your integration](#step-8-submit-your-integration). + +## Step 2: Create a new directory inside `./integrations` + +Create a new directory inside the [integrations](../integrations) directory. Name it +after your organization or give it the integration's name (For example, `your-company-name-dot-com`). + +The directory name must not have any spaces and must use +[kebab-casing](https://wiki.c2.com/?KebabCase). + +Only change files and directories inside your new directory. Our validation process rejects any pull requests with modified content outside of your directory. + +## Step 3: Create your integration manifest + +Each integration contains a manifest defining basic concepts about your integration and organization. Manifests also instruct LaunchDarkly in how to interact with your integration. + +Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. It's important to configure your manifest correctly. + +To learn more, read [Integration manifest](manifest.md). + +## Step 4: Collect integration configuration data from LaunchDarkly users + +Most integrations need to collect one or more pieces of configuration data +that support the integration (for example, API tokens or webhook endpoints). + +You can describe a set of `formVariables` that define these configuration properties. + +To learn more, read [Form variables](form-variables.md). + +## Step 5: Define your integration's capabilities + +The next step to define your LaunchDarkly integration is describing its +`capabilities`. Your integration's `capabilities` are how it interacts with LaunchDarkly. + +To learn more, read [Capabilities](capabilities.md). + +## Step 6: Validate your integration + +To validate your integration: + +1. Run `npm install` to install the validation dependencies. +2. Run `npm test` to run the validation suite. + +Additionally, we +recommend you install [pre-commit hooks](https://pre-commit.com/#install) with `pre-commit install`. This will make the validation suite run before every commit, saving you time if you need to troubleshoot anything. + +Some of the capabilities have their own validation tools. To learn more, read [Capabilities](capabilities.md). + +## Step 7: Create your user documentation and README + +Now that your integration is built and validated, you must provide documentation for users and integration maintainers. + +Find LaunchDarkly's user documentation at [docs.launchdarkly.com](https://docs.launchdarkly.com/integrations). You can submit new docs to the [LaunchDarkly-Docs repository](https://github.com/launchdarkly/LaunchDarkly-Docs). + +Submit a pull request to this repository with a new integrations guide. Follow the pattern and language used by existing integration guides. + +In addition to user documentation, you must to provide guidance on how to maintain and test your integration. Specify this developer-focused information in an integration README (`README.md`) in your integration's directory. The README should also link to the user documentation you provide. + +## Step 8: Submit your integration + +After you've built your integration, [submit a pull request against this +repo](https://github.com/launchdarkly/integration-framework/pull/new/master). + +When you do, your branch will run through some automated validations and be reviewed by +our team. If we're ready to publish your integration, we'll get your permission and make it live on our site. + +We'll also work with you on submitting your user documentation to our [documentation site](https://github.com/launchdarkly/LaunchDarkly-Docs). diff --git a/docs/manifest.md b/docs/manifest.md new file mode 100644 index 00000000..53f08527 --- /dev/null +++ b/docs/manifest.md @@ -0,0 +1,81 @@ +# Integration manifest + +Each integration contains a manifest defining basic concepts about your integration and organization. Manifests also instruct LaunchDarkly in how to interact with your integration. + +Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. It's important to configure your manifest correctly. + +## Introduction + +Create an empty +`manifest.json` file inside your new directory. You will use the `manifest.json` to describe your +integration's details and capabilities. + +The properties of LaunchDarkly's integration manifests are defined through a +[JSON schema](../manifest.schema.json). +Many IDEs can provide you inline help and validation while editing your +manifest. You can register the JSON +schema in your IDE to enable this kind of help. + +If you use [VSCode](https://code.visualstudio.com/), it detects the settings in +this repository and aplies the schema validation without any additional +configuration. + +![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) + +## Getting started + +The first part of the manifest describes your organization, contacts, URLs, and +a few items LaunchDarkly needs to list your integration properly. + +We use most of this +information when we render your integration card and configuration form +in the LaunchDarkly UI. + +```json +{ + "name": "Sample Integration", + "version": "1.0.0", + "overview": "Short one-liner describing your integration", + "description": "Send flag data to space. Markdown based description.", + "author": "Example Dot Com", + "supportEmail": "support@example.com", + "links": { + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} +``` + + +There are a few properties in the manifest that can accept simple +[markdown](https://daringfireball.net/projects/markdown/). One of them is the +`description`. + +LaunchDarkly's UI converts markdown to HTML. To get the best results, only use +simple markdown, like links and basic text formatting. + +Notice that the `icons` described above are in SVG format. This is intentional. We do not accept other image formats. + +We use your organization's or +integration's logo in the LaunchDarkly UI and a public +facing integrations listing on +[launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG +files allow your logo to scale nicely on different devices. +To make sure your logo appears correctly everywhere we use it, make sure that your +SVG logos don't have any padding around the image. + +Also, notice that the `icon.square` and `icon.horizontal` properties point to +relative paths. These paths are relative to your integration's directory. You are +free to create any directories and files that support your integration. + +## Form variables and capabilities + +Form variables and capabilities are the most important part of the manifest. They +define the primary interactions that LaunchDarkly and users will have with your integration. + +Read more about [form variables](form-variables.md) and [capabilities](capabilities.md). diff --git a/helpers/index.js b/helpers/index.js index 576bdb3d..75482f59 100644 --- a/helpers/index.js +++ b/helpers/index.js @@ -7,6 +7,12 @@ const registerHelpers = () => { } return options.inverse(this); }); + Handlebars.registerHelper('pathEncode', function (v) { + return encodeURI(v); + }); + Handlebars.registerHelper('queryEncode', function (v) { + return encodeURIComponent(v); + }); }; module.exports = { registerHelpers }; diff --git a/integrations/appdynamics/README.md b/integrations/appdynamics/README.md index 022a34ff..a4486839 100644 --- a/integrations/appdynamics/README.md +++ b/integrations/appdynamics/README.md @@ -2,6 +2,16 @@ [User documentation](https://example.com) -[API documentation](https://example.com) +1. Create a new OAuth API client within AppDynamics following the documentation outlined [here](https://docs.appdynamics.com/display/PRO45/API+Clients). Your client will need the **Create Events** permission. + +2. Navigate the the integrations page within LaunchDarkly and configure new AppDynamics integration. You will be prompted to connect via OAuth. At this point, input you will be prompted to enter your **base URL**, **client_id**, and **client_secret**. + +- **base URL**: something like https://launchdarkly-nfr.saas.appdynamics.com +- **client_id**: this will be your AppDynamics account name and name of your newly created API client in the format: `@` +- **client_secret**: This will be the secret generated in step 1. + +[API documentation](https://docs.appdynamics.com/display/PRO45/Events+and+Action+Suppression+API) + +App dynamics requires the client credentials OAuth 2.0 flow and event information be sent as query parameters. Ensure all query parameters utilize the `queryEncode` helper to avoid 400s. Run `npm run curl appdynamics` in the root repository directory to generate a `curl` command to send data to AppDynamics. diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index b0767d23..2b6551b0 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -14,6 +14,7 @@ "square": "assets/images/appdynamics_square.svg", "horizontal": "assets/images/appdynamics_horizontal.svg" }, + "requiresOAuth": true, "formVariables": [ { "key": "account", @@ -23,38 +24,27 @@ "isSecret": false }, { - "key": "username", - "name": "AppDynamics account username", - "description": "Enter your [AppDynamics username](https://docs.appdynamics.com/display/PRO45/API+Clients).", + "key": "applicationID", + "name": "Application Name", + "description": "Enter your AppDynamics application name or ID", "type": "string", "isSecret": false - }, - { - "key": "password", - "name": "AppDynamics account password", - "description": "Enter your [AppDynamics user password](https://docs.appdynamics.com/display/PRO45/API+Clients).", - "type": "string", - "isSecret": true } ], "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "http://{{account}}.saas.appdynamics.com/controller/rest/applications/5/events?", + "url": "{{oauth.baseURI}}/controller/rest/applications/{{pathEncode applicationID}}/events?summary={{queryEncode 'LaunchDarkly: '}}{{queryEncode context.title.html}}{{#if context.details.html}}%0D%0A{{queryEncode context.details.html}}{{/if}}{{#if context.comment}}&comment={{queryEncode context.comment}}{{/if}}&eventtype=CUSTOM&customeventtype=LaunchDarkly&severity=INFO", "method": "POST", "headers": [ { - "name": "user", - "value": "{{username}}@{{account}}:{{password}}" - }, - { - "name": "Content-Type", - "value": "application/json" + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" } ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.text.hbs" }, "defaultPolicy": [ { diff --git a/integrations/appdynamics/templates/template.json.hbs b/integrations/appdynamics/templates/template.json.hbs deleted file mode 100644 index 3042080c..00000000 --- a/integrations/appdynamics/templates/template.json.hbs +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "application_id": "LaunchDarkly", - "summary": "{{title.plainText}}", - "comment": "{{#if comment}}{{comment}}{{/if}}", - "eventtype": "APPLICATION_DEPLOYMENT", - "severity": "INFO" - } -] diff --git a/integrations/appdynamics/templates/template.text.hbs b/integrations/appdynamics/templates/template.text.hbs new file mode 100644 index 00000000..b232a6c7 --- /dev/null +++ b/integrations/appdynamics/templates/template.text.hbs @@ -0,0 +1,6 @@ +{{! +AppDynamics uses query parameters instead of a POST body. +In this case, a dummy template is used because the integrations-framework is configured +to not send events for empty templates. +}} +dummy diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 0a401646..13a35de9 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -21,6 +21,17 @@ "type": "string", "description": "Enter your Datadog [API key](https://app.datadoghq.com/account/settings#api).", "isSecret": true + }, + { + "key": "hostURL", + "name": "Datadog host URL", + "description": "Your Datadog host URL. The default host URL is [https://api.datadoghq.com](https://api.datadoghq.com). Use [https://api.datadoghq.eu](https://api.datadoghq.eu) if you are on the Datadog EU site.", + "type": "enum", + "allowedValues": [ + "https://api.datadoghq.com", + "https://api.datadoghq.eu" + ], + "defaultValue": "https://api.datadoghq.com" } ], "capabilities": { @@ -32,7 +43,7 @@ ], "auditLogEventsHook": { "endpoint": { - "url": "https://api.datadoghq.com/api/v1/events", + "url": "{{hostURL}}/api/v1/events", "method": "POST", "headers": [ { diff --git a/integrations/datadog/templates/default.json.hbs b/integrations/datadog/templates/default.json.hbs index adcffe14..79806a2e 100644 --- a/integrations/datadog/templates/default.json.hbs +++ b/integrations/datadog/templates/default.json.hbs @@ -1,6 +1,6 @@ { "title": "{{{title.plainText}}}", - "text": "{{#if details.plainText}}{{{details.plainText}}}{{#if comment}}\n{{/if}}{{/if}}{{#if comment}}comment: {{comment}}{{/if}}", + "text": "%%% \n {{{title.markdown}}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", "date_happened": {{timestamp.seconds}}, "tags": [ {{#if customProperties}} diff --git a/integrations/datadog/templates/environment.json.hbs b/integrations/datadog/templates/environment.json.hbs index b493485c..ce26fde9 100644 --- a/integrations/datadog/templates/environment.json.hbs +++ b/integrations/datadog/templates/environment.json.hbs @@ -1,6 +1,6 @@ { "title": "{{{title.plainText}}}", - "text": "{{#if details.plainText}}{{{details.plainText}}}{{#if comment}}\n{{/if}}{{/if}}{{#if comment}}comment: {{comment}}{{/if}}", + "text": "%%% \n {{{title.markdown}}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", "date_happened": {{timestamp.seconds}}, "tags": [ {{#if customProperties}} diff --git a/integrations/datadog/templates/project.json.hbs b/integrations/datadog/templates/project.json.hbs index 4f0f2745..5a746e06 100644 --- a/integrations/datadog/templates/project.json.hbs +++ b/integrations/datadog/templates/project.json.hbs @@ -1,6 +1,6 @@ { "title": "{{{title.plainText}}}", - "text": "{{#if details.plainText}}{{{details.plainText}}}{{#if comment}}\n{{/if}}{{/if}}{{#if comment}}comment: {{comment}}{{/if}}", + "text": "%%% \n {{{title.markdown}}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", "date_happened": {{timestamp.seconds}}, "tags": [ {{#if customProperties}} diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 37bb779a..0caa047f 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -14,6 +14,7 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, + "requiresOAuth": true, "formVariables": [ { "key": "optional", diff --git a/integrations/sentry/README.md b/integrations/sentry/README.md deleted file mode 100644 index c2c13721..00000000 --- a/integrations/sentry/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Sentry - -[User documentation](https://example.com) - -[API documentation](https://docs.sentry.io/api/) - -[API endpoint documentation](https://forum.sentry.io/t/how-can-i-post-with-curl-a-sentry-event-which-authentication-credentials/4759) - It should be noted that the latest version this endpoint functions with is version 7 (header `X-Sentry-Auth: Sentry sentry_version=7`), i.e. it does not seem to have been brought along with more [recent releases](https://github.com/getsentry/sentry/releases). We were also not able to locate documentation of it in the official Sentry docs. This may eventually cause issues if the endpoint is either deprecated or no longer maintained. - -Run `npm run curl sentry` in the root repository directory to generate a `curl` command to send data to Sentry. diff --git a/integrations/sentry/assets/images/sentry-banner.svg b/integrations/sentry/assets/images/sentry-banner.svg deleted file mode 100644 index 984a84eb..00000000 --- a/integrations/sentry/assets/images/sentry-banner.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/integrations/sentry/assets/images/sentry.svg b/integrations/sentry/assets/images/sentry.svg deleted file mode 100644 index d3f083f1..00000000 --- a/integrations/sentry/assets/images/sentry.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json deleted file mode 100644 index 33b04318..00000000 --- a/integrations/sentry/manifest.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "Sentry", - "version": "0.0.1", - "overview": "Monitor LaunchDarkly flag events in Sentry", - "description": "Send flag, environment, and project updates to Sentry.io", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://sentry.io", - "privacyPolicy": "https://sentry.io/privacy/" - }, - "categories": ["monitoring", "notifications"], - "icons": { - "square": "assets/images/sentry.svg", - "horizontal": "assets/images/sentry-banner.svg" - }, - "formVariables": [ - { - "key": "host", - "name": "Sentry API host", - "description": "Enter the host used to access your Sentry account.", - "placeholder": "https://sentry.io", - "type": "string" - }, - { - "key": "publicKey", - "name": "Sentry public key", - "description": "Enter the public key associated with your Sentry account. This is the hash at the beginning of your [Sentry DSN](https://docs.sentry.io/error-reporting/configuration/).", - "placeholder": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk=", - "type": "string" - }, - { - "key": "projectId", - "name": "Project ID", - "description": "Enter the ID associated with the Sentry project you want events sent to. This can be found in the URL of your project or at the end of your [Sentry DSN](https://docs.sentry.io/error-reporting/configuration/).", - "placeholder": "1234567", - "type": "string" - } - ], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "{{host}}/api/{{projectId}}/store/", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "X-Sentry-Auth", - "value": "Sentry sentry_version=7, sentry_key={{ publicKey }}" - } - ] - }, - "templates": { - "default": "templates/template.json.hbs" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } -} diff --git a/integrations/sentry/templates/template.json.hbs b/integrations/sentry/templates/template.json.hbs deleted file mode 100644 index 6e31fa99..00000000 --- a/integrations/sentry/templates/template.json.hbs +++ /dev/null @@ -1,31 +0,0 @@ -{ - "event_id": "{{ _id }}00000000", - "culprit": "{{ _links.site.href }}", - "logger": "launchdarkly", - "platform": "other", - "level": "info", - "transaction": "{{{ title.plainText }}}", - "server_name": "{{ baseURL }}", - "fingerprint": [ - "{{ _links.site.href }}", - "{{ kind }}", - "{{ name }}", - "{{ title.plainText }}" - ], - - "tags": { - "source": "LaunchDarkly", - "launchdarkly_kind": "{{ kind }}", - "launchdarkly_name": "{{ name }}", - "launchdarkly_key": "{{key}}" - }, - - "message": { - "formatted": "{{{ title.plainText }}}\n{{{ details.plainText }}}{{#if comment}}\n\n{{ comment }}{{/if}}" - }, - "user": { - "id": "launchdarkly/member/{{ member._id }}", - "email": "{{ member.email }}", - "Member Name": "{{ member.firstName }} {{ member.lastName }}" - } -} diff --git a/manifest.schema.json b/manifest.schema.json index 71e9ccb6..aa262e57 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -18,7 +18,8 @@ "icons", "formVariables", "capabilities", - "legacy" + "legacy", + "requiresOAuth" ] }, "properties": { @@ -217,6 +218,13 @@ "kind" ] }, + "requiresOAuth": { + "$id": "#/properties/requires-oauth", + "title": "Requires OAuth", + "type": "boolean", + "description": "Whether the integration authenticates using OAuth", + "default": false + }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", @@ -265,7 +273,8 @@ "string", "boolean", "uri", - "enum" + "enum", + "oauth" ] }, "description": { @@ -338,7 +347,7 @@ "properties": { "auditLogEventsHook": { "$id": "#/properties/capability/audit-log-events-hook", - "title": "Audit Log Events Hook", + "title": "Audit log events hook", "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", "type": "object", "propertyNames": { diff --git a/package-lock.json b/package-lock.json index ca6ca093..8f026e66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "ld-integrations", + "name": "integration-framework", "version": "1.0.0", "lockfileVersion": 1, "requires": true, diff --git a/package.json b/package.json index 90a39920..d7e15929 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "ld-integrations", + "name": "integration-framework", "version": "1.0.0", "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", "main": "index.js", @@ -18,14 +18,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/launchdarkly/ld-integrations.git" + "url": "git+https://github.com/launchdarkly/integration-framework.git" }, "author": "", "license": "ISC", "bugs": { - "url": "https://github.com/launchdarkly/ld-integrations/issues" + "url": "https://github.com/launchdarkly/integration-framework/issues" }, - "homepage": "https://github.com/launchdarkly/ld-integrations#readme", + "homepage": "https://github.com/launchdarkly/integration-framework#readme", "devDependencies": { "@apidevtools/json-schema-ref-parser": "^8.0.0", "ajv": "^6.10.2", diff --git a/preview.js b/preview.js index fd97ce0f..ccd62229 100644 --- a/preview.js +++ b/preview.js @@ -41,6 +41,17 @@ const getFormVariableContext = formVariables => { return endpointContext; }; +const getOAuthContext = requiresOAuth => { + if (requiresOAuth) { + const oauthContext = { + baseURI: '$OAUTH_BASE_URI', + accessToken: '$OAUTH_ACCESS_TOKEN', + }; + return oauthContext; + } + return null; +}; + registerHelpers(); const curl = _.includes(args, '--curl'); @@ -68,9 +79,11 @@ const endpoint = _.get( 'capabilities.auditLogEventsHook.endpoint', null ); +const requiresOAuth = _.get(manifest, 'requiresOAuth', null); if (endpoint) { const endpointContext = getFormVariableContext(formVariables); + endpointContext.oauth = getOAuthContext(requiresOAuth); endpointContext.context = flagUpdateContext; const urlTemplate = Handlebars.compile(endpoint.url, { strict: true, diff --git a/schemas/base.json b/schemas/base.json index 37e163a4..0458803e 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -18,7 +18,8 @@ "icons", "formVariables", "capabilities", - "legacy" + "legacy", + "requiresOAuth" ] }, "properties": { @@ -196,6 +197,13 @@ }, "required": ["kind"] }, + "requiresOAuth": { + "$id": "#/properties/requires-oauth", + "title": "Requires OAuth", + "type": "boolean", + "description": "Whether the integration authenticates using OAuth", + "default": false + }, "formVariables": { "$id": "#/properties/formVariables", "title": "Form variables", @@ -240,7 +248,7 @@ "title": "Type", "type": "string", "description": "The type of the variable", - "enum": ["string", "boolean", "uri", "enum"] + "enum": ["string", "boolean", "uri", "enum", "oauth"] }, "description": { "$id": "#/properties/formVariables/variable/description", diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index e53fcd9d..43c0a972 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "auditLogEventsHook": { "$id": "#/properties/capability/audit-log-events-hook", - "title": "Audit Log Events Hook", + "title": "Audit log events hook", "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", "type": "object", "propertyNames": { diff --git a/scripts/merge_to_public.sh b/scripts/merge_to_public.sh new file mode 100755 index 00000000..717f1157 --- /dev/null +++ b/scripts/merge_to_public.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# +# This script merges forward from the private mirror to the public one, +# one master branch to the other while squashing commits. +# +# Usage: ./merge_to_public.sh +# + +COMMIT_MSG=${1:-Releasing changes publicly} + +echo "Merging to the public mirror with message: ${COMMIT_MSG}" + +mkdir -p temp +git clone git@github.com:launchdarkly/integration-framework.git temp/repo +cd temp/repo +git remote add private git@github.com:launchdarkly/integration-framework-private.git +git checkout master +git fetch private +git merge private/master --squash +git commit -a -m "${1}" # Merge conflicts will need to be resolved manually +git push origin master + +cd ../.. +rm -rf temp From a3f132217ffb5c459a1e4355b36dd392b24cdc39 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 22 May 2020 15:53:33 +0100 Subject: [PATCH 282/936] Remove V2 and change description to match legacy (#107) --- integrations/datadog/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 13a35de9..3f76229c 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -1,8 +1,8 @@ { - "name": "Datadog V2", + "name": "Datadog", "version": "1.0.0", "overview": "Monitor LaunchDarkly changes in Datadog", - "description": "Monitor LaunchDarkly flag and other change events in DataDog. Correlate feature rollouts to changes in your system’s operational health.", + "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Datadog.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From dd33e57054a69cc8f5098398b186cb95b6b161d7 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 22 May 2020 09:36:50 -0700 Subject: [PATCH 283/936] minor honeycomb update (#106) --- integrations/honeycomb/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/honeycomb/README.md b/integrations/honeycomb/README.md index 1e983580..91c6bffe 100644 --- a/integrations/honeycomb/README.md +++ b/integrations/honeycomb/README.md @@ -1,6 +1,6 @@ # Honeycomb -[User documentation](https://example.com) +[User documentation](https://docs.launchdarkly.com/integrations/honeycomb) [API documentation](https://docs.honeycomb.io/api/markers/) From 64c371e7253470e20d38b68941e5d58cca1ef664 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 22 May 2020 09:37:21 -0700 Subject: [PATCH 284/936] finalize logdna integration (#105) --- docs/capabilities.md | 5 ++-- integrations/logdna/README.md | 2 +- integrations/logdna/manifest.json | 20 +++++---------- .../logdna/templates/template.json.hbs | 25 ++++++++++++++++--- 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index f95e992a..f0c574d4 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -137,8 +137,9 @@ sends you a default JSON payload that looks like this: "_id": "5defebd006121dd9f7ea90d0", "_accountId": "", "timestamp": { - "milliseconds": 1576004560130, - "seconds": 1576004560 + "milliseconds": 1580778134028, + "seconds": 1580778134, + "rfc3339": "2020-02-04T01:02:14Z" }, "kind": "flag", "name": "Example test", diff --git a/integrations/logdna/README.md b/integrations/logdna/README.md index 53a55e07..96944c1a 100644 --- a/integrations/logdna/README.md +++ b/integrations/logdna/README.md @@ -1,6 +1,6 @@ # LogDNA -[User documentation](https://example.com) +[User documentation](https://docs.launchdarkly.com/integrations/logdna) [API documentation](https://docs.logdna.com/reference#api) diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index d1fe2af2..f09756f8 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -6,7 +6,7 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://example.com", + "site": "https://docs.launchdarkly.com/integrations/logdna", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], @@ -24,26 +24,18 @@ "isSecret": true }, { - "key": "app", - "name": "LogDNA app", - "description": "Enter the name of your LogDNA app. This value will associate LaunchDarkly data with the corresponding LogDNA app.", + "key": "level", + "name": "Log level", + "description": "The log level with which LaunchDarkly messages will be published.", "type": "string", "isSecret": false, - "placeholder": "LaunchDarkly" - }, - { - "key": "hostname", - "name": "Hostname", - "description": "Enter the hostname from which events are being generated. For most customers the default value is correct.", - "type": "string", - "isSecret": false, - "defaultValue": "app.launchdarkly.com" + "defaultValue": "INFO" } ], "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "https://logs.logdna.com/logs/ingest?hostname={{hostname}}", + "url": "https://logs.logdna.com/logs/ingest?hostname=launchdarkly", "method": "POST", "headers": [ { diff --git a/integrations/logdna/templates/template.json.hbs b/integrations/logdna/templates/template.json.hbs index 4e0d7dfc..41f578fb 100644 --- a/integrations/logdna/templates/template.json.hbs +++ b/integrations/logdna/templates/template.json.hbs @@ -2,9 +2,28 @@ "lines": [ { "line": "{{{title.plainText}}}{{#if comment}}, Comment: {{comment}}{{/if}}", - "app": "{{formVariables.app}}", - "level": "INFO", - "env": "{{project.environment.key}}" + "app": "{{project.key}}", + "level": "{{formVariables.level}}", + "env": "{{project.environment.key}}", + "timestamp": "{{timestamp.milliseconds}}", + "meta": { + {{#equal kind 'flag'}} + "flag_key": "{{key}}", + "flag_name": "{{name}}", + {{/equal}} + {{#if project}} + "project_key": "{{project.key}}", + "project_name": "{{project.name}}", + {{#if project.environment}} + "environment_key": "{{project.environment.key}}", + "environment_name": "{{project.environment.name}}", + {{/if}} + {{/if}} + "kind": "{{kind}}", + "member_id": "{{member._id}}", + "member_email": "{{member.email}}", + "member_name": "{{member.firstName}} {{member.lastName}}" + } } ] } From 7665d0584188ad2ade2b8bf3b6ec004864e2a0d2 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 22 May 2020 15:13:47 -0700 Subject: [PATCH 285/936] add community-inspired section to pr template (#109) --- .github/pull_request_template.md | 12 ++++++++++++ docs/capabilities.md | 4 ++-- preview.js | 4 +++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 166037ee..a2877019 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,6 +4,14 @@ - [ ] I have updated my user documentation - [ ] I have updated my developer documentation (my integration README) +**Intended availability** + +If you're adding a new integration, let us know if you are a community member or a partner. + +If you are a partner, your integration will be available to all customers. + +If you're part of the community and submitting an integration for your own purposes or internal teams, specify your company name so that we can verify your identity and enable the integration for your account. + **Related issues** Provide links to any issues in this repository or elsewhere relating to this pull request. @@ -18,6 +26,10 @@ If you're modifying an existing integration, provide a clear and concise descrip If you're modifying an existing integration, provide a clear and concise description of any alternative solutions or features you've considered. +**Provide a request preview** + +Include the output from running `npm run preview `. + **Additional context** Add any other context about the pull request here. diff --git a/docs/capabilities.md b/docs/capabilities.md index f0c574d4..b40b1d1a 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -226,9 +226,9 @@ Here is the policy: ### Validation -To preview your integration's templates with sample data, run `npm run preview YOUR_INTEGRATION_DIR_NAME`. +To preview your integration's templates with sample data, run `npm run preview INTEGRATION_NAME`. -Alternatively, to produce a sample `curl` command, run `npm run curl YOUR_INTEGRATION_DIR_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. +Alternatively, to produce a sample `curl` command, run `npm run curl INTEGRATION_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. ## Reserved custom properties (`reservedCustomProperties`) diff --git a/preview.js b/preview.js index ccd62229..4176f03d 100644 --- a/preview.js +++ b/preview.js @@ -70,7 +70,9 @@ let manifest; try { manifest = require(`./integrations/${integrationName}/manifest.json`); } catch (e) { - console.log(`The "${integrationName}" integration does not exist.\n`); + console.log( + `The "${integrationName}" integration does not exist. This value should be your integration directory name.\n` + ); process.exit(1); } const formVariables = _.get(manifest, 'formVariables', null); From 8288a8b3cd68d680428b0beae5a86a214b61d9b2 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 22 May 2020 16:43:37 -0700 Subject: [PATCH 286/936] Deploy to prod (#110) --- .github/pull_request_template.md | 12 +++++++++ docs/capabilities.md | 9 ++++--- integrations/honeycomb/README.md | 2 +- integrations/logdna/README.md | 2 +- integrations/logdna/manifest.json | 20 +++++---------- .../logdna/templates/template.json.hbs | 25 ++++++++++++++++--- preview.js | 4 ++- 7 files changed, 50 insertions(+), 24 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 166037ee..a2877019 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,6 +4,14 @@ - [ ] I have updated my user documentation - [ ] I have updated my developer documentation (my integration README) +**Intended availability** + +If you're adding a new integration, let us know if you are a community member or a partner. + +If you are a partner, your integration will be available to all customers. + +If you're part of the community and submitting an integration for your own purposes or internal teams, specify your company name so that we can verify your identity and enable the integration for your account. + **Related issues** Provide links to any issues in this repository or elsewhere relating to this pull request. @@ -18,6 +26,10 @@ If you're modifying an existing integration, provide a clear and concise descrip If you're modifying an existing integration, provide a clear and concise description of any alternative solutions or features you've considered. +**Provide a request preview** + +Include the output from running `npm run preview `. + **Additional context** Add any other context about the pull request here. diff --git a/docs/capabilities.md b/docs/capabilities.md index f95e992a..b40b1d1a 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -137,8 +137,9 @@ sends you a default JSON payload that looks like this: "_id": "5defebd006121dd9f7ea90d0", "_accountId": "", "timestamp": { - "milliseconds": 1576004560130, - "seconds": 1576004560 + "milliseconds": 1580778134028, + "seconds": 1580778134, + "rfc3339": "2020-02-04T01:02:14Z" }, "kind": "flag", "name": "Example test", @@ -225,9 +226,9 @@ Here is the policy: ### Validation -To preview your integration's templates with sample data, run `npm run preview YOUR_INTEGRATION_DIR_NAME`. +To preview your integration's templates with sample data, run `npm run preview INTEGRATION_NAME`. -Alternatively, to produce a sample `curl` command, run `npm run curl YOUR_INTEGRATION_DIR_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. +Alternatively, to produce a sample `curl` command, run `npm run curl INTEGRATION_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. ## Reserved custom properties (`reservedCustomProperties`) diff --git a/integrations/honeycomb/README.md b/integrations/honeycomb/README.md index 1e983580..91c6bffe 100644 --- a/integrations/honeycomb/README.md +++ b/integrations/honeycomb/README.md @@ -1,6 +1,6 @@ # Honeycomb -[User documentation](https://example.com) +[User documentation](https://docs.launchdarkly.com/integrations/honeycomb) [API documentation](https://docs.honeycomb.io/api/markers/) diff --git a/integrations/logdna/README.md b/integrations/logdna/README.md index 53a55e07..96944c1a 100644 --- a/integrations/logdna/README.md +++ b/integrations/logdna/README.md @@ -1,6 +1,6 @@ # LogDNA -[User documentation](https://example.com) +[User documentation](https://docs.launchdarkly.com/integrations/logdna) [API documentation](https://docs.logdna.com/reference#api) diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index d1fe2af2..f09756f8 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -6,7 +6,7 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://example.com", + "site": "https://docs.launchdarkly.com/integrations/logdna", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], @@ -24,26 +24,18 @@ "isSecret": true }, { - "key": "app", - "name": "LogDNA app", - "description": "Enter the name of your LogDNA app. This value will associate LaunchDarkly data with the corresponding LogDNA app.", + "key": "level", + "name": "Log level", + "description": "The log level with which LaunchDarkly messages will be published.", "type": "string", "isSecret": false, - "placeholder": "LaunchDarkly" - }, - { - "key": "hostname", - "name": "Hostname", - "description": "Enter the hostname from which events are being generated. For most customers the default value is correct.", - "type": "string", - "isSecret": false, - "defaultValue": "app.launchdarkly.com" + "defaultValue": "INFO" } ], "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "https://logs.logdna.com/logs/ingest?hostname={{hostname}}", + "url": "https://logs.logdna.com/logs/ingest?hostname=launchdarkly", "method": "POST", "headers": [ { diff --git a/integrations/logdna/templates/template.json.hbs b/integrations/logdna/templates/template.json.hbs index 4e0d7dfc..41f578fb 100644 --- a/integrations/logdna/templates/template.json.hbs +++ b/integrations/logdna/templates/template.json.hbs @@ -2,9 +2,28 @@ "lines": [ { "line": "{{{title.plainText}}}{{#if comment}}, Comment: {{comment}}{{/if}}", - "app": "{{formVariables.app}}", - "level": "INFO", - "env": "{{project.environment.key}}" + "app": "{{project.key}}", + "level": "{{formVariables.level}}", + "env": "{{project.environment.key}}", + "timestamp": "{{timestamp.milliseconds}}", + "meta": { + {{#equal kind 'flag'}} + "flag_key": "{{key}}", + "flag_name": "{{name}}", + {{/equal}} + {{#if project}} + "project_key": "{{project.key}}", + "project_name": "{{project.name}}", + {{#if project.environment}} + "environment_key": "{{project.environment.key}}", + "environment_name": "{{project.environment.name}}", + {{/if}} + {{/if}} + "kind": "{{kind}}", + "member_id": "{{member._id}}", + "member_email": "{{member.email}}", + "member_name": "{{member.firstName}} {{member.lastName}}" + } } ] } diff --git a/preview.js b/preview.js index ccd62229..4176f03d 100644 --- a/preview.js +++ b/preview.js @@ -70,7 +70,9 @@ let manifest; try { manifest = require(`./integrations/${integrationName}/manifest.json`); } catch (e) { - console.log(`The "${integrationName}" integration does not exist.\n`); + console.log( + `The "${integrationName}" integration does not exist. This value should be your integration directory name.\n` + ); process.exit(1); } const formVariables = _.get(manifest, 'formVariables', null); From 98ee08e58c6ea6f690df4acb080ecb09b79e09ea Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 27 May 2020 16:42:40 -0700 Subject: [PATCH 287/936] better logdna link (#112) --- integrations/logdna/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index f09756f8..8f29a4d1 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -18,7 +18,7 @@ { "key": "ingestionKey", "name": "LogDNA ingestion key", - "description": "Enter your [LogDNA ingestion key](https://app.logdna.com/manage/profile).", + "description": "Enter your [LogDNA ingestion key](https://app.logdna.com/manage/api-keys).", "type": "string", "placeholder": "1234567890abcdef1234567890abcdef", "isSecret": true From da705ec03b711b5c6923bac2557bdfb5eeb881c5 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 27 May 2020 16:44:40 -0700 Subject: [PATCH 288/936] Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) --- integrations/logdna/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index f09756f8..8f29a4d1 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -18,7 +18,7 @@ { "key": "ingestionKey", "name": "LogDNA ingestion key", - "description": "Enter your [LogDNA ingestion key](https://app.logdna.com/manage/profile).", + "description": "Enter your [LogDNA ingestion key](https://app.logdna.com/manage/api-keys).", "type": "string", "placeholder": "1234567890abcdef1234567890abcdef", "isSecret": true From 7d4a03cbe9ef727c58b87be760d273ebb47eafd1 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 29 May 2020 15:16:55 +0100 Subject: [PATCH 289/936] add docs link to manifest schema (#115) --- manifest.schema.json | 9 +++++++++ schemas/base.json | 10 +++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/manifest.schema.json b/manifest.schema.json index aa262e57..2661fe92 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -96,6 +96,7 @@ "propertyNames": { "enum": [ "site", + "launchdarklyDocs", "privacyPolicy", "supportWebsite" ] @@ -109,6 +110,14 @@ "maxLength": 2048, "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, + "launchdarklyDocs": { + "$id": "#/properties/links/launchdarkly-docs", + "title": "LaunchDarkly Documentation", + "description": "URL to the LaunchDarkly documentation for this integration", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, "privacyPolicy": { "$id": "#/properties/links/privacy-policy", "title": "Privacy Policy", diff --git a/schemas/base.json b/schemas/base.json index 0458803e..ca9989e2 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -90,7 +90,7 @@ "description": "A set of reference links supporting your integration", "type": "object", "propertyNames": { - "enum": ["site", "privacyPolicy", "supportWebsite"] + "enum": ["site", "launchdarklyDocs", "privacyPolicy", "supportWebsite"] }, "properties": { "site": { @@ -101,6 +101,14 @@ "maxLength": 2048, "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, + "launchdarklyDocs": { + "$id": "#/properties/links/launchdarkly-docs", + "title": "LaunchDarkly Documentation", + "description": "URL to the LaunchDarkly documentation for this integration", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, "privacyPolicy": { "$id": "#/properties/links/privacy-policy", "title": "Privacy Policy", From 362e62ed553f6e054268cd48015936f7a621c5cf Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 29 May 2020 15:39:38 +0100 Subject: [PATCH 290/936] Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one --- sample-context/environment/create.json | 4 ++++ sample-context/environment/delete.json | 4 ++++ sample-context/environment/update.json | 4 ++++ sample-context/flag/archive.json | 4 ++++ sample-context/flag/copy.json | 4 ++++ sample-context/flag/create.json | 4 ++++ sample-context/flag/targeting-rule-update.json | 4 ++++ sample-context/flag/toggle.json | 4 ++++ sample-context/flag/update-all-environments.json | 4 ++++ sample-context/other/metric.create.json | 4 ++++ sample-context/other/segment.create.json | 4 ++++ sample-context/other/segment.update.json | 4 ++++ sample-context/other/webhook.enable.json | 4 ++++ sample-context/project/create.json | 4 ++++ sample-context/project/delete.json | 4 ++++ sample-context/project/update.json | 4 ++++ 16 files changed, 64 insertions(+) diff --git a/sample-context/environment/create.json b/sample-context/environment/create.json index 39092cc3..239db166 100644 --- a/sample-context/environment/create.json +++ b/sample-context/environment/create.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/settings/projects", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/default/local-dev/audit/5e38c48806121dba45ba0f2f/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/environment/delete.json b/sample-context/environment/delete.json index b8ab420a..136a5786 100644 --- a/sample-context/environment/delete.json +++ b/sample-context/environment/delete.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/settings/projects", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/default/local-dev/audit/5e38c57606121dba45ba0f43/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/environment/update.json b/sample-context/environment/update.json index 8b695358..1b3b9346 100644 --- a/sample-context/environment/update.json +++ b/sample-context/environment/update.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/settings/projects", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/default/local-dev/audit/5e38c50906121dba45ba0f42/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/flag/archive.json b/sample-context/flag/archive.json index 30a97032..789f12d8 100644 --- a/sample-context/flag/archive.json +++ b/sample-context/flag/archive.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/default/~/features/a-brand-new-flag", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/settings/history/5e38c29606121dba45ba0f24/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/flag/copy.json b/sample-context/flag/copy.json index f9af27df..a4fb4f05 100644 --- a/sample-context/flag/copy.json +++ b/sample-context/flag/copy.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/default/~/features/demo-flag", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/settings/history/5e38c2ff06121dba45ba0f25/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/flag/create.json b/sample-context/flag/create.json index b7895fbc..98ba7225 100644 --- a/sample-context/flag/create.json +++ b/sample-context/flag/create.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/default/~/features/a-brand-new-flag", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/settings/history/5e38c1f006121d8aaf15392d/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/flag/targeting-rule-update.json b/sample-context/flag/targeting-rule-update.json index c1fe2429..5d2500eb 100644 --- a/sample-context/flag/targeting-rule-update.json +++ b/sample-context/flag/targeting-rule-update.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/default/production/features/demo-flag", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/default/production/audit/5e38c0d506121d8aaf15392b/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/flag/toggle.json b/sample-context/flag/toggle.json index 64b0a62f..8f2c0a46 100644 --- a/sample-context/flag/toggle.json +++ b/sample-context/flag/toggle.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/default/production/features/demo-flag", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/default/production/audit/5e38bf6706121d8aaf15392a/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/flag/update-all-environments.json b/sample-context/flag/update-all-environments.json index f2afd831..e51f2fca 100644 --- a/sample-context/flag/update-all-environments.json +++ b/sample-context/flag/update-all-environments.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/default/~/features/demo-flag", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/settings/history/5e38c13206121d8aaf15392c/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/other/metric.create.json b/sample-context/other/metric.create.json index 800d24dd..754775d8 100644 --- a/sample-context/other/metric.create.json +++ b/sample-context/other/metric.create.json @@ -11,6 +11,10 @@ "self": { "href": "https://app.launchdarkly.com/api/v2/auditlog/5e38c67506121dba45ba0f49", "type": "application/json" + }, + "details": { + "href": "https://app.launchdarkly.com/settings/history/5e38c67506121dba45ba0f49/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/other/segment.create.json b/sample-context/other/segment.create.json index 42d61faf..69f9d968 100644 --- a/sample-context/other/segment.create.json +++ b/sample-context/other/segment.create.json @@ -11,6 +11,10 @@ "site": { "href": "https://app.launchdarkly.com/default/production/segments/new-segment", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/default/production/audit/5e38c5bd06121dba45ba0f44/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/other/segment.update.json b/sample-context/other/segment.update.json index 7debe9a0..9262fada 100644 --- a/sample-context/other/segment.update.json +++ b/sample-context/other/segment.update.json @@ -11,6 +11,10 @@ "site": { "href": "https://app.launchdarkly.com/default/production/segments/new-segment", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/default/production/audit/5e38c61306121dba45ba0f45/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/other/webhook.enable.json b/sample-context/other/webhook.enable.json index 945e132e..76cf3796 100644 --- a/sample-context/other/webhook.enable.json +++ b/sample-context/other/webhook.enable.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/integrations", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/settings/history/5e38c63106121dba45ba0f46/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/project/create.json b/sample-context/project/create.json index 10af3b4e..f73988a3 100644 --- a/sample-context/project/create.json +++ b/sample-context/project/create.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/settings/projects", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/settings/history/5e38c40306121dba45ba0f2b/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/project/delete.json b/sample-context/project/delete.json index e082b9c2..6a665f59 100644 --- a/sample-context/project/delete.json +++ b/sample-context/project/delete.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/settings/projects", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/settings/history/5e38c43c06121dba45ba0f2c/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", diff --git a/sample-context/project/update.json b/sample-context/project/update.json index e8ab0dca..ad5d86d4 100644 --- a/sample-context/project/update.json +++ b/sample-context/project/update.json @@ -15,6 +15,10 @@ "site": { "href": "https://app.launchdarkly.com/settings/projects", "type": "text/html" + }, + "details": { + "href": "https://app.launchdarkly.com/settings/history/5e38c37806121dba45ba0f26/details", + "type": "text/html" } }, "baseURL": "https://app.launchdarkly.com", From db7ccb7051f749b6033d364b65ba22bacff33aea Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 29 May 2020 09:46:03 -0700 Subject: [PATCH 291/936] improvement to merge script (#111) * improvement to merge script * adding logging * adding -x --- scripts/merge_to_public.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/merge_to_public.sh b/scripts/merge_to_public.sh index 717f1157..a0dfc2f1 100755 --- a/scripts/merge_to_public.sh +++ b/scripts/merge_to_public.sh @@ -6,9 +6,14 @@ # Usage: ./merge_to_public.sh # +set -x + COMMIT_MSG=${1:-Releasing changes publicly} +echo echo "Merging to the public mirror with message: ${COMMIT_MSG}" +echo "NOTE: merge conflicts will be automatically resolved by preferring changes from the private mirror." +echo mkdir -p temp git clone git@github.com:launchdarkly/integration-framework.git temp/repo @@ -16,9 +21,12 @@ cd temp/repo git remote add private git@github.com:launchdarkly/integration-framework-private.git git checkout master git fetch private -git merge private/master --squash +git merge private/master --squash --strategy-option=theirs git commit -a -m "${1}" # Merge conflicts will need to be resolved manually git push origin master cd ../.. rm -rf temp + +echo +echo "All done merging to the public mirror!" From 36ec96502254198c2399d63e4229862c420c963d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 29 May 2020 17:52:31 +0100 Subject: [PATCH 292/936] Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script --- integrations/appdynamics/manifest.json | 2 +- preview.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 2b6551b0..4122fce5 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -34,7 +34,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "{{oauth.baseURI}}/controller/rest/applications/{{pathEncode applicationID}}/events?summary={{queryEncode 'LaunchDarkly: '}}{{queryEncode context.title.html}}{{#if context.details.html}}%0D%0A{{queryEncode context.details.html}}{{/if}}{{#if context.comment}}&comment={{queryEncode context.comment}}{{/if}}&eventtype=CUSTOM&customeventtype=LaunchDarkly&severity=INFO", + "url": "{{oauth.baseURI}}/controller/rest/applications/{{pathEncode applicationID}}/events?summary={{queryEncode 'LaunchDarkly: '}}{{queryEncode context.title.html}}{{#if context.comment}}%0D%0A{{queryEncode 'Comment: '}}{{queryEncode context.comment}}{{/if}}{{#if context.details.html}}%0D%0A{{queryEncode context.details.html}}{{/if}}&eventtype=CUSTOM&customeventtype=LaunchDarkly&severity=INFO{{#equal context.kind 'flag' }}&propertynames=flag_key&propertyvalues={{queryEncode context.key}}&propertynames=flag_name&propertyvalues={{queryEncode context.name}}{{/equal}}{{#if context.project}}&propertynames=project_key&propertyvalues={{queryEncode context.project.key}}&propertynames=project_name&propertyvalues={{queryEncode context.project.name}}{{#if context.project.environment}}&propertynames=environment_key&propertyvalues={{queryEncode context.project.environment.key}}&propertynames=environment_name&propertyvalues={{queryEncode context.project.environment.name}}{{/if}}{{/if}}&propertynames=kind&propertyvalues={{context.kind}}", "method": "POST", "headers": [ { diff --git a/preview.js b/preview.js index 4176f03d..b18e79c3 100644 --- a/preview.js +++ b/preview.js @@ -148,7 +148,7 @@ if (endpoint) { headers.forEach(header => { console.log(`HEADER: ${header.name}: ${header.value}`); }); - console.log(`BODY:\t${testFileName}.json`); + console.log(`BODY:\t${testFileName}`); console.log(body); } } else { From 3c29c39426555b87f4521e75b85e6f62e3e9fc47 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 29 May 2020 18:37:04 +0100 Subject: [PATCH 293/936] Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates --- integrations/datadog/manifest.json | 4 +++- integrations/datadog/templates/default.json.hbs | 8 +++++++- integrations/datadog/templates/environment.json.hbs | 5 +++++ integrations/datadog/templates/project.json.hbs | 4 +++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 3f76229c..f96e4f4c 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -57,7 +57,9 @@ ] }, "templates": { - "default": "templates/default.json.hbs" + "default": "templates/default.json.hbs", + "project": "templates/project.json.hbs", + "environment": "templates/environment.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/datadog/templates/default.json.hbs b/integrations/datadog/templates/default.json.hbs index 79806a2e..61f63c80 100644 --- a/integrations/datadog/templates/default.json.hbs +++ b/integrations/datadog/templates/default.json.hbs @@ -16,9 +16,15 @@ "{{{this}}}", {{/each}} {{#if project.key}}"project_key:{{project.key}}", - {{#if project.environment.key}}"environment_key:{{project.environment.key}}",{{/if}}{{/if}} + "project_name:{{project.name}}", + {{#if project.environment.key}}"environment_key:{{project.environment.key}}", + "environment_name:{{project.environment.name}}", + {{!-- The following tag was added to provide backwards compatibility with the legacy integration. --}} + "{{project.environment.name}}",{{/if}}{{/if}} "{{kind}}_key:{{key}}", + "{{kind}}_name:{{name}}", "action:{{verbKind}}", + "kind:{{kind}}", "member:{{member.email}}" ], "source_type_name": "launchdarkly" diff --git a/integrations/datadog/templates/environment.json.hbs b/integrations/datadog/templates/environment.json.hbs index ce26fde9..00d1355b 100644 --- a/integrations/datadog/templates/environment.json.hbs +++ b/integrations/datadog/templates/environment.json.hbs @@ -16,8 +16,13 @@ "{{{this}}}", {{/each}} "project_key:{{project.key}}", + "project_name:{{project.name}}", "environment_key:{{key}}", + "environment_name:{{project.environment.name}}", + {{!-- The following tag was added to provide backwards compatibility with the legacy integration. --}} + "{{project.environment.name}}", "action:{{verbKind}}", + "kind:{{kind}}", "member:{{member.email}}" ], "source_type_name": "launchdarkly" diff --git a/integrations/datadog/templates/project.json.hbs b/integrations/datadog/templates/project.json.hbs index 5a746e06..9f2816b6 100644 --- a/integrations/datadog/templates/project.json.hbs +++ b/integrations/datadog/templates/project.json.hbs @@ -15,8 +15,10 @@ {{#each tags}} "{{{this}}}", {{/each}} - {{#if project.key}}"project_key:{{project.key}}", + "project_key:{{project.key}}", + "project_name:{{project.name}}", "action:{{verbKind}}", + "kind:{{kind}}", "member:{{member.email}}" ], "source_type_name": "launchdarkly" From ad6f5b5bcdee3ed6d2a99aa2927bd66ce3b9fdcd Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 2 Jun 2020 12:28:09 +0100 Subject: [PATCH 294/936] Remove duplicate test (#122) --- __tests__/validateIntegrationManifests.js | 1 - 1 file changed, 1 deletion(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 4a496d9d..535b9fb9 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -272,7 +272,6 @@ describe('All integrations', () => { if (defaultTemplatePath) { const path = `./integrations/${key}/${defaultTemplatePath}`; expect(existsSync(path)).toBe(true); - expect(existsSync(path)).toBe(true); const template = getTemplate(path); const isJSON = isJSONTemplate(defaultTemplatePath); From 55c9278c628dc69fc27c51c855ec9bd3d0ac0149 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 3 Jun 2020 11:28:19 +0100 Subject: [PATCH 295/936] Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href --- integrations/appoptics/templates/flag.json.hbs | 2 +- integrations/honeycomb/templates/flag.json.hbs | 2 +- integrations/new-relic/templates/flag.json.hbs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/appoptics/templates/flag.json.hbs b/integrations/appoptics/templates/flag.json.hbs index b5c5f2a3..564638a3 100644 --- a/integrations/appoptics/templates/flag.json.hbs +++ b/integrations/appoptics/templates/flag.json.hbs @@ -4,7 +4,7 @@ "links": [ { "label": "{{name}}", - "href": "{{_links.site.href}}", + "href": "{{_links.details.href}}", "rel": "launchdarkly" } ] diff --git a/integrations/honeycomb/templates/flag.json.hbs b/integrations/honeycomb/templates/flag.json.hbs index 725cb806..63ac8c30 100644 --- a/integrations/honeycomb/templates/flag.json.hbs +++ b/integrations/honeycomb/templates/flag.json.hbs @@ -1,5 +1,5 @@ { "message": "{{{title.plainText}}}", "type": "LaunchDarkly", - "url": "{{_links.site.href}}" + "url": "{{_links.details.href}}" } diff --git a/integrations/new-relic/templates/flag.json.hbs b/integrations/new-relic/templates/flag.json.hbs index 1ba379dd..f1b8b4c0 100644 --- a/integrations/new-relic/templates/flag.json.hbs +++ b/integrations/new-relic/templates/flag.json.hbs @@ -1,7 +1,7 @@ { "message": "{{{title.plainText}}}", "eventType": "LaunchDarkly", - "url": "{{_links.site.href}}", + "url": "{{_links.details.href}}", "timestamp": "{{timestamp.milliseconds}}", "name": "{{name}}", "project": "{{project.name}}" From 1a22c4cdc837d3dd1f804aa7697ec493febdfbf9 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 3 Jun 2020 16:34:08 +0100 Subject: [PATCH 296/936] Point upload script to new staging bucket (#125) --- .circleci/config.yml | 2 +- scripts/copy_to_s3.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 47b96530..18051a45 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -57,7 +57,7 @@ workflows: filters: branches: only: master - bucket-name: launchdarkly-integrations-staging + bucket-name: integrations-stg.launchdarkly.com - deploy-to-s3: requires: - build diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 0f395d73..29c0bff0 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -3,4 +3,4 @@ export REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV aws s3 cp manifest.schema.json s3://$BUCKET_NAME/integrations/$REV/manifest.schema.json --metadata-directive REPLACE --content-type "application/json" -aws s3 cp latest s3://$BUCKET_NAME/latest.json --acl public-read --metadata-directive REPLACE --content-type "application/json" +aws s3 cp latest s3://$BUCKET_NAME/latest.json --metadata-directive REPLACE --content-type "application/json" From c2f6cce982992ea9c1af48224fc84539df8cbe2d Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 4 Jun 2020 11:16:24 +0100 Subject: [PATCH 297/936] Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> --- integrations/adfs/manifest.json | 3 ++- integrations/ansible/manifest.json | 3 ++- integrations/appdynamics/manifest.json | 3 ++- integrations/azure-devops/manifest.json | 3 ++- integrations/bitbucket-flags/manifest.json | 3 ++- integrations/bitbucket/manifest.json | 3 ++- integrations/circleci-coderefs/manifest.json | 3 ++- integrations/datadog-legacy/manifest.json | 3 ++- integrations/datadog/manifest.json | 3 ++- integrations/dynatrace/manifest.json | 3 ++- integrations/elastic/manifest.json | 1 + integrations/git/manifest.json | 3 ++- integrations/github/manifest.json | 3 ++- integrations/gitlab-coderefs/manifest.json | 3 ++- integrations/google-pubsub/manifest.json | 3 ++- integrations/googleapps-sso/manifest.json | 3 ++- integrations/heap/manifest.json | 4 ++-- integrations/honeycomb/manifest.json | 1 + integrations/jira/manifest.json | 3 ++- integrations/kinesis/manifest.json | 3 ++- integrations/logdna/manifest.json | 3 ++- integrations/mparticle/manifest.json | 3 ++- integrations/msteams/manifest.json | 3 ++- integrations/new-relic/manifest.json | 1 + integrations/okta/manifest.json | 3 ++- integrations/onelogin/manifest.json | 3 ++- integrations/pendo/manifest.json | 2 +- integrations/segment/manifest.json | 4 +++- integrations/signalfx/manifest.json | 3 ++- integrations/slack-app/manifest.json | 1 + integrations/slack-webhooks/manifest.json | 3 ++- integrations/sleuth/manifest.json | 4 +++- integrations/splunk/manifest.json | 3 ++- integrations/terraform/manifest.json | 3 ++- integrations/vscode/manifest.json | 3 ++- integrations/webhooks/manifest.json | 1 + 36 files changed, 68 insertions(+), 32 deletions(-) diff --git a/integrations/adfs/manifest.json b/integrations/adfs/manifest.json index c386fc89..1537efc8 100644 --- a/integrations/adfs/manifest.json +++ b/integrations/adfs/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/adfs", + "site": "https://docs.microsoft.com/en-us/windows-server/identity/active-directory-federation-services", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/adfs", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json index deea0403..8078e7e4 100644 --- a/integrations/ansible/manifest.json +++ b/integrations/ansible/manifest.json @@ -6,8 +6,9 @@ "author": "LaunchDarkly Labs", "supportEmail": "support@launchdarkly.com", "links": { - "supportWebsite": "https://github.com/launchdarkly-labs/ansible-launchdarkly-collection/issues", "site": "https://galaxy.ansible.com/launchdarkly_labs/collection", + "launchdarklyDocs": "https://launchdarkly-labs.github.io/ansible-launchdarkly-collection/", + "supportWebsite": "https://github.com/launchdarkly-labs/ansible-launchdarkly-collection/issues", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["automation"], diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 4122fce5..d7300986 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://example.com", + "site": "https://www.appdynamics.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/appdynamics", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/azure-devops/manifest.json b/integrations/azure-devops/manifest.json index c49f51cd..7e2152fd 100644 --- a/integrations/azure-devops/manifest.json +++ b/integrations/azure-devops/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/visual-studio-team-services-extension", + "site": "https://azure.microsoft.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/azure-devops", "privacyPolicy": "https://privacy.microsoft.com/en-US/privacystatement" }, "categories": ["automation"], diff --git a/integrations/bitbucket-flags/manifest.json b/integrations/bitbucket-flags/manifest.json index 5991f44a..915e1d39 100644 --- a/integrations/bitbucket-flags/manifest.json +++ b/integrations/bitbucket-flags/manifest.json @@ -7,8 +7,9 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { + "site": "https://bitbucket.org/product/features/pipelines", "supportWebsite": "https://docs.launchdarkly.com/docs/bitbucket-pipelines", - "site": "https://docs.launchdarkly.com/docs/bitbucket-pipelines", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/bitbucket-pipelines", "privacyPolicy": "https://docs.launchdarkly.com/docs/git-code-references#section-configuring-context-lines" }, "categories": ["automation", "developer-tools"], diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json index 45170e9c..da47af18 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/git-code-references/bitbucket-pipes", + "site": "https://bitbucket.org/product/features/pipelines", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references/bitbucket-pipes", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["version-control"], diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json index 3d2c249c..d793639a 100644 --- a/integrations/circleci-coderefs/manifest.json +++ b/integrations/circleci-coderefs/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/circleci-orbs", + "site": "https://circleci.com/orbs/", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/circleci-orbs", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["configuration", "version-control"], diff --git a/integrations/datadog-legacy/manifest.json b/integrations/datadog-legacy/manifest.json index d15bcc99..6b2004d6 100644 --- a/integrations/datadog-legacy/manifest.json +++ b/integrations/datadog-legacy/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/datadog", + "site": "https://www.datadoghq.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog", "privacyPolicy": "https://www.datadoghq.com/legal/privacy" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 8c269a76..52b4390c 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/datadog", + "site": "https://www.datadoghq.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog", "privacyPolicy": "https://www.datadoghq.com/legal/privacy" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 92da1f97..fc4a696d 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/dynatrace", + "site": "https://www.dynatrace.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/dynatrace", "privacyPolicy": "https://www.dynatrace.com/company/trust-center/privacy/" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/elastic/manifest.json b/integrations/elastic/manifest.json index a5b79414..ce9abb95 100644 --- a/integrations/elastic/manifest.json +++ b/integrations/elastic/manifest.json @@ -7,6 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://elastic.co", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/elastic-stack", "privacyPolicy": "https://www.elastic.co/legal/privacy-statement" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json index 34f290bb..0bea411d 100644 --- a/integrations/git/manifest.json +++ b/integrations/git/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/git-code-references", + "site": "https://github.com/launchdarkly/ld-find-code-refs/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["version-control"], diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index 07244e6a..6e88fc1a 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/git-code-references/github-actions", + "site": "https://github.com/features/actions", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references/github-actions", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["version-control"], diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab-coderefs/manifest.json index 0a7e0239..a9a6a2a1 100644 --- a/integrations/gitlab-coderefs/manifest.json +++ b/integrations/gitlab-coderefs/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/gitlab-ci", + "site": "https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/gitlab-ci", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["configuration", "version-control"], diff --git a/integrations/google-pubsub/manifest.json b/integrations/google-pubsub/manifest.json index 9c6b8d1c..4aa566d9 100644 --- a/integrations/google-pubsub/manifest.json +++ b/integrations/google-pubsub/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/data-export/google-pubsub", + "site": "https://cloud.google.com/pubsub", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/google-pubsub", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/googleapps-sso/manifest.json b/integrations/googleapps-sso/manifest.json index 9d2e014e..6d89a3b1 100644 --- a/integrations/googleapps-sso/manifest.json +++ b/integrations/googleapps-sso/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/google-apps", + "site": "https://cloud.google.com/identity/sso", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/google-apps", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index 466b95e8..648dea3f 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -7,8 +7,8 @@ "author": "Heap", "supportEmail": "support@heap.io", "links": { - "supportWebsite": "https://docs.oracle.com/en/cloud/saas/data-cloud/data-cloud-help-center/index.html", - "site": "https://docs.heap.io/docs/additional-sources#section-launch-darkly", + "supportWebsite": "https://help.heap.io/", + "site": "https://heap.io/", "privacyPolicy": "https://heap.io/privacy" }, "categories": ["product-tools"], diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 2993019c..98a0cca4 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -7,6 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://honeycomb.io", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/honeycomb", "privacyPolicy": "https://honeycomb.io/privacy" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 0d69fb35..9e92162e 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/jira", + "site": "https://www.atlassian.com/software/jira", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/jira", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["task-management"], diff --git a/integrations/kinesis/manifest.json b/integrations/kinesis/manifest.json index cd88a0ea..342112ad 100644 --- a/integrations/kinesis/manifest.json +++ b/integrations/kinesis/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/data-export/kinesis", + "site": "https://aws.amazon.com/kinesis/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/kinesis", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 8f29a4d1..2812f30f 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/logdna", + "site": "https://logdna.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/logdna", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/mparticle/manifest.json b/integrations/mparticle/manifest.json index 246acbfc..71092482 100644 --- a/integrations/mparticle/manifest.json +++ b/integrations/mparticle/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/data-export/mparticle", + "site": "https://www.mparticle.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/mparticle", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 2b12a090..d7738a65 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/msteams", + "site": "https://www.microsoft.com/microsoft-365/microsoft-teams/group-chat-software", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/msteams", "privacyPolicy": "https://privacy.microsoft.com/en-us" }, "categories": ["notifications"], diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index 8917f2ec..d8c400b0 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -7,6 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://newrelic.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/new-relic", "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/okta/manifest.json b/integrations/okta/manifest.json index a2205d26..495642be 100644 --- a/integrations/okta/manifest.json +++ b/integrations/okta/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/okta", + "site": "https://www.okta.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/okta", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/onelogin/manifest.json b/integrations/onelogin/manifest.json index a1b7867e..ed3f7b46 100644 --- a/integrations/onelogin/manifest.json +++ b/integrations/onelogin/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/onelogin", + "site": "https://www.onelogin.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/onelogin", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index 6d7055e7..6c69ca37 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@pendo.com", "links": { "supportWebsite": "https://support.pendo.io/hc/en-us/articles/360032592312-LaunchDarkly-Recipe-Automate-the-feature-release-process", - "site": "https://support.pendo.io/hc/en-us/articles/360032592312-LaunchDarkly-Recipe-Automate-the-feature-release-process", + "site": "https://www.pendo.io/", "privacyPolicy": "https://www.pendo.io/legal/privacy-policy/" }, "categories": ["product-tools"], diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json index 0550ca3b..e963db0a 100644 --- a/integrations/segment/manifest.json +++ b/integrations/segment/manifest.json @@ -6,7 +6,9 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/data-export/segment", + "site": "https://segment.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/segment", + "supportWebsite": "https://segment.com/docs/connections/sources/catalog/cloud-apps/launchdarkly/", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 1b71bd7d..e496c17f 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/signalfx", + "site": "https://www.signalfx.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/signalfx", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index 2891a260..9ac6aad4 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -7,6 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://slack.com/apps/AKEEF9DTM-launchdarkly", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/slack", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["notifications"], diff --git a/integrations/slack-webhooks/manifest.json b/integrations/slack-webhooks/manifest.json index 56237722..d82f0f95 100644 --- a/integrations/slack-webhooks/manifest.json +++ b/integrations/slack-webhooks/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/slack/webhooks", + "site": "https://api.slack.com/messaging/webhooks", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/slack/webhooks", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["notifications"], diff --git a/integrations/sleuth/manifest.json b/integrations/sleuth/manifest.json index d39861b1..32042668 100644 --- a/integrations/sleuth/manifest.json +++ b/integrations/sleuth/manifest.json @@ -6,7 +6,9 @@ "author": "Sleuth", "supportEmail": "support@sleuth.io", "links": { - "site": "https://help.sleuth.io/integrations/launchdarkly", + "site": "https://www.sleuth.io/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/sleuth", + "supportWebsite": "https://help.sleuth.io/integrations/launchdarkly", "privacyPolicy": "https://www.sleuth.io/privacy" }, "categories": ["monitoring"], diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 0fe094b6..af8b8ee0 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -6,7 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/splunk", + "site": "https://www.splunk.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/splunk", "privacyPolicy": "https://www.splunk.com/en_us/legal/splunk-data-security-and-privacy.html" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index 0cba9edb..f72a1ecf 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "supportWebsite": "https://docs.launchdarkly.com/docs/terraform", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/terraform", + "supportWebsite": "https://www.terraform.io/docs/providers/launchdarkly/index.html", "site": "https://www.terraform.io/docs/providers/launchdarkly/index.html", "privacyPolicy": "https://app.terraform.io/pages/privacy" }, diff --git a/integrations/vscode/manifest.json b/integrations/vscode/manifest.json index eda60d38..8986df19 100644 --- a/integrations/vscode/manifest.json +++ b/integrations/vscode/manifest.json @@ -7,7 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/visual-studio-code", + "site": "https://marketplace.visualstudio.com/items?itemName=launchdarkly.launchdarkly", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/visual-studio-code", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["developer-tools"], diff --git a/integrations/webhooks/manifest.json b/integrations/webhooks/manifest.json index 2ad73e38..523667c0 100644 --- a/integrations/webhooks/manifest.json +++ b/integrations/webhooks/manifest.json @@ -7,6 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/integrations/webhooks", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/webhooks", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["notifications"], From 972d0e7f16a5a40b063c7d97e646c90c4e7c95fb Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 5 Jun 2020 22:03:38 +0100 Subject: [PATCH 298/936] add more detail to new relic template (#126) --- integrations/new-relic/manifest.json | 4 ++-- .../new-relic/templates/flag.json.hbs | 8 ------- .../new-relic/templates/template.json.hbs | 21 +++++++++++++++++++ 3 files changed, 23 insertions(+), 10 deletions(-) delete mode 100644 integrations/new-relic/templates/flag.json.hbs create mode 100644 integrations/new-relic/templates/template.json.hbs diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index d8c400b0..e1e8b988 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -19,7 +19,7 @@ { "key": "accountId", "name": "New Relic account ID", - "description": "Enter your [New Relic account ID](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/account-id).", + "description": "Enter your [New Relic account ID](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/account-id). The associated account must be enabled for Insights Pro.", "type": "string", "placeholder": "123456" }, @@ -48,7 +48,7 @@ ] }, "templates": { - "flag": "templates/flag.json.hbs" + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/new-relic/templates/flag.json.hbs b/integrations/new-relic/templates/flag.json.hbs deleted file mode 100644 index f1b8b4c0..00000000 --- a/integrations/new-relic/templates/flag.json.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "message": "{{{title.plainText}}}", - "eventType": "LaunchDarkly", - "url": "{{_links.details.href}}", - "timestamp": "{{timestamp.milliseconds}}", - "name": "{{name}}", - "project": "{{project.name}}" -} diff --git a/integrations/new-relic/templates/template.json.hbs b/integrations/new-relic/templates/template.json.hbs new file mode 100644 index 00000000..be7fddca --- /dev/null +++ b/integrations/new-relic/templates/template.json.hbs @@ -0,0 +1,21 @@ +{ + "message": "{{{title.plainText}}}", + "eventType": "LaunchDarkly", + "url": "{{_links.details.href}}", + "timestamp": "{{timestamp.milliseconds}}", + "kind": "{{kind}}", + {{#equal kind 'flag'}} + "flag_name": "{{name}}", + "flag_key": "{{key}}", + {{/equal}} + {{#if project}} + "project_name": "{{project.name}}", + "project_key": "{{project.key}}", + {{#if project.environment}} + "environment_name": "{{project.environment.name}}", + "environment_key": "{{project.environment.key}}", + {{/if}} + {{/if}} + "user": "{{#if member.firstName}}{{member.firstName}}{{#if member.lastName}} {{/if}}{{/if}}{{#if member.lastName}}{{member.lastName}}{{/if}}", + "user_email": "{{member.email}}" +} From ce6eb214d3c40f5f42a1645d0849ae8be86c491a Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 8 Jun 2020 11:17:23 +0100 Subject: [PATCH 299/936] Imiller/ch74105/add member details to existing integrations (#89) * update msteams default template * add user data to dynatrace payload * add instructions for testing signalfx * add user data to signalfx template * remove entire comment field if no comment * make user link to mailto instead of user payload * fix trailing comma Co-Authored-By: Henry Barrow * remove superfluous space Co-Authored-By: Henry Barrow * move comma to inside if to fix invalid json * fix trailing whitespace * move trailing commas to inside handlebars ifs * add if around name for in case it's not set * add user data to splunk payload * only display comment field if there is a comment * revert msteams default template to original * signalfx - separate user and user email into two fields * splunk - separate user and user email into separate fields * update spacing Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * separate dynatrace user into name and email Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update spacing on splunk Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * remove lingering parentheses * don't display user name if both don't exist * fix capitalization * add missing space * add missing space Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> --- integrations/dynatrace/templates/flag.json.hbs | 6 +++++- integrations/signalfx/README.md | 9 +++++++++ integrations/signalfx/templates/template.json.hbs | 8 +++++++- integrations/splunk/templates/template.json.hbs | 8 +++++++- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/integrations/dynatrace/templates/flag.json.hbs b/integrations/dynatrace/templates/flag.json.hbs index 63a31707..6d986b39 100644 --- a/integrations/dynatrace/templates/flag.json.hbs +++ b/integrations/dynatrace/templates/flag.json.hbs @@ -28,7 +28,11 @@ "Project key": "{{project.key}}", "Environment name": "{{project.environment.name}}", "Environment key": "{{project.environment.key}}", - "Comment": "{{#if comment}}{{comment}}{{/if}}" + "Comment": "{{#if comment}}{{comment}}{{/if}}", + {{#if member.firstName}}{{#if member.lastName}} + "User name": "{{member.firstName}} {{member.lastName}}", + {{/if}}{{/if}} + "User email": "{{ member.email }}" }, "start": {{ timestamp.milliseconds }}, "source": "LaunchDarkly", diff --git a/integrations/signalfx/README.md b/integrations/signalfx/README.md index 6a7dbedc..6e9380e2 100644 --- a/integrations/signalfx/README.md +++ b/integrations/signalfx/README.md @@ -4,4 +4,13 @@ [API documentation](https://developers.signalfx.com/ingest_data_reference.html#operation/Send%20Custom%20Events) +### Set up for testing +You shouldn't need to plug SignalFx into anything to test the SignalFx-Goaltender integration. Instead, just follow the following steps to locate the LD events after logging in to SignalFx: +1. Under the 'Dashboards' tab, expand the 'Built-in Dashboard Groups' section. +2. Expand the 'Sample Data' section. +3. Click into 'Sample Charts'. +4. Once there, click on any of the charts to add LD events. +5. Under 'Plot Editor', select 'Add Metric or Event' and choose 'LaunchDarkly flag change'. +6. Send an event from your local Gonfalon. It should register at the bottom of the chart as a little diamond. + Run `npm run curl signalfx` in the root repository directory to generate a `curl` command to send data to SignalFx. diff --git a/integrations/signalfx/templates/template.json.hbs b/integrations/signalfx/templates/template.json.hbs index a5be0b19..a404e2ad 100644 --- a/integrations/signalfx/templates/template.json.hbs +++ b/integrations/signalfx/templates/template.json.hbs @@ -24,7 +24,13 @@ {{/if}} "message": "{{{title.plainText}}}", "verb": "{{titleVerb}}", - "comment": "{{#if comment}}{{comment}}{{/if}}" + {{#if comment}} + "comment": "{{comment}}", + {{/if}} + {{#if member.firstName}}{{#if member.lastName}} + "user": "{{member.firstName}} {{member.lastName}}", + {{/if}}{{/if}} + "user_email": "{{member.email}}" }, "eventType": "LaunchDarkly {{kind}} change", "timestamp": {{timestamp.milliseconds}} diff --git a/integrations/splunk/templates/template.json.hbs b/integrations/splunk/templates/template.json.hbs index 88b39e87..a4f1e638 100644 --- a/integrations/splunk/templates/template.json.hbs +++ b/integrations/splunk/templates/template.json.hbs @@ -17,6 +17,12 @@ "environment_key": "{{project.environment.key}}", {{/if}} {{/if}} - "comment": "{{#if comment}}{{{comment}}}{{/if}}" + {{#if comment}} + "comment": "{{{comment}}}", + {{/if}} + {{#if member.firstName}}{{#if member.lastName}} + "user": "{{member.firstName}} {{member.lastName}}", + {{/if}}{{/if}} + "user_email": "{{member.email}}" } } From 908f1f9e9ef7ba7ee06ebe6e090437d9d3f56bc1 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 11 Jun 2020 12:26:17 +0100 Subject: [PATCH 300/936] Imiller/ch78837/update some categories (#130) * add missing categories messaging, code-references, log-management, issue-tracking, analytics * update msteams * update honeycomb, logdna, dynatrace * update appoptics, datadog, grafana * update new relic, signalfx, splunk * update appdynamics and jira * update circleci, heap, pendo * update gitlab and trello * update git and slack app * update bitbucket pipes (not pipelines/flags) and github --- integrations/appdynamics/manifest.json | 2 +- integrations/appoptics/manifest.json | 2 +- integrations/bitbucket/manifest.json | 2 +- integrations/circleci-coderefs/manifest.json | 2 +- integrations/datadog/manifest.json | 2 +- integrations/dynatrace/manifest.json | 2 +- integrations/git/manifest.json | 2 +- integrations/github/manifest.json | 2 +- integrations/gitlab-coderefs/manifest.json | 2 +- integrations/grafana/manifest.json | 2 +- integrations/heap/manifest.json | 2 +- integrations/honeycomb/manifest.json | 2 +- integrations/jira/manifest.json | 2 +- integrations/logdna/manifest.json | 2 +- integrations/msteams/manifest.json | 2 +- integrations/new-relic/manifest.json | 2 +- integrations/pendo/manifest.json | 2 +- integrations/signalfx/manifest.json | 2 +- integrations/slack-app/manifest.json | 2 +- integrations/splunk/manifest.json | 2 +- integrations/trello/manifest.json | 2 +- manifest.schema.json | 7 ++++++- schemas/base.json | 7 ++++++- 23 files changed, 33 insertions(+), 23 deletions(-) diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index d7300986..8a7e558c 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/appdynamics", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["monitoring", "notifications"], + "categories": ["monitoring"], "icons": { "square": "assets/images/appdynamics_square.svg", "horizontal": "assets/images/appdynamics_horizontal.svg" diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index 3aa92eaf..cbe4f994 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -9,7 +9,7 @@ "site": "https://www.AppOptics.com/", "privacyPolicy": "https://www.solarwinds.com/legal/privacy" }, - "categories": ["monitoring", "notifications"], + "categories": ["monitoring"], "icons": { "square": "assets/images/solarwinds-square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json index da47af18..20edf258 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket/manifest.json @@ -11,7 +11,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references/bitbucket-pipes", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["version-control"], + "categories": ["code-references"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json index d793639a..679bc2ff 100644 --- a/integrations/circleci-coderefs/manifest.json +++ b/integrations/circleci-coderefs/manifest.json @@ -11,7 +11,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/docs/circleci-orbs", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["configuration", "version-control"], + "categories": ["code-references"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 52b4390c..746ee770 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog", "privacyPolicy": "https://www.datadoghq.com/legal/privacy" }, - "categories": ["monitoring", "notifications"], + "categories": ["monitoring"], "icons": { "square": "assets/square.svg", "horizontal": "assets/horizontal.svg" diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index fc4a696d..229b2036 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/dynatrace", "privacyPolicy": "https://www.dynatrace.com/company/trust-center/privacy/" }, - "categories": ["monitoring", "notifications"], + "categories": ["monitoring"], "icons": { "square": "assets/square.svg", "horizontal": "assets/horizontal.svg" diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json index 0bea411d..4504040f 100644 --- a/integrations/git/manifest.json +++ b/integrations/git/manifest.json @@ -11,7 +11,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["version-control"], + "categories": ["code-references"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index 6e88fc1a..5064abc6 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -11,7 +11,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references/github-actions", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["version-control"], + "categories": ["code-references"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab-coderefs/manifest.json index a9a6a2a1..292230f8 100644 --- a/integrations/gitlab-coderefs/manifest.json +++ b/integrations/gitlab-coderefs/manifest.json @@ -11,7 +11,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/docs/gitlab-ci", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["configuration", "version-control"], + "categories": ["code-references"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 199ba96a..477843f1 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -9,7 +9,7 @@ "site": "https://grafana.com/", "privacyPolicy": "https://grafana.com/terms/" }, - "categories": ["monitoring", "notifications"], + "categories": ["monitoring"], "icons": { "square": "assets/images/grafana.svg", "horizontal": "assets/images/grafana.svg" diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index 648dea3f..fc693d0d 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -11,7 +11,7 @@ "site": "https://heap.io/", "privacyPolicy": "https://heap.io/privacy" }, - "categories": ["product-tools"], + "categories": ["analytics"], "icons": { "square": "assets/images/heapanalytics-square.svg", "horizontal": "assets/images/heapanalytics-rect.svg" diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 98a0cca4..d76d0b1a 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/honeycomb", "privacyPolicy": "https://honeycomb.io/privacy" }, - "categories": ["monitoring", "notifications"], + "categories": ["monitoring"], "icons": { "square": "assets/images/honeycomb-square.svg", "horizontal": "assets/images/honeycomb-rect.svg" diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 9e92162e..c887feb7 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -11,7 +11,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/docs/jira", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["task-management"], + "categories": ["issue-tracking"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 2812f30f..c3488c83 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/logdna", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["monitoring", "notifications"], + "categories": ["log-management"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index d7738a65..113ff785 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/docs/msteams", "privacyPolicy": "https://privacy.microsoft.com/en-us" }, - "categories": ["notifications"], + "categories": ["messaging"], "icons": { "square": "assets/images/microsoft-teams.svg", "horizontal": "assets/images/microsoft-teams.svg" diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index e1e8b988..e10dc5e2 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/new-relic", "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" }, - "categories": ["monitoring", "notifications"], + "categories": ["monitoring"], "icons": { "square": "assets/images/new-relic-square.svg", "horizontal": "assets/images/new-relic-horizontal.svg" diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index 6c69ca37..9f800778 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -11,7 +11,7 @@ "site": "https://www.pendo.io/", "privacyPolicy": "https://www.pendo.io/legal/privacy-policy/" }, - "categories": ["product-tools"], + "categories": ["analytics"], "icons": { "square": "assets/images/pendo_square.svg", "horizontal": "assets/images/pendo_horizontal.svg" diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index e496c17f..34c01838 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/signalfx", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["monitoring", "notifications"], + "categories": ["monitoring"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index 9ac6aad4..882ca244 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/slack", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["notifications"], + "categories": ["messaging"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index af8b8ee0..b2859e7b 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/docs/splunk", "privacyPolicy": "https://www.splunk.com/en_us/legal/splunk-data-security-and-privacy.html" }, - "categories": ["monitoring", "notifications"], + "categories": ["monitoring"], "icons": { "square": "assets/images/splunk-icon.svg", "horizontal": "assets/images/splunk-logo.svg" diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index 5fc8b6d9..f3fad5df 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -9,7 +9,7 @@ "site": "https://trello.com/power-ups/5d795c43ef5f7d1dc307da46/launchdarkly", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["task-management"], + "categories": ["issue-tracking"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/manifest.schema.json b/manifest.schema.json index 2661fe92..2c66c0d5 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -151,17 +151,22 @@ "items": { "type": "string", "enum": [ + "analytics", "authentication", "automation", + "code-references", "collaboration", "configuration", "data", "developer-tools", "infrastructure", - "task-management", + "issue-tracking", + "log-management", + "messaging", "monitoring", "notifications", "product-tools", + "task-management", "version-control" ] } diff --git a/schemas/base.json b/schemas/base.json index ca9989e2..989da4f9 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -139,17 +139,22 @@ "items": { "type": "string", "enum": [ + "analytics", "authentication", "automation", + "code-references", "collaboration", "configuration", "data", "developer-tools", "infrastructure", - "task-management", + "issue-tracking", + "log-management", + "messaging", "monitoring", "notifications", "product-tools", + "task-management", "version-control" ] } From 68a9f4321f35e956d14fbbfb59161d9e786e1d23 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 16 Jun 2020 15:45:16 +0100 Subject: [PATCH 301/936] Imiller/ch78837/remove unused categories (#131) * remove unused from sample-integration * remove from base schema & manifest schema --- integrations/sample-integration/manifest.json | 2 +- manifest.schema.json | 7 +------ schemas/base.json | 7 +------ 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 0caa047f..91dc9236 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -9,7 +9,7 @@ "site": "https://example.com", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["collaboration", "monitoring", "version-control"], + "categories": ["monitoring", "code-references"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/manifest.schema.json b/manifest.schema.json index 2c66c0d5..020b0ff4 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -155,8 +155,6 @@ "authentication", "automation", "code-references", - "collaboration", - "configuration", "data", "developer-tools", "infrastructure", @@ -164,10 +162,7 @@ "log-management", "messaging", "monitoring", - "notifications", - "product-tools", - "task-management", - "version-control" + "notifications" ] } }, diff --git a/schemas/base.json b/schemas/base.json index 989da4f9..3c2f6827 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -143,8 +143,6 @@ "authentication", "automation", "code-references", - "collaboration", - "configuration", "data", "developer-tools", "infrastructure", @@ -152,10 +150,7 @@ "log-management", "messaging", "monitoring", - "notifications", - "product-tools", - "task-management", - "version-control" + "notifications" ] } }, From 1fee0cbc53bddb7152f8d514302d65f0a8853731 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 16 Jun 2020 15:45:58 +0100 Subject: [PATCH 302/936] Update s3 buckets in circle config (#132) --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 18051a45..1ad9d635 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -64,11 +64,11 @@ workflows: filters: branches: only: deploy-catamorphic - bucket-name: launchdarkly-integrations-catamorphic + bucket-name: integrations-cat.catamorphic.com - deploy-to-s3: requires: - build filters: branches: only: deploy-production - bucket-name: launchdarkly-integrations-production + bucket-name: integrations-prod.launchdarkly.com From 59429b3b5838a832daceca7d118f019f448957d4 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 18 Jun 2020 15:42:55 +0100 Subject: [PATCH 303/936] Add validation template (#135) --- __tests__/validateIntegrationManifests.js | 35 +++++++++++++++++++ integrations/appdynamics/manifest.json | 3 +- integrations/appoptics/manifest.json | 3 +- integrations/datadog/manifest.json | 3 +- integrations/elastic/manifest.json | 3 +- .../elastic/templates/template.json.hbs | 2 +- integrations/grafana/manifest.json | 3 +- integrations/honeycomb/manifest.json | 3 +- integrations/logdna/manifest.json | 3 +- integrations/msteams/manifest.json | 3 +- integrations/new-relic/manifest.json | 3 +- integrations/sample-integration/manifest.json | 3 +- integrations/signalfx/manifest.json | 3 +- integrations/splunk/manifest.json | 3 +- manifest.schema.json | 13 +++++-- schemas/capabilities/auditLogEventsHook.json | 12 +++++-- 16 files changed, 79 insertions(+), 19 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 535b9fb9..14252f76 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -205,6 +205,11 @@ describe('All integrations', () => { 'capabilities.auditLogEventsHook.templates.default', null ); + const validationTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.validation', + null + ); if (flagTemplatePath) { const path = `./integrations/${key}/${flagTemplatePath}`; expect(existsSync(path)).toBe(true); @@ -289,6 +294,36 @@ describe('All integrations', () => { ).not.toThrow(); } } + if (validationTemplatePath) { + const path = `./integrations/${key}/${validationTemplatePath}`; + expect(existsSync(path)).toBe(true); + const template = getTemplate(path); + const isJSON = isJSONTemplate(validationTemplatePath); + const fullContext = getFullContext( + manifest, + environmentContext, + isJSON + ); + expect( + () => template(fullContext), + `${key}: validation template must render successfully` + ).not.toThrow(); + + // Validation templates must not render an empty string + const rendered = template(fullContext); + expect( + rendered.trim(), + `${key} validation template must not render an empty string` + ).not.toEqual(''); + + // Validate json templates render to valid json + if (isJSON) { + expect( + () => JSON.parse(rendered), + `${key} validation .json templates must render valid JSON\n${rendered}` + ).not.toThrow(); + } + } } ); }); diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 8a7e558c..9994a91e 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -45,7 +45,8 @@ ] }, "templates": { - "default": "templates/template.text.hbs" + "default": "templates/template.text.hbs", + "validation": "templates/template.text.hbs" }, "defaultPolicy": [ { diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index cbe4f994..f8f1e510 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -50,7 +50,8 @@ ] }, "templates": { - "flag": "templates/flag.json.hbs" + "flag": "templates/flag.json.hbs", + "validation": "templates/flag.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 746ee770..b9d511e5 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -60,7 +60,8 @@ "templates": { "default": "templates/default.json.hbs", "project": "templates/project.json.hbs", - "environment": "templates/environment.json.hbs" + "environment": "templates/environment.json.hbs", + "validation": "templates/default.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/elastic/manifest.json b/integrations/elastic/manifest.json index ce9abb95..1818e0ec 100644 --- a/integrations/elastic/manifest.json +++ b/integrations/elastic/manifest.json @@ -60,7 +60,8 @@ ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.json.hbs", + "validation": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/elastic/templates/template.json.hbs b/integrations/elastic/templates/template.json.hbs index 49be7afe..c5e37421 100644 --- a/integrations/elastic/templates/template.json.hbs +++ b/integrations/elastic/templates/template.json.hbs @@ -36,5 +36,5 @@ }, "message": "{{{title.plainText}}}", "details": "{{{details.plainText}}}", - "comment": "{{{comment}}}" + "comment": "{{#if comment}}{{{comment}}}{{/if}}" } diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 477843f1..03540ebc 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -49,7 +49,8 @@ ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.json.hbs", + "validation": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index d76d0b1a..b073168d 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -49,7 +49,8 @@ ] }, "templates": { - "flag": "templates/flag.json.hbs" + "flag": "templates/flag.json.hbs", + "validation": "templates/flag.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index c3488c83..bf03816b 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -50,7 +50,8 @@ ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.json.hbs", + "validation": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 113ff785..ecd81021 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -39,7 +39,8 @@ "templates": { "project": "templates/project.json.hbs", "environment": "templates/environment.json.hbs", - "default": "templates/default.json.hbs" + "default": "templates/default.json.hbs", + "validation": "templates/default.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index e10dc5e2..d0ae9e7f 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -48,7 +48,8 @@ ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.json.hbs", + "validation": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 91dc9236..863532a8 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -84,7 +84,8 @@ "flag": "templates/flag.json.hbs", "environment": "templates/environment.html.hbs", "project": "templates/project.txt.hbs", - "default": "templates/default.json.hbs" + "default": "templates/default.json.hbs", + "validation": "templates/default.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 34c01838..af08512e 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -48,7 +48,8 @@ ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.json.hbs", + "validation": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index b2859e7b..24b8aec7 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -56,7 +56,8 @@ ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.json.hbs", + "validation": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/manifest.schema.json b/manifest.schema.json index 020b0ff4..1d33da91 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -415,7 +415,7 @@ }, "properties": { "name": { - "$id": "#/properties/fcapability/audit-log-events-hook/header/items/name", + "$id": "#/properties/capability/audit-log-events-hook/header/items/name", "title": "Name", "type": "string", "description": "Name of the header", @@ -423,7 +423,7 @@ "pattern": "^[^\\s]*$" }, "value": { - "$id": "#/properties/fcapability/audit-log-events-hook/header/items/value", + "$id": "#/properties/capability/audit-log-events-hook/header/items/value", "title": "Value", "type": "string", "description": "Value of the header. Form variables can be substituted in using {{variableName}}" @@ -467,7 +467,8 @@ "flag", "project", "environment", - "default" + "default", + "validation" ] }, "properties": { @@ -494,6 +495,12 @@ "title": "default template", "description": "Template to use if the event does not have a corresponding named template", "type": "string" + }, + "validation": { + "$id": "#/properties/capability/audit-log-events-hook/templates/validation", + "title": "validation template", + "description": "Template to use when sending test events with the 'validate connection' button", + "type": "string" } } }, diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index 43c0a972..80cff049 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -46,7 +46,7 @@ }, "properties": { "name": { - "$id": "#/properties/fcapability/audit-log-events-hook/header/items/name", + "$id": "#/properties/capability/audit-log-events-hook/header/items/name", "title": "Name", "type": "string", "description": "Name of the header", @@ -54,7 +54,7 @@ "pattern": "^[^\\s]*$" }, "value": { - "$id": "#/properties/fcapability/audit-log-events-hook/header/items/value", + "$id": "#/properties/capability/audit-log-events-hook/header/items/value", "title": "Value", "type": "string", "description": "Value of the header. Form variables can be substituted in using {{variableName}}" @@ -89,7 +89,7 @@ "description": "Templates to use for body of the webhook request", "type": "object", "propertyNames": { - "enum": ["flag", "project", "environment", "default"] + "enum": ["flag", "project", "environment", "default", "validation"] }, "properties": { "flag": { @@ -115,6 +115,12 @@ "title": "default template", "description": "Template to use if the event does not have a corresponding named template", "type": "string" + }, + "validation": { + "$id": "#/properties/capability/audit-log-events-hook/templates/validation", + "title": "validation template", + "description": "Template to use when sending test events with the 'validate connection' button", + "type": "string" } } }, From fa0513f1ac30b5f1846b846eec4d45c2a3090410 Mon Sep 17 00:00:00 2001 From: Arnold Trakhtenberg Date: Mon, 29 Jun 2020 12:19:52 -0700 Subject: [PATCH 304/936] coderefs copy changes (#138) * coderefs copy changes * update icon * cleanup * Update manifest.json --- integrations/bitbucket/manifest.json | 4 +-- integrations/circleci-coderefs/manifest.json | 2 +- integrations/{git => coderefs}/LICENSE.md | 0 .../coderefs/assets/images/square.svg | 4 +++ integrations/{git => coderefs}/manifest.json | 4 +-- integrations/git/assets/images/horizontal.svg | 33 ------------------- integrations/git/assets/images/square.svg | 24 -------------- integrations/github/manifest.json | 4 +-- integrations/gitlab-coderefs/manifest.json | 2 +- 9 files changed, 12 insertions(+), 65 deletions(-) rename integrations/{git => coderefs}/LICENSE.md (100%) create mode 100644 integrations/coderefs/assets/images/square.svg rename integrations/{git => coderefs}/manifest.json (67%) delete mode 100644 integrations/git/assets/images/horizontal.svg delete mode 100644 integrations/git/assets/images/square.svg diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json index 20edf258..00f71778 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket/manifest.json @@ -1,5 +1,5 @@ { - "name": "Bitbucket", + "name": "Bitbucket code references", "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", "description": "Use our open-source utility to track references to flags in your code, using Bitbucket Pipes.", @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://bitbucket.org/product/features/pipelines", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references/bitbucket-pipes", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/code-references/bitbucket-pipes", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json index 679bc2ff..682ebf0a 100644 --- a/integrations/circleci-coderefs/manifest.json +++ b/integrations/circleci-coderefs/manifest.json @@ -1,5 +1,5 @@ { - "name": "CircleCI", + "name": "CircleCI code references", "version": "1.0.0", "overview": "Use our open-source utility to track flag references in your code, using CircleCI.", "description": "You can use this utility with CircleCI to automatically populate code references in LaunchDarkly.", diff --git a/integrations/git/LICENSE.md b/integrations/coderefs/LICENSE.md similarity index 100% rename from integrations/git/LICENSE.md rename to integrations/coderefs/LICENSE.md diff --git a/integrations/coderefs/assets/images/square.svg b/integrations/coderefs/assets/images/square.svg new file mode 100644 index 00000000..bd916e94 --- /dev/null +++ b/integrations/coderefs/assets/images/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/git/manifest.json b/integrations/coderefs/manifest.json similarity index 67% rename from integrations/git/manifest.json rename to integrations/coderefs/manifest.json index 4504040f..1c0def30 100644 --- a/integrations/git/manifest.json +++ b/integrations/coderefs/manifest.json @@ -3,7 +3,7 @@ "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, running in your CI build.", "description": "Use our open-source utility to track references to flags in your code, running in your CI build.", - "details": "Git is the most widely used modern version control system in the world. It is a mature, actively maintained open-source project relied on by many leading software projects around the world. Use our open-source utility to track references to flags in your code, running in your CI build.", + "details": "Use our open-source utility to track references to flags in your code, running in your CI build.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { @@ -14,7 +14,7 @@ "categories": ["code-references"], "icons": { "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" + "horizontal": "assets/images/square.svg" }, "legacy": { "kind": "codeRefs" diff --git a/integrations/git/assets/images/horizontal.svg b/integrations/git/assets/images/horizontal.svg deleted file mode 100644 index a02337b8..00000000 --- a/integrations/git/assets/images/horizontal.svg +++ /dev/null @@ -1,33 +0,0 @@ - -image/svg+xml diff --git a/integrations/git/assets/images/square.svg b/integrations/git/assets/images/square.svg deleted file mode 100644 index c6b86dca..00000000 --- a/integrations/git/assets/images/square.svg +++ /dev/null @@ -1,24 +0,0 @@ - -image/svg+xml diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index 5064abc6..b0744fae 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -1,5 +1,5 @@ { - "name": "GitHub", + "name": "GitHub code references", "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", "description": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://github.com/features/actions", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references/github-actions", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/code-references/github-actions", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab-coderefs/manifest.json index 292230f8..bfd03c09 100644 --- a/integrations/gitlab-coderefs/manifest.json +++ b/integrations/gitlab-coderefs/manifest.json @@ -1,5 +1,5 @@ { - "name": "GitLab", + "name": "GitLab code references", "version": "1.0.0", "overview": "Use our open-source utility to track flag references in your code, using GitLab CI.", "description": "You can use this utility with GitLab CI to automatically populate code references in LaunchDarkly.", From 784c39587302dd158be3eb2266f0850333f2e2cb Mon Sep 17 00:00:00 2001 From: Arnold Trakhtenberg Date: Mon, 29 Jun 2020 12:24:13 -0700 Subject: [PATCH 305/936] Update git integration name to "Code references" (#139) * update coderefs integration title * remove yarn.lock --- integrations/coderefs/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/coderefs/manifest.json b/integrations/coderefs/manifest.json index 1c0def30..a5b5b9ac 100644 --- a/integrations/coderefs/manifest.json +++ b/integrations/coderefs/manifest.json @@ -1,5 +1,5 @@ { - "name": "Git", + "name": "Code references", "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, running in your CI build.", "description": "Use our open-source utility to track references to flags in your code, running in your CI build.", From 2cd16e09be90c0b520644e62e7d6c5dcaf094a25 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 29 Jun 2020 20:27:20 +0100 Subject: [PATCH 306/936] Imiller/ch69350/audit appdynamics template and manifest (#65) --- integrations/appdynamics/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/integrations/appdynamics/README.md b/integrations/appdynamics/README.md index a4486839..1ee7d7ad 100644 --- a/integrations/appdynamics/README.md +++ b/integrations/appdynamics/README.md @@ -1,6 +1,8 @@ # AppDynamics -[User documentation](https://example.com) +[User documentation](https://docs.launchdarkly.com/integrations/appdynamics) + +## Setup 1. Create a new OAuth API client within AppDynamics following the documentation outlined [here](https://docs.appdynamics.com/display/PRO45/API+Clients). Your client will need the **Create Events** permission. From 4b8effc04af69d9bc8aa7ffb3f3c44954e2334d1 Mon Sep 17 00:00:00 2001 From: Arnold Trakhtenberg Date: Mon, 29 Jun 2020 13:09:47 -0700 Subject: [PATCH 307/936] Resolve merge conflict (#141) * Promoting from prod to catfood (#114) * Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru * Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Deploy to prod (#110) * Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Henry Barrow Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Promote staging to production (#119) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Isabelle Miller * Deploy Catfood from production (#121) * Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru * Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * Deploy to prod (#110) * better logdna link (#112) * Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates * Promote staging to production (#119) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Promoting from stg to prod (#127) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Henry Barrow Co-authored-by: Isabelle Miller * Deploy new relic to prod (#129) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add more detail to new relic template (#126) Co-authored-by: Henry Barrow Co-authored-by: Isabelle Miller * Promote staging -> prod (#133) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add more detail to new relic template (#126) * Imiller/ch74105/add member details to existing integrations (#89) * update msteams default template * add user data to dynatrace payload * add instructions for testing signalfx * add user data to signalfx template * remove entire comment field if no comment * make user link to mailto instead of user payload * fix trailing comma Co-Authored-By: Henry Barrow * remove superfluous space Co-Authored-By: Henry Barrow * move comma to inside if to fix invalid json * fix trailing whitespace * move trailing commas to inside handlebars ifs * add if around name for in case it's not set * add user data to splunk payload * only display comment field if there is a comment * revert msteams default template to original * signalfx - separate user and user email into two fields * splunk - separate user and user email into separate fields * update spacing Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * separate dynatrace user into name and email Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update spacing on splunk Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * remove lingering parentheses * don't display user name if both don't exist * fix capitalization * add missing space * add missing space Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * Imiller/ch78837/update some categories (#130) * add missing categories messaging, code-references, log-management, issue-tracking, analytics * update msteams * update honeycomb, logdna, dynatrace * update appoptics, datadog, grafana * update new relic, signalfx, splunk * update appdynamics and jira * update circleci, heap, pendo * update gitlab and trello * update git and slack app * update bitbucket pipes (not pipelines/flags) and github * Imiller/ch78837/remove unused categories (#131) * remove unused from sample-integration * remove from base schema & manifest schema * Update s3 buckets in circle config (#132) Co-authored-by: Isabelle Miller Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * Deploy prod (#136) Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Henry Barrow Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich From bff307dda307129297ce46bbf76fa9e8bae9efce Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Mon, 29 Jun 2020 16:55:15 -0700 Subject: [PATCH 308/936] renamed coderefs folder to git --- integrations/git/LICENSE.md | 13 +++++++++++++ integrations/git/assets/images/square.svg | 4 ++++ integrations/git/manifest.json | 22 ++++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 integrations/git/LICENSE.md create mode 100644 integrations/git/assets/images/square.svg create mode 100644 integrations/git/manifest.json diff --git a/integrations/git/LICENSE.md b/integrations/git/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/git/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/git/assets/images/square.svg b/integrations/git/assets/images/square.svg new file mode 100644 index 00000000..bd916e94 --- /dev/null +++ b/integrations/git/assets/images/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json new file mode 100644 index 00000000..a5b5b9ac --- /dev/null +++ b/integrations/git/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Code references", + "version": "1.0.0", + "overview": "Use our open-source utility to track references to flags in your code, running in your CI build.", + "description": "Use our open-source utility to track references to flags in your code, running in your CI build.", + "details": "Use our open-source utility to track references to flags in your code, running in your CI build.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://github.com/launchdarkly/ld-find-code-refs/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["code-references"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "codeRefs" + } +} From 036348f1fde0c0064be945613d153b58221c7c18 Mon Sep 17 00:00:00 2001 From: Sunny Guduru Date: Mon, 29 Jun 2020 16:55:37 -0700 Subject: [PATCH 309/936] delete coderefs folder --- integrations/coderefs/LICENSE.md | 13 ----------- .../coderefs/assets/images/square.svg | 4 ---- integrations/coderefs/manifest.json | 22 ------------------- 3 files changed, 39 deletions(-) delete mode 100644 integrations/coderefs/LICENSE.md delete mode 100644 integrations/coderefs/assets/images/square.svg delete mode 100644 integrations/coderefs/manifest.json diff --git a/integrations/coderefs/LICENSE.md b/integrations/coderefs/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/coderefs/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/coderefs/assets/images/square.svg b/integrations/coderefs/assets/images/square.svg deleted file mode 100644 index bd916e94..00000000 --- a/integrations/coderefs/assets/images/square.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/integrations/coderefs/manifest.json b/integrations/coderefs/manifest.json deleted file mode 100644 index a5b5b9ac..00000000 --- a/integrations/coderefs/manifest.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "Code references", - "version": "1.0.0", - "overview": "Use our open-source utility to track references to flags in your code, running in your CI build.", - "description": "Use our open-source utility to track references to flags in your code, running in your CI build.", - "details": "Use our open-source utility to track references to flags in your code, running in your CI build.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://github.com/launchdarkly/ld-find-code-refs/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["code-references"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/square.svg" - }, - "legacy": { - "kind": "codeRefs" - } -} From acba2659b04fc7c90ffcbac357b88cc57e14e260 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 30 Jun 2020 11:29:28 +0100 Subject: [PATCH 310/936] Add new capability to manifest schema (#146) --- manifest.schema.json | 71 +++++++++++++++++++++++++- schemas/base.json | 6 ++- schemas/capabilities/remoteUpdate.json | 59 +++++++++++++++++++++ 3 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 schemas/capabilities/remoteUpdate.json diff --git a/manifest.schema.json b/manifest.schema.json index 1d33da91..5539eefe 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -350,7 +350,8 @@ "enum": [ "auditLogEventsHook", "reservedCustomProperties", - "externalCondition" + "externalCondition", + "remoteUpdate" ] }, "properties": { @@ -1058,6 +1059,74 @@ } } } + }, + "remoteUpdate": { + "$id": "#/properties/capability/remote-update", + "title": "Remote update", + "description": "This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly", + "type": "object", + "propertyNames": { + "enum": [ + "documentation", + "auth", + "parser" + ] + }, + "required": [ + "documentation" + ], + "properties": { + "documentation": { + "$id": "#/properties/capability/remote-update/auth", + "title": "Documentation link", + "description": "URL to documentation describing how to configure the remote update.", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "auth": { + "$id": "#/properties/capability/remote-update/auth", + "title": "Authentication", + "description": "Authentication type - currently the only option is sharedSecret.", + "type": "string", + "enum": [ + "sharedSecret" + ] + }, + "parser": { + "$id": "#/properties/capability/remote-update/parser", + "title": "Body parser", + "description": "The body parser describes a mapping of property name to a location in the JSON payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": [ + "alertName", + "value", + "url" + ] + }, + "properties": { + "alertName": { + "$id": "#/properties/capability/remote-update/parser/alert-name", + "title": "Alert name pointer", + "description": "JSON pointer to an alert name", + "type": "string" + }, + "value": { + "$id": "#/properties/capability/remote-update/parser/value", + "title": "Value pointer", + "description": "JSON pointer to a metric value", + "type": "string" + }, + "url": { + "$id": "#/properties/capability/remote-update/parser/url", + "title": "URL pointer", + "description": "JSON pointer to the external alert URL", + "type": "string" + } + } + } + } } } } diff --git a/schemas/base.json b/schemas/base.json index 3c2f6827..35cabf5c 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -314,7 +314,8 @@ "enum": [ "auditLogEventsHook", "reservedCustomProperties", - "externalCondition" + "externalCondition", + "remoteUpdate" ] }, "properties": { @@ -326,6 +327,9 @@ }, "externalCondition": { "$ref": "schemas/capabilities/externalCondition.json#/externalCondition" + }, + "remoteUpdate": { + "$ref": "schemas/capabilities/remoteUpdate.json#/remoteUpdate" } } } diff --git a/schemas/capabilities/remoteUpdate.json b/schemas/capabilities/remoteUpdate.json new file mode 100644 index 00000000..8b2d9860 --- /dev/null +++ b/schemas/capabilities/remoteUpdate.json @@ -0,0 +1,59 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "remoteUpdate": { + "$id": "#/properties/capability/remote-update", + "title": "Remote update", + "description": "This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly", + "type": "object", + "propertyNames": { + "enum": ["documentation", "auth", "parser"] + }, + "required": ["documentation"], + "properties": { + "documentation": { + "$id": "#/properties/capability/remote-update/auth", + "title": "Documentation link", + "description": "URL to documentation describing how to configure the remote update.", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "auth": { + "$id": "#/properties/capability/remote-update/auth", + "title": "Authentication", + "description": "Authentication type - currently the only option is sharedSecret.", + "type": "string", + "enum": ["sharedSecret"] + }, + "parser": { + "$id": "#/properties/capability/remote-update/parser", + "title": "Body parser", + "description": "The body parser describes a mapping of property name to a location in the JSON payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": ["alertName", "value", "url"] + }, + "properties": { + "alertName": { + "$id": "#/properties/capability/remote-update/parser/alert-name", + "title": "Alert name pointer", + "description": "JSON pointer to an alert name", + "type": "string" + }, + "value": { + "$id": "#/properties/capability/remote-update/parser/value", + "title": "Value pointer", + "description": "JSON pointer to a metric value", + "type": "string" + }, + "url": { + "$id": "#/properties/capability/remote-update/parser/url", + "title": "URL pointer", + "description": "JSON pointer to the external alert URL", + "type": "string" + } + } + } + } + } +} From 7dca90ff9f1ea2685c8d49adf4ee5ff10b6801c4 Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Thu, 2 Jul 2020 12:05:57 -0700 Subject: [PATCH 311/936] Added OAuth tidbit (#147) * Added OAuth tidbit * Added missing period. --- docs/manifest.md | 75 +++++++++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/docs/manifest.md b/docs/manifest.md index 53f08527..51004ed2 100644 --- a/docs/manifest.md +++ b/docs/manifest.md @@ -1,20 +1,22 @@ # Integration manifest -Each integration contains a manifest defining basic concepts about your integration and organization. Manifests also instruct LaunchDarkly in how to interact with your integration. +Each integration contains a manifest defining basic concepts about your +integration and organization. Manifests also instruct LaunchDarkly in how to +interact with your integration. -Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. It's important to configure your manifest correctly. +Defining your manifest is the single most important step in contributing your +integration to LaunchDarkly's platform. It's important to configure your +manifest correctly. ## Introduction -Create an empty -`manifest.json` file inside your new directory. You will use the `manifest.json` to describe your -integration's details and capabilities. +Create an empty `manifest.json` file inside your new directory. You will use the +`manifest.json` to describe your integration's details and capabilities. The properties of LaunchDarkly's integration manifests are defined through a -[JSON schema](../manifest.schema.json). -Many IDEs can provide you inline help and validation while editing your -manifest. You can register the JSON -schema in your IDE to enable this kind of help. +[JSON schema](../manifest.schema.json). Many IDEs can provide you inline help +and validation while editing your manifest. You can register the JSON schema in +your IDE to enable this kind of help. If you use [VSCode](https://code.visualstudio.com/), it detects the settings in this repository and aplies the schema validation without any additional @@ -27,9 +29,8 @@ configuration. The first part of the manifest describes your organization, contacts, URLs, and a few items LaunchDarkly needs to list your integration properly. -We use most of this -information when we render your integration card and configuration form -in the LaunchDarkly UI. +We use most of this information when we render your integration card and +configuration form in the LaunchDarkly UI. ```json { @@ -47,11 +48,11 @@ in the LaunchDarkly UI. "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "requiresOAuth": false } ``` - There are a few properties in the manifest that can accept simple [markdown](https://daringfireball.net/projects/markdown/). One of them is the `description`. @@ -59,23 +60,45 @@ There are a few properties in the manifest that can accept simple LaunchDarkly's UI converts markdown to HTML. To get the best results, only use simple markdown, like links and basic text formatting. -Notice that the `icons` described above are in SVG format. This is intentional. We do not accept other image formats. +Notice that the `icons` described above are in SVG format. This is intentional. +We do not accept other image formats. -We use your organization's or -integration's logo in the LaunchDarkly UI and a public -facing integrations listing on +We use your organization's or integration's logo in the LaunchDarkly UI and a +public facing integrations listing on [launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG -files allow your logo to scale nicely on different devices. -To make sure your logo appears correctly everywhere we use it, make sure that your -SVG logos don't have any padding around the image. +files allow your logo to scale nicely on different devices. To make sure your +logo appears correctly everywhere we use it, make sure that your SVG logos don't +have any padding around the image. Also, notice that the `icon.square` and `icon.horizontal` properties point to -relative paths. These paths are relative to your integration's directory. You are -free to create any directories and files that support your integration. +relative paths. These paths are relative to your integration's directory. You +are free to create any directories and files that support your integration. + +## OAuth + +Many integrations in LaunchDarkly today use API Tokens. However, if your API +requires OAuth for authentication, we can support that as well. Currently, we +support two types of OAuth: + +* [Authorization Code Flow](https://oauth.net/2/grant-types/authorization-code/) + (aka, 3-legged OAuth) +* [Client Credentials Flow](https://oauth.net/2/grant-types/client-credentials/) + (aka, 2-legged OAuth) + +With these flows, LaunchDarkly acts as the OAuth consumer. In order for this to +work, LaunchDarkly will need to store a consumer ID and secret. Please contact +us at to register your OAuth consumer details. +You'll also need to set the `requiresOAuth` root-level property in your manifest +to `true`. At runtime, LaunchDarkly will lookup your OAuth consumer ID and +secret from our registry based on your integration key. **Simply setting the +`requiresOAuth` property to `true` will not enable OAuth on your integration -- +you'll need to provide us with the OAuth consumer details first.** ## Form variables and capabilities -Form variables and capabilities are the most important part of the manifest. They -define the primary interactions that LaunchDarkly and users will have with your integration. +Form variables and capabilities are the most important part of the manifest. +They define the primary interactions that LaunchDarkly and users will have with +your integration. -Read more about [form variables](form-variables.md) and [capabilities](capabilities.md). +Read more about [form variables](form-variables.md) and +[capabilities](capabilities.md). From f3a6452580731d272e07dfb4a066825fd2a6dce7 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 8 Jul 2020 11:50:56 +0100 Subject: [PATCH 312/936] Copy *.svgs to static.launchdarkly.com (#148) --- scripts/copy_to_s3.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 29c0bff0..82cfe17d 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -2,5 +2,6 @@ export REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV +aws s3 cp --recursive --exclude "*" --include "*.svg" integrations s3://launchdarkly-static/integrations/$REV aws s3 cp manifest.schema.json s3://$BUCKET_NAME/integrations/$REV/manifest.schema.json --metadata-directive REPLACE --content-type "application/json" aws s3 cp latest s3://$BUCKET_NAME/latest.json --metadata-directive REPLACE --content-type "application/json" From 361689ea11dcfaada2c2a31a08db4c2842d1c1e6 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 8 Jul 2020 13:50:53 +0100 Subject: [PATCH 313/936] Rename remote update to trigger (#149) * Rename remote update -> trigger * Update title * Update docs * Update docs/capabilities.md Co-authored-by: Isabelle Miller Co-authored-by: Isabelle Miller --- docs/capabilities.md | 9 ++++++-- manifest.schema.json | 22 +++++++++---------- schemas/base.json | 6 ++--- .../{remoteUpdate.json => trigger.json} | 20 ++++++++--------- 4 files changed, 31 insertions(+), 26 deletions(-) rename schemas/capabilities/{remoteUpdate.json => trigger.json} (75%) diff --git a/docs/capabilities.md b/docs/capabilities.md index b40b1d1a..e06de7b2 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -2,9 +2,10 @@ Your integration's `capabilities` describe how it interacts with LaunchDarkly. -We support two capabilities: +We support three capabilities: -- [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`), and +- [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`) +- [Trigger](#trigger) (`trigger`) - [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) ## Audit log events hook (`auditLogEventsHook`) @@ -230,6 +231,10 @@ To preview your integration's templates with sample data, run `npm run preview I Alternatively, to produce a sample `curl` command, run `npm run curl INTEGRATION_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. +## Trigger (`trigger`) + +The Trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. By default, the trigger URL contains a globally unique path parameter to provide security in the form of an [unguessable URL](https://www.schneier.com/blog/archives/2015/07/googles_unguess.html). However, if your service supports additional security settings such as shared secrets when firing webhooks, you can specify those with the optional `authentication` object. The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. + ## Reserved custom properties (`reservedCustomProperties`) Custom properties allow you to store data in LaunchDarkly alongside a feature flag. For example, you can use custom properties to indicate flag-level associations with data on your service. If you don't have any flag-level associations or configurations, you don't need to use this capability. diff --git a/manifest.schema.json b/manifest.schema.json index 5539eefe..190c49d4 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -351,7 +351,7 @@ "auditLogEventsHook", "reservedCustomProperties", "externalCondition", - "remoteUpdate" + "trigger" ] }, "properties": { @@ -1060,9 +1060,9 @@ } } }, - "remoteUpdate": { - "$id": "#/properties/capability/remote-update", - "title": "Remote update", + "trigger": { + "$id": "#/properties/capability/trigger", + "title": "Trigger", "description": "This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly", "type": "object", "propertyNames": { @@ -1077,15 +1077,15 @@ ], "properties": { "documentation": { - "$id": "#/properties/capability/remote-update/auth", + "$id": "#/properties/capability/trigger/auth", "title": "Documentation link", - "description": "URL to documentation describing how to configure the remote update.", + "description": "URL to documentation describing how to configure the trigger.", "type": "string", "maxLength": 2048, "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, "auth": { - "$id": "#/properties/capability/remote-update/auth", + "$id": "#/properties/capability/trigger/auth", "title": "Authentication", "description": "Authentication type - currently the only option is sharedSecret.", "type": "string", @@ -1094,7 +1094,7 @@ ] }, "parser": { - "$id": "#/properties/capability/remote-update/parser", + "$id": "#/properties/capability/trigger/parser", "title": "Body parser", "description": "The body parser describes a mapping of property name to a location in the JSON payload specified by a JSON pointer", "type": "object", @@ -1107,19 +1107,19 @@ }, "properties": { "alertName": { - "$id": "#/properties/capability/remote-update/parser/alert-name", + "$id": "#/properties/capability/trigger/parser/alert-name", "title": "Alert name pointer", "description": "JSON pointer to an alert name", "type": "string" }, "value": { - "$id": "#/properties/capability/remote-update/parser/value", + "$id": "#/properties/capability/trigger/parser/value", "title": "Value pointer", "description": "JSON pointer to a metric value", "type": "string" }, "url": { - "$id": "#/properties/capability/remote-update/parser/url", + "$id": "#/properties/capability/trigger/parser/url", "title": "URL pointer", "description": "JSON pointer to the external alert URL", "type": "string" diff --git a/schemas/base.json b/schemas/base.json index 35cabf5c..981b7398 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -315,7 +315,7 @@ "auditLogEventsHook", "reservedCustomProperties", "externalCondition", - "remoteUpdate" + "trigger" ] }, "properties": { @@ -328,8 +328,8 @@ "externalCondition": { "$ref": "schemas/capabilities/externalCondition.json#/externalCondition" }, - "remoteUpdate": { - "$ref": "schemas/capabilities/remoteUpdate.json#/remoteUpdate" + "trigger": { + "$ref": "schemas/capabilities/trigger.json#/trigger" } } } diff --git a/schemas/capabilities/remoteUpdate.json b/schemas/capabilities/trigger.json similarity index 75% rename from schemas/capabilities/remoteUpdate.json rename to schemas/capabilities/trigger.json index 8b2d9860..670263cc 100644 --- a/schemas/capabilities/remoteUpdate.json +++ b/schemas/capabilities/trigger.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "remoteUpdate": { - "$id": "#/properties/capability/remote-update", - "title": "Remote update", + "trigger": { + "$id": "#/properties/capability/trigger", + "title": "Trigger", "description": "This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly", "type": "object", "propertyNames": { @@ -11,22 +11,22 @@ "required": ["documentation"], "properties": { "documentation": { - "$id": "#/properties/capability/remote-update/auth", + "$id": "#/properties/capability/trigger/auth", "title": "Documentation link", - "description": "URL to documentation describing how to configure the remote update.", + "description": "URL to documentation describing how to configure the trigger.", "type": "string", "maxLength": 2048, "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" }, "auth": { - "$id": "#/properties/capability/remote-update/auth", + "$id": "#/properties/capability/trigger/auth", "title": "Authentication", "description": "Authentication type - currently the only option is sharedSecret.", "type": "string", "enum": ["sharedSecret"] }, "parser": { - "$id": "#/properties/capability/remote-update/parser", + "$id": "#/properties/capability/trigger/parser", "title": "Body parser", "description": "The body parser describes a mapping of property name to a location in the JSON payload specified by a JSON pointer", "type": "object", @@ -35,19 +35,19 @@ }, "properties": { "alertName": { - "$id": "#/properties/capability/remote-update/parser/alert-name", + "$id": "#/properties/capability/trigger/parser/alert-name", "title": "Alert name pointer", "description": "JSON pointer to an alert name", "type": "string" }, "value": { - "$id": "#/properties/capability/remote-update/parser/value", + "$id": "#/properties/capability/trigger/parser/value", "title": "Value pointer", "description": "JSON pointer to a metric value", "type": "string" }, "url": { - "$id": "#/properties/capability/remote-update/parser/url", + "$id": "#/properties/capability/trigger/parser/url", "title": "URL pointer", "description": "JSON pointer to the external alert URL", "type": "string" From 7f98e497a84e046007d1a8248827722789ca0a10 Mon Sep 17 00:00:00 2001 From: Wei We Lu Date: Wed, 8 Jul 2020 14:53:58 -0700 Subject: [PATCH 314/936] Testing Azure Event Hub integration --- integrations/azure-event-hub/LICENSE.md | 13 ++++++++++++ .../azure-event-hub/assets/images/square.svg | 1 + integrations/azure-event-hub/manifest.json | 21 +++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 integrations/azure-event-hub/LICENSE.md create mode 100644 integrations/azure-event-hub/assets/images/square.svg create mode 100644 integrations/azure-event-hub/manifest.json diff --git a/integrations/azure-event-hub/LICENSE.md b/integrations/azure-event-hub/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/azure-event-hub/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/azure-event-hub/assets/images/square.svg b/integrations/azure-event-hub/assets/images/square.svg new file mode 100644 index 00000000..a413f77f --- /dev/null +++ b/integrations/azure-event-hub/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/azure-event-hub/manifest.json b/integrations/azure-event-hub/manifest.json new file mode 100644 index 00000000..db995dc2 --- /dev/null +++ b/integrations/azure-event-hub/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Azure Envent Hub WIP", + "version": "1.0.0", + "overview": "Export real-time flag analytics data.", + "description": "Export your real-time flag analytics data to mParticle.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://azure.microsoft.com/en-us/services/event-hubs/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/mparticle", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "legacy": { + "kind": "dataExport" + } +} From 22f7e6261033302fc4867d4bf68365f8ed87f28e Mon Sep 17 00:00:00 2001 From: Wei We Lu Date: Wed, 8 Jul 2020 15:37:46 -0700 Subject: [PATCH 315/936] Requested changes --- integrations/azure-event-hub/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/azure-event-hub/manifest.json b/integrations/azure-event-hub/manifest.json index db995dc2..90a5e091 100644 --- a/integrations/azure-event-hub/manifest.json +++ b/integrations/azure-event-hub/manifest.json @@ -1,5 +1,5 @@ { - "name": "Azure Envent Hub WIP", + "name": "Azure Event Hub", "version": "1.0.0", "overview": "Export real-time flag analytics data.", "description": "Export your real-time flag analytics data to mParticle.", From d0647fbe4a977ae95a7dc8a6dcd81a6297ee033c Mon Sep 17 00:00:00 2001 From: Wei We Lu Date: Wed, 8 Jul 2020 15:40:36 -0700 Subject: [PATCH 316/936] Requested changes --- integrations/azure-event-hub/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/azure-event-hub/manifest.json b/integrations/azure-event-hub/manifest.json index 90a5e091..f425ed71 100644 --- a/integrations/azure-event-hub/manifest.json +++ b/integrations/azure-event-hub/manifest.json @@ -2,7 +2,7 @@ "name": "Azure Event Hub", "version": "1.0.0", "overview": "Export real-time flag analytics data.", - "description": "Export your real-time flag analytics data to mParticle.", + "description": "Export your real-time flag analytics data to Azure Event Hub.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From aa2a8442cbd76c7a63f10c97e5b2856a630afbd5 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 10 Jul 2020 10:40:54 -0700 Subject: [PATCH 317/936] Update heap url (#154) --- integrations/heap/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index fc693d0d..a4545042 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -9,6 +9,7 @@ "links": { "supportWebsite": "https://help.heap.io/", "site": "https://heap.io/", + "launchdarklyDocs": "https://help.heap.io/integrations/testing-and-personalization/launchdarkly/", "privacyPolicy": "https://heap.io/privacy" }, "categories": ["analytics"], From fa1a8e437e54be4dc849bc2cd337c61a6b26153d Mon Sep 17 00:00:00 2001 From: Rich Manalang Date: Mon, 13 Jul 2020 11:12:13 -0700 Subject: [PATCH 318/936] Change New Relic integration to use their deployment api (#153) --- integrations/new-relic-apm/README.md | 11 ++++ .../assets/images/new-relic-horizontal.svg | 20 ++++++ .../assets/images/new-relic-square.svg | 12 ++++ integrations/new-relic-apm/manifest.json | 63 +++++++++++++++++++ .../new-relic-apm/templates/flag.json.hbs | 9 +++ integrations/new-relic/manifest.json | 4 +- 6 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 integrations/new-relic-apm/README.md create mode 100644 integrations/new-relic-apm/assets/images/new-relic-horizontal.svg create mode 100644 integrations/new-relic-apm/assets/images/new-relic-square.svg create mode 100644 integrations/new-relic-apm/manifest.json create mode 100644 integrations/new-relic-apm/templates/flag.json.hbs diff --git a/integrations/new-relic-apm/README.md b/integrations/new-relic-apm/README.md new file mode 100644 index 00000000..6a89456d --- /dev/null +++ b/integrations/new-relic-apm/README.md @@ -0,0 +1,11 @@ +# New Relic + +[User documentation](https://docs.launchdarkly.com/integrations/new-relic) + +[API documentation](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments) + +Run `npm run curl new-relic-apm` in the root repository directory to generate a `curl` command to send data to New Relic. + +Please note that this integration requires a New Relic APM account to function. +You should be able to see all LaunchDarkly flag events on the Deployment page +of you APM console. diff --git a/integrations/new-relic-apm/assets/images/new-relic-horizontal.svg b/integrations/new-relic-apm/assets/images/new-relic-horizontal.svg new file mode 100644 index 00000000..3c23784f --- /dev/null +++ b/integrations/new-relic-apm/assets/images/new-relic-horizontal.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/new-relic-apm/assets/images/new-relic-square.svg b/integrations/new-relic-apm/assets/images/new-relic-square.svg new file mode 100644 index 00000000..dcf7f0c0 --- /dev/null +++ b/integrations/new-relic-apm/assets/images/new-relic-square.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/integrations/new-relic-apm/manifest.json b/integrations/new-relic-apm/manifest.json new file mode 100644 index 00000000..9ab8c89a --- /dev/null +++ b/integrations/new-relic-apm/manifest.json @@ -0,0 +1,63 @@ +{ + "name": "New Relic", + "version": "1.0.0", + "overview": "Monitor LaunchDarkly flag events in New Relic APM", + "description": "This integration sends LaunchDarkly audit events to New Relic APM as [deployment events](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments).", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://newrelic.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/new-relic", + "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/images/new-relic-square.svg", + "horizontal": "assets/images/new-relic-horizontal.svg" + }, + "formVariables": [ + { + "key": "apiKey", + "name": "New Relic REST API key", + "description": "Enter your [New Relic REST API key](https://docs.newrelic.com/docs/apis/get-started/intro-apis/types-new-relic-api-keys#rest-api-key).", + "type": "string", + "isSecret": true + }, + { + "key": "applicationId", + "name": "New Relic application ID", + "description": "Enter your [New Relic application ID](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/app-id-other-product-ids#ui).", + "type": "string", + "placeholder": "123456" + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "https://api.newrelic.com/v2/applications/{{applicationId}}/deployments.json", + "method": "POST", + "headers": [ + { + "name": "X-Api-Key", + "value": "{{apiKey}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "flag": "templates/flag.json.hbs", + "validation": "templates/flag.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/new-relic-apm/templates/flag.json.hbs b/integrations/new-relic-apm/templates/flag.json.hbs new file mode 100644 index 00000000..3012be53 --- /dev/null +++ b/integrations/new-relic-apm/templates/flag.json.hbs @@ -0,0 +1,9 @@ +{ + "deployment": { + "revision": "{{project.key}}/{{project.environment.key}}/{{key}}-{{timestamp.milliseconds}}", + "changelog": "{{{title.plainText}}}", + "description": "{{{title.plainText}}}{{#if comment}}, Comment: {{comment}}{{/if}}", + "user": "{{#if member.firstName}}{{member.firstName}}{{#if member.lastName}} {{/if}}{{/if}}{{#if member.lastName}}{{member.lastName}}{{/if}}", + "timestamp": "{{timestamp.rfc3339}}" + } +} diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index d0ae9e7f..96dad94c 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -1,7 +1,7 @@ { - "name": "New Relic", + "name": "New Relic Insights Pro [Deprecated]", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag events in New Relic", + "overview": "Monitor LaunchDarkly flag events in New Relic Insights Pro", "description": "This integration sends LaunchDarkly audit events to New Relic. Please note that it requires a paid Insights subscription to function.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", From cc248421bb1c23d1423745af7941f070c7f82063 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 16 Jul 2020 08:40:06 -0700 Subject: [PATCH 319/936] adding code snippets and validation template info to docs (#155) --- docs/capabilities.md | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index e06de7b2..477f6d89 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -112,6 +112,18 @@ Before the `auditLogEventsHook` capability sends the request to the endpoint handling your webhook, you can transform the body of the request sent to your handler. +In your manifest, you can specify templates to be executed when webhook events are of kinds `flag`, `project`, and `environment`. Additionally, you can specify a `default` template as a catch-all for any event without a more specific template. A `validation` template is also provided in case you want to provide users with the ability to validate their connection by sending a test event from LaunchDarkly to your service. + +```json + "templates": { + "default": "templates/default.json.hbs", + "flag": "templates/flag.json.hbs", + "project": "templates/project.json.hbs", + "environment": "templates/environment.json.hbs", + "validation": "templates/default.json.hbs" + }, +``` + If you don't provide one or more templates, LaunchDarkly sends you a default JSON payload that looks like this: @@ -233,7 +245,25 @@ Alternatively, to produce a sample `curl` command, run `npm run curl INTEGRATION ## Trigger (`trigger`) -The Trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. By default, the trigger URL contains a globally unique path parameter to provide security in the form of an [unguessable URL](https://www.schneier.com/blog/archives/2015/07/googles_unguess.html). However, if your service supports additional security settings such as shared secrets when firing webhooks, you can specify those with the optional `authentication` object. The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. +The trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. By default, the trigger URL contains a globally unique path parameter to provide security in the form of an [unguessable URL](https://www.schneier.com/blog/archives/2015/07/googles_unguess.html). However, if your service supports additional security settings such as shared secrets when firing webhooks, you can specify those with the optional `auth` object. The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. + +If your webhooks' request bodies are non-empty, you can specify the optional `parser` object with one or more of `alertName`, `value`, and `url`. The provided values will flow through LaunchDarkly into the resulting audit log messages when your service invokes a trigger in LaunchDarkly. + +Here is a sample `trigger` capability including all optional properties: + +```json + "trigger": { + "documentation": "https://example.com/configuring-webhooks", + "auth": { + "type": "sharedSecret" + }, + "parser": { + "alertName": "/alert", + "value": "/value", + "url": "/links/self/href" + }, + } +``` ## Reserved custom properties (`reservedCustomProperties`) @@ -246,3 +276,14 @@ By default, users must specify a custom property name and key when they attach t Reserved custom properties are simple to define. Their only requirements are a `name` and `key`. After your integration is configured by a user, the custom property starts appearing in the dropdown on the flag's Settings page. + +Here is a sample `reservedCustomProperties` capability: + +```json + "reservedCustomProperties": [ + { + "name": "Foobar Entities", + "key": "foobar" + } + ], +``` From 54fc3de9a945117dd14da9f8f582a7fdc85bcecc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 19 Jul 2020 11:31:30 +0100 Subject: [PATCH 320/936] Bump lodash from 4.17.15 to 4.17.19 (#158) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f026e66..3cb9cc93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2874,9 +2874,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, "lodash.sortby": { diff --git a/package.json b/package.json index d7e15929..face769d 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "jest": "25.1.0", "jest-expect-message": "1.0.2", "jsonpointer": "^4.0.1", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "prettier": "^2.0.1" } } From 05eef8904eb6f7d869916679e48b6ef18e40f6e5 Mon Sep 17 00:00:00 2001 From: Wei We Lu Date: Mon, 20 Jul 2020 11:17:58 -0700 Subject: [PATCH 321/936] Fixed name of integration (from azure-event-hub to azure-event-hubs) --- .../{azure-event-hub => azure-event-hubs}/LICENSE.md | 0 .../assets/images/square.svg | 0 .../{azure-event-hub => azure-event-hubs}/manifest.json | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) rename integrations/{azure-event-hub => azure-event-hubs}/LICENSE.md (100%) rename integrations/{azure-event-hub => azure-event-hubs}/assets/images/square.svg (100%) rename integrations/{azure-event-hub => azure-event-hubs}/manifest.json (89%) diff --git a/integrations/azure-event-hub/LICENSE.md b/integrations/azure-event-hubs/LICENSE.md similarity index 100% rename from integrations/azure-event-hub/LICENSE.md rename to integrations/azure-event-hubs/LICENSE.md diff --git a/integrations/azure-event-hub/assets/images/square.svg b/integrations/azure-event-hubs/assets/images/square.svg similarity index 100% rename from integrations/azure-event-hub/assets/images/square.svg rename to integrations/azure-event-hubs/assets/images/square.svg diff --git a/integrations/azure-event-hub/manifest.json b/integrations/azure-event-hubs/manifest.json similarity index 89% rename from integrations/azure-event-hub/manifest.json rename to integrations/azure-event-hubs/manifest.json index f425ed71..b509030f 100644 --- a/integrations/azure-event-hub/manifest.json +++ b/integrations/azure-event-hubs/manifest.json @@ -1,13 +1,13 @@ { - "name": "Azure Event Hub", + "name": "Azure Event Hubs", "version": "1.0.0", "overview": "Export real-time flag analytics data.", - "description": "Export your real-time flag analytics data to Azure Event Hub.", + "description": "Export your real-time flag analytics data to Azure Event Hubs.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://azure.microsoft.com/en-us/services/event-hubs/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/mparticle", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], From 67e1ef7e273cab31449b4465b0b36f568e0929e6 Mon Sep 17 00:00:00 2001 From: Wei We Lu Date: Mon, 20 Jul 2020 11:24:49 -0700 Subject: [PATCH 322/936] Added integration icon --- .../azure-event-hubs/assets/images/square.svg | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/integrations/azure-event-hubs/assets/images/square.svg b/integrations/azure-event-hubs/assets/images/square.svg index a413f77f..5361ad08 100644 --- a/integrations/azure-event-hubs/assets/images/square.svg +++ b/integrations/azure-event-hubs/assets/images/square.svg @@ -1 +1,22 @@ - + + + + + + + + + + + + From dd5940eef730de41d9fe89f2ad35d253c368d0d3 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 21 Jul 2020 08:31:22 +0100 Subject: [PATCH 323/936] Remove validation templates from integrations with configurable hosts (#160) --- integrations/elastic/manifest.json | 3 +-- integrations/grafana/manifest.json | 3 +-- integrations/splunk/manifest.json | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/integrations/elastic/manifest.json b/integrations/elastic/manifest.json index 1818e0ec..ce9abb95 100644 --- a/integrations/elastic/manifest.json +++ b/integrations/elastic/manifest.json @@ -60,8 +60,7 @@ ] }, "templates": { - "default": "templates/template.json.hbs", - "validation": "templates/template.json.hbs" + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 03540ebc..477843f1 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -49,8 +49,7 @@ ] }, "templates": { - "default": "templates/template.json.hbs", - "validation": "templates/template.json.hbs" + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 24b8aec7..b2859e7b 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -56,8 +56,7 @@ ] }, "templates": { - "default": "templates/template.json.hbs", - "validation": "templates/template.json.hbs" + "default": "templates/template.json.hbs" }, "defaultPolicy": [ { From d1b80e31a4d04432c027136991b09526baaf4d5c Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 21 Jul 2020 18:18:26 +0100 Subject: [PATCH 324/936] Remove MSteams validation (#163) --- integrations/msteams/manifest.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index ecd81021..113ff785 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -39,8 +39,7 @@ "templates": { "project": "templates/project.json.hbs", "environment": "templates/environment.json.hbs", - "default": "templates/default.json.hbs", - "validation": "templates/default.json.hbs" + "default": "templates/default.json.hbs" }, "defaultPolicy": [ { From a1d4e72a8011bdd6c8f26abf2909c58f355ee80e Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 23 Jul 2020 10:47:58 +0100 Subject: [PATCH 325/936] Re-enable validation template for configurable host integrations (#165) --- integrations/elastic/manifest.json | 3 ++- integrations/grafana/manifest.json | 3 ++- integrations/msteams/manifest.json | 3 ++- integrations/splunk/manifest.json | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/integrations/elastic/manifest.json b/integrations/elastic/manifest.json index ce9abb95..1818e0ec 100644 --- a/integrations/elastic/manifest.json +++ b/integrations/elastic/manifest.json @@ -60,7 +60,8 @@ ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.json.hbs", + "validation": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 477843f1..03540ebc 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -49,7 +49,8 @@ ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.json.hbs", + "validation": "templates/template.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index 113ff785..ecd81021 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -39,7 +39,8 @@ "templates": { "project": "templates/project.json.hbs", "environment": "templates/environment.json.hbs", - "default": "templates/default.json.hbs" + "default": "templates/default.json.hbs", + "validation": "templates/default.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index b2859e7b..24b8aec7 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -56,7 +56,8 @@ ] }, "templates": { - "default": "templates/template.json.hbs" + "default": "templates/template.json.hbs", + "validation": "templates/template.json.hbs" }, "defaultPolicy": [ { From 3589d3c1f9314884cbb8138f77178091c125bb3a Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 23 Jul 2020 12:10:27 +0100 Subject: [PATCH 326/936] Imiller/ch83288/add trigger to datadog manifest (#168) * add trigger capability to datadog manifest * add parser * add note to docs about payload --- integrations/datadog/README.md | 12 ++++++++++++ integrations/datadog/manifest.json | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/integrations/datadog/README.md b/integrations/datadog/README.md index 9767165a..1e01e244 100644 --- a/integrations/datadog/README.md +++ b/integrations/datadog/README.md @@ -8,3 +8,15 @@ Run `npm run curl datadog` in the root repository directory to generate a `curl` **Note:** This integration currently lives alongside the "legacy" Datadog integration. This integration should not be enabled in production until all legacy subscriptions have been migrated + +### Triggers + +Consult the [Datadog documentation](https://docs.datadoghq.com/integrations/webhooks/) to set up outgoing webhooks from your Datadog account. + +When configuring a new webhook in Datadog, there will be the option to specify the payload. In order for LaunchDarkly to parse the payload correctly, it will need to be as follows: +``` +{ +"alert_name": "$ALERT_METRIC", +"url": "$LINK", +} +``` diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index b9d511e5..5a5851ae 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -70,6 +70,13 @@ "actions": ["*"] } ] + }, + "trigger": { + "documentation": "https://docs.launchdarkly.com/integrations/datadog", + "parser": { + "alertName": "/alert_name", + "url": "/url" + } } } } From 339916dd1129eafa1d9cc9f13f054a32fe050035 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 23 Jul 2020 15:02:08 +0100 Subject: [PATCH 327/936] Imiller/ch83287/add trigger to honeycomb manifest (#169) * add trigger to honeycomb + update readme * add sample payload * add some more detail to datadog readme * add parser --- integrations/datadog/README.md | 5 +++- integrations/honeycomb/README.md | 36 ++++++++++++++++++++++++++++ integrations/honeycomb/manifest.json | 8 +++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/integrations/datadog/README.md b/integrations/datadog/README.md index 1e01e244..2544386e 100644 --- a/integrations/datadog/README.md +++ b/integrations/datadog/README.md @@ -13,10 +13,13 @@ Run `npm run curl datadog` in the root repository directory to generate a `curl` Consult the [Datadog documentation](https://docs.datadoghq.com/integrations/webhooks/) to set up outgoing webhooks from your Datadog account. -When configuring a new webhook in Datadog, there will be the option to specify the payload. In order for LaunchDarkly to parse the payload correctly, it will need to be as follows: +When [configuring a new webhook in Datadog](https://app.datadoghq.com/account/settings#integrations/webhooks), there will be the option to specify the payload. In order for LaunchDarkly to parse the payload correctly, it will need to be as follows: ``` { "alert_name": "$ALERT_METRIC", "url": "$LINK", } ``` +If we wish to change this in the future, the full list of fields we can configure in Datadog webhooks can be found [here](https://docs.datadoghq.com/integrations/webhooks/). + +To test, you'll have to attach the webhook to a monitor by putting `@webhook-` into the text of the alert you want and then test from the monitor configuration page by clicking the 'Test Notifications' button at the bottom. diff --git a/integrations/honeycomb/README.md b/integrations/honeycomb/README.md index 91c6bffe..01377c2b 100644 --- a/integrations/honeycomb/README.md +++ b/integrations/honeycomb/README.md @@ -5,3 +5,39 @@ [API documentation](https://docs.honeycomb.io/api/markers/) Run `npm run curl honeycomb` in the root repository directory to generate a `curl` command to send data to Honeycomb. + + +### Triggers + +Please consult the [Honeycomb documentation](https://docs.honeycomb.io/working-with-your-data/triggers/) to configure webhooks/triggers from your Honeycomb account. + +To test, go to the [Honeycomb Integration Center](https://ui.honeycomb.io/teams/launchdarkly/integrations) and create a new integration of type 'Webhook'. You need to enter a shared secret to create the webhook but it will not affect the request. There is the option to 'Test' at this point. + +To make sure it works on the trigger itself, you'll have to go to the 'Triggers' tab and add the integration you just created as a recipient on any one of the triggers (all the way at the bottom). Once saved, there should also be the option to 'Test' at this point. + +A sample payload looks like this: +``` +{ + "version":"v0.1.0", + "name":"LD Trigger Test", + "id":"HpPzqZtCNA5", + "trigger_description":"test trigger to test new LD trigger workflows", + "status":"TRIGGERED", + "summary":"TRIGGER TEST: Triggered: LD Trigger Test", + "description":"Current value greater than threshold value (0)", + "operator":"greater than", + "threshold":0, + "result_url":"https://ui.honeycomb.io/launchdarkly/datasets/sunny-dev/result/g8Pwij7UvK7", + "result_groups":[ + { + "Group":{ + "account_id":null + }, + "Result":0 + } + ], + "result_groups_triggered":[], + "trigger_url":"https://ui.honeycomb.io/launchdarkly/datasets/sunny-dev/triggers/HpPzqZtCNA5", + "is_test":true +} +``` diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index b073168d..1fe84af3 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -59,6 +59,14 @@ "actions": ["*"] } ] + }, + "trigger": { + "documentation": "https://docs.launchdarkly.com/integrations/honeycomb", + "parser": { + "alertName": "/name", + "value": "/threshold", + "url": "/result_url" + } } } } From 002deab54ed53d416c5379da916de07a4d0c6f67 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 23 Jul 2020 15:29:58 +0100 Subject: [PATCH 328/936] remove value from parser --- integrations/honeycomb/manifest.json | 1 - 1 file changed, 1 deletion(-) diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 1fe84af3..276704bb 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -64,7 +64,6 @@ "documentation": "https://docs.launchdarkly.com/integrations/honeycomb", "parser": { "alertName": "/name", - "value": "/threshold", "url": "/result_url" } } From 91cdffd4cd10f84876fdebd1388e033a5dde642f Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 23 Jul 2020 15:33:01 +0100 Subject: [PATCH 329/936] switch out launchdarkly for team name var --- integrations/honeycomb/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/honeycomb/README.md b/integrations/honeycomb/README.md index 01377c2b..9401ae8b 100644 --- a/integrations/honeycomb/README.md +++ b/integrations/honeycomb/README.md @@ -11,7 +11,7 @@ Run `npm run curl honeycomb` in the root repository directory to generate a `cur Please consult the [Honeycomb documentation](https://docs.honeycomb.io/working-with-your-data/triggers/) to configure webhooks/triggers from your Honeycomb account. -To test, go to the [Honeycomb Integration Center](https://ui.honeycomb.io/teams/launchdarkly/integrations) and create a new integration of type 'Webhook'. You need to enter a shared secret to create the webhook but it will not affect the request. There is the option to 'Test' at this point. +To test, go to the Honeycomb Integration Center at https://ui.honeycomb.io/teams//integrations and create a new integration of type 'Webhook'. You need to enter a shared secret to create the webhook but it will not affect the request. There is the option to 'Test' at this point. To make sure it works on the trigger itself, you'll have to go to the 'Triggers' tab and add the integration you just created as a recipient on any one of the triggers (all the way at the bottom). Once saved, there should also be the option to 'Test' at this point. From f3d79498daff472d2631d39069db23796652a1c3 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 23 Jul 2020 15:38:16 +0100 Subject: [PATCH 330/936] Revert "switch out launchdarkly for team name var" This reverts commit 91cdffd4cd10f84876fdebd1388e033a5dde642f. --- integrations/honeycomb/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/honeycomb/README.md b/integrations/honeycomb/README.md index 9401ae8b..01377c2b 100644 --- a/integrations/honeycomb/README.md +++ b/integrations/honeycomb/README.md @@ -11,7 +11,7 @@ Run `npm run curl honeycomb` in the root repository directory to generate a `cur Please consult the [Honeycomb documentation](https://docs.honeycomb.io/working-with-your-data/triggers/) to configure webhooks/triggers from your Honeycomb account. -To test, go to the Honeycomb Integration Center at https://ui.honeycomb.io/teams//integrations and create a new integration of type 'Webhook'. You need to enter a shared secret to create the webhook but it will not affect the request. There is the option to 'Test' at this point. +To test, go to the [Honeycomb Integration Center](https://ui.honeycomb.io/teams/launchdarkly/integrations) and create a new integration of type 'Webhook'. You need to enter a shared secret to create the webhook but it will not affect the request. There is the option to 'Test' at this point. To make sure it works on the trigger itself, you'll have to go to the 'Triggers' tab and add the integration you just created as a recipient on any one of the triggers (all the way at the bottom). Once saved, there should also be the option to 'Test' at this point. From fd3c16824f9e3c23f0322e7638a0ee17376bfca5 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 23 Jul 2020 15:39:07 +0100 Subject: [PATCH 331/936] Revert "remove value from parser" This reverts commit 002deab54ed53d416c5379da916de07a4d0c6f67. --- integrations/honeycomb/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 276704bb..1fe84af3 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -64,6 +64,7 @@ "documentation": "https://docs.launchdarkly.com/integrations/honeycomb", "parser": { "alertName": "/name", + "value": "/threshold", "url": "/result_url" } } From 72652998d28f2490b7a8422266a57e279dc222be Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 23 Jul 2020 15:58:52 +0100 Subject: [PATCH 332/936] update link to integrations center and remove value from parser (#170) --- integrations/honeycomb/README.md | 2 +- integrations/honeycomb/manifest.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/integrations/honeycomb/README.md b/integrations/honeycomb/README.md index 01377c2b..97393205 100644 --- a/integrations/honeycomb/README.md +++ b/integrations/honeycomb/README.md @@ -11,7 +11,7 @@ Run `npm run curl honeycomb` in the root repository directory to generate a `cur Please consult the [Honeycomb documentation](https://docs.honeycomb.io/working-with-your-data/triggers/) to configure webhooks/triggers from your Honeycomb account. -To test, go to the [Honeycomb Integration Center](https://ui.honeycomb.io/teams/launchdarkly/integrations) and create a new integration of type 'Webhook'. You need to enter a shared secret to create the webhook but it will not affect the request. There is the option to 'Test' at this point. +To test, go to the Honeycomb Integration Center at https://ui.honeycomb.io/teams//integrations and create a new integration of type 'Webhook'. You need to enter a shared secret to create the webhook but it will not affect the request. There is the option to 'Test' at this point. To make sure it works on the trigger itself, you'll have to go to the 'Triggers' tab and add the integration you just created as a recipient on any one of the triggers (all the way at the bottom). Once saved, there should also be the option to 'Test' at this point. diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 1fe84af3..276704bb 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -64,7 +64,6 @@ "documentation": "https://docs.launchdarkly.com/integrations/honeycomb", "parser": { "alertName": "/name", - "value": "/threshold", "url": "/result_url" } } From f3cd621d5be961cf60586a247084558dd701f74e Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Fri, 24 Jul 2020 10:11:12 -0700 Subject: [PATCH 333/936] Update event-hub integration link --- integrations/azure-event-hubs/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/azure-event-hubs/manifest.json b/integrations/azure-event-hubs/manifest.json index b509030f..951077c6 100644 --- a/integrations/azure-event-hubs/manifest.json +++ b/integrations/azure-event-hubs/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://azure.microsoft.com/en-us/services/event-hubs/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/event-hub", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], From 4352f9a3e2fa8265d8cdde31ef5df10ba5c8af1c Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 24 Jul 2020 16:47:20 -0700 Subject: [PATCH 334/936] Fix broken trigger doc link (#172) --- docs/capabilities.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index 477f6d89..e789d85c 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -5,7 +5,7 @@ Your integration's `capabilities` describe how it interacts with LaunchDarkly. We support three capabilities: - [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`) -- [Trigger](#trigger) (`trigger`) +- [Trigger](#trigger-trigger) (`trigger`) - [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) ## Audit log events hook (`auditLogEventsHook`) From 5e9ac5d0c91827b8f0d5fc910bcb9b6780986c73 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Tue, 28 Jul 2020 13:01:29 -0700 Subject: [PATCH 335/936] Minor trigger doc update (#173) --- docs/capabilities.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index e789d85c..8f53c6ca 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -245,7 +245,13 @@ Alternatively, to produce a sample `curl` command, run `npm run curl INTEGRATION ## Trigger (`trigger`) -The trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. By default, the trigger URL contains a globally unique path parameter to provide security in the form of an [unguessable URL](https://www.schneier.com/blog/archives/2015/07/googles_unguess.html). However, if your service supports additional security settings such as shared secrets when firing webhooks, you can specify those with the optional `auth` object. The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. +**At the time of this writing, LaunchDarkly's trigger functionality is only available to customers opted in to an early access program. Email [partnerships@launchdarkly.com](mailto:partnerships@launchdarkly.com) to request access.** + +The trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. + +By default, the trigger URL contains a globally unique path parameter to provide security in the form of an [unguessable URL](https://www.schneier.com/blog/archives/2015/07/googles_unguess.html). However, if your service supports additional security settings such as shared secrets when firing webhooks, you can specify those with the optional `auth` object. **Note**: at launch, the `auth` attribute is unsupported and should be omitted. + +The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. If your webhooks' request bodies are non-empty, you can specify the optional `parser` object with one or more of `alertName`, `value`, and `url`. The provided values will flow through LaunchDarkly into the resulting audit log messages when your service invokes a trigger in LaunchDarkly. From b5213fac254ce0bbcdbc92b838cd496fab8d9014 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 30 Jul 2020 14:30:19 +0100 Subject: [PATCH 336/936] Imiller/ch84138/use goaltender parsers when handling inbound (#174) * rename parser paths * rename external condition parser * split trigger parser out into separate parser schema file * remove redundant id paths * Revert "remove redundant id paths" This reverts commit c8c0e7c6a7653c06a03315836f807a5a1fed0cdd. * Revert "split trigger parser out into separate parser schema file" This reverts commit bc3adb0c1a1f0c4e278b9e7a11c21ae38868eb9b. * Revert "rename external condition parser" This reverts commit 7a5dcdbd876c2fbba14f4bd66d7777b6deb1c55d. * Revert "rename parser paths" This reverts commit c131dca2fb0760a1bf32205377a1d749597a896a. * rename trigger parser from 'parser' to 'trigger-parser' * oops make it trigger parser, not trigger body parser --- manifest.schema.json | 12 ++++++------ schemas/capabilities/trigger.json | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest.schema.json b/manifest.schema.json index 190c49d4..72a7c200 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1094,9 +1094,9 @@ ] }, "parser": { - "$id": "#/properties/capability/trigger/parser", - "title": "Body parser", - "description": "The body parser describes a mapping of property name to a location in the JSON payload specified by a JSON pointer", + "$id": "#/properties/capability/trigger/trigger-parser", + "title": "Trigger parser", + "description": "Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer", "type": "object", "propertyNames": { "enum": [ @@ -1107,19 +1107,19 @@ }, "properties": { "alertName": { - "$id": "#/properties/capability/trigger/parser/alert-name", + "$id": "#/properties/capability/trigger/trigger-parser/alert-name", "title": "Alert name pointer", "description": "JSON pointer to an alert name", "type": "string" }, "value": { - "$id": "#/properties/capability/trigger/parser/value", + "$id": "#/properties/capability/trigger/trigger-parser/value", "title": "Value pointer", "description": "JSON pointer to a metric value", "type": "string" }, "url": { - "$id": "#/properties/capability/trigger/parser/url", + "$id": "#/properties/capability/trigger/trigger-parser/url", "title": "URL pointer", "description": "JSON pointer to the external alert URL", "type": "string" diff --git a/schemas/capabilities/trigger.json b/schemas/capabilities/trigger.json index 670263cc..c4f5bcf6 100644 --- a/schemas/capabilities/trigger.json +++ b/schemas/capabilities/trigger.json @@ -26,28 +26,28 @@ "enum": ["sharedSecret"] }, "parser": { - "$id": "#/properties/capability/trigger/parser", - "title": "Body parser", - "description": "The body parser describes a mapping of property name to a location in the JSON payload specified by a JSON pointer", + "$id": "#/properties/capability/trigger/trigger-parser", + "title": "Trigger parser", + "description": "Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer", "type": "object", "propertyNames": { "enum": ["alertName", "value", "url"] }, "properties": { "alertName": { - "$id": "#/properties/capability/trigger/parser/alert-name", + "$id": "#/properties/capability/trigger/trigger-parser/alert-name", "title": "Alert name pointer", "description": "JSON pointer to an alert name", "type": "string" }, "value": { - "$id": "#/properties/capability/trigger/parser/value", + "$id": "#/properties/capability/trigger/trigger-parser/value", "title": "Value pointer", "description": "JSON pointer to a metric value", "type": "string" }, "url": { - "$id": "#/properties/capability/trigger/parser/url", + "$id": "#/properties/capability/trigger/trigger-parser/url", "title": "URL pointer", "description": "JSON pointer to the external alert URL", "type": "string" From 62e1deb847c6431413678e6a46ada6962174b370 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 30 Jul 2020 08:32:17 -0700 Subject: [PATCH 337/936] Use the COMMIT_MSG var (#175) --- scripts/merge_to_public.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/merge_to_public.sh b/scripts/merge_to_public.sh index a0dfc2f1..36c1b9df 100755 --- a/scripts/merge_to_public.sh +++ b/scripts/merge_to_public.sh @@ -22,7 +22,7 @@ git remote add private git@github.com:launchdarkly/integration-framework-private git checkout master git fetch private git merge private/master --squash --strategy-option=theirs -git commit -a -m "${1}" # Merge conflicts will need to be resolved manually +git commit -a -m "${COMMIT_MSG}" # Merge conflicts will need to be resolved manually git push origin master cd ../.. From a5cf4b21c0db6882c800b0415dea2d8105420c66 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 31 Jul 2020 16:26:55 +0100 Subject: [PATCH 338/936] Add support for generic trigger (#176) * Add generic trigger * Update description and logo * Remove templates * Add readme --- integrations/generic-trigger/LICENSE.md | 13 +++++++++ integrations/generic-trigger/README.md | 6 +++++ .../assets/images/horizontal.svg | 4 +++ .../generic-trigger/assets/images/square.svg | 1 + integrations/generic-trigger/manifest.json | 27 +++++++++++++++++++ 5 files changed, 51 insertions(+) create mode 100644 integrations/generic-trigger/LICENSE.md create mode 100644 integrations/generic-trigger/README.md create mode 100644 integrations/generic-trigger/assets/images/horizontal.svg create mode 100644 integrations/generic-trigger/assets/images/square.svg create mode 100644 integrations/generic-trigger/manifest.json diff --git a/integrations/generic-trigger/LICENSE.md b/integrations/generic-trigger/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/generic-trigger/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/generic-trigger/README.md b/integrations/generic-trigger/README.md new file mode 100644 index 00000000..511a5371 --- /dev/null +++ b/integrations/generic-trigger/README.md @@ -0,0 +1,6 @@ +# Incoming webhook trigger + +TODO: + - Add new icon + - Update doc links + - Update description diff --git a/integrations/generic-trigger/assets/images/horizontal.svg b/integrations/generic-trigger/assets/images/horizontal.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/generic-trigger/assets/images/horizontal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/generic-trigger/assets/images/square.svg b/integrations/generic-trigger/assets/images/square.svg new file mode 100644 index 00000000..d519b566 --- /dev/null +++ b/integrations/generic-trigger/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json new file mode 100644 index 00000000..a6e00e96 --- /dev/null +++ b/integrations/generic-trigger/manifest.json @@ -0,0 +1,27 @@ +{ + "name": "Incoming Webhook Trigger", + "version": "1.0.0", + "overview": "Remotely trigger flag changes using a unique webhook URL", + "description": "Remotely trigger flag changes using a unique webhook URL", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://launchdarkly.com", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["automation", "developer-tools"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "capabilities": { + "trigger": { + "documentation": "https://docs.launchdarkly.com", + "parser": { + "alertName": "alertName", + "value": "value", + "url": "url" + } + } + } +} From a75a05683bb835defa59da191e53a370aa6c4599 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 31 Jul 2020 18:28:06 +0100 Subject: [PATCH 339/936] Change name to Generic (#178) --- integrations/generic-trigger/README.md | 2 +- integrations/generic-trigger/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/generic-trigger/README.md b/integrations/generic-trigger/README.md index 511a5371..c6938b37 100644 --- a/integrations/generic-trigger/README.md +++ b/integrations/generic-trigger/README.md @@ -1,4 +1,4 @@ -# Incoming webhook trigger +# Generic trigger TODO: - Add new icon diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json index a6e00e96..e2c75267 100644 --- a/integrations/generic-trigger/manifest.json +++ b/integrations/generic-trigger/manifest.json @@ -1,5 +1,5 @@ { - "name": "Incoming Webhook Trigger", + "name": "Generic", "version": "1.0.0", "overview": "Remotely trigger flag changes using a unique webhook URL", "description": "Remotely trigger flag changes using a unique webhook URL", From 45d74524201c12aef43c223922a66a19f30b854d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 31 Jul 2020 18:49:01 +0100 Subject: [PATCH 340/936] Update README to call out "trigger" auto-append (#179) * Update README * grammar --- docs/capabilities.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/capabilities.md b/docs/capabilities.md index 8f53c6ca..115ea88b 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -271,6 +271,8 @@ Here is a sample `trigger` capability including all optional properties: } ``` +**Note**: if an integration only has the trigger capability, the word "trigger" will be added to its name in the LaunchDarkly UI. For this reason, do not include the word "trigger" in the manifest name. See the [generic-trigger manifest](/integrations/generic-trigger/manifest.json) for an example. + ## Reserved custom properties (`reservedCustomProperties`) Custom properties allow you to store data in LaunchDarkly alongside a feature flag. For example, you can use custom properties to indicate flag-level associations with data on your service. If you don't have any flag-level associations or configurations, you don't need to use this capability. From 7275b7a5f167430429f828814c9c029e1c2e552b Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 13 Aug 2020 16:46:10 +0100 Subject: [PATCH 341/936] Require isOptional = true when defaultValue is used (#181) * Make datadog host optional * Use isOptional wherever defaultValue is used and add test lock this change in * update docs --- __tests__/validateIntegrationManifests.js | 4 ++++ docs/form-variables.md | 2 +- integrations/datadog/manifest.json | 1 + integrations/dynatrace/manifest.json | 1 + integrations/elastic/manifest.json | 2 +- integrations/logdna/manifest.json | 3 ++- 6 files changed, 10 insertions(+), 3 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 14252f76..d12ff4cf 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -157,6 +157,10 @@ describe('All integrations', () => { if (formVariables) { formVariables.forEach(formVariable => { if (!_.isUndefined(formVariable.defaultValue)) { + expect( + formVariable.isOptional, + '"defaultValue" is only valid if "isOptional" is true. Use "placeholder" if you do not want the variable to be optional.' + ).toBe(true); if (formVariable.type === 'string' || formVariable.type === 'uri') { expect(_.isString(formVariable.defaultValue)).toBe(true); } else if (formVariable.type === 'boolean') { diff --git a/docs/form-variables.md b/docs/form-variables.md index 7069ed34..69492d05 100644 --- a/docs/form-variables.md +++ b/docs/form-variables.md @@ -39,6 +39,6 @@ The `formVariables[].description` will be used as a field label on the UI. You can use simple markdown to link a word or phrase to an external URL. Accepted form variable types are `string`, `boolean`, `uri`, and `enum`. -Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. +Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. If you provide a `defaultValue`, you must also set `isOptional` to `true`. To learn more, read the [manifest schema](../manifest.schema.json). diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 5a5851ae..c6506eb8 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -32,6 +32,7 @@ "https://api.datadoghq.com", "https://api.datadoghq.eu" ], + "isOptional": true, "defaultValue": "https://api.datadoghq.com" } ], diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 229b2036..503f3c99 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -37,6 +37,7 @@ "type": "enum", "description": "Select the Dynatrace entity `meType` to associate with all events.", "defaultValue": "APPLICATION", + "isOptional": true, "allowedValues": [ "APPLICATION", "APPLICATION_METHOD", diff --git a/integrations/elastic/manifest.json b/integrations/elastic/manifest.json index 1818e0ec..067c1aea 100644 --- a/integrations/elastic/manifest.json +++ b/integrations/elastic/manifest.json @@ -40,7 +40,7 @@ "type": "string", "isSecret": false, "isOptional": false, - "defaultValue": "launchdarkly-audit" + "placeholder": "launchdarkly-audit" } ], "capabilities": { diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index bf03816b..0d500b09 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -30,7 +30,8 @@ "description": "The log level with which LaunchDarkly messages will be published.", "type": "string", "isSecret": false, - "defaultValue": "INFO" + "defaultValue": "INFO", + "isOptional": true } ], "capabilities": { From 0795fd4d7b7aff989d82e3e5c38e0d5490316aab Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 13 Aug 2020 22:17:15 +0100 Subject: [PATCH 342/936] use org-global for deploy-to-s3 jobs (#182) --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1ad9d635..02e1f56c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,6 +54,7 @@ workflows: - deploy-to-s3: requires: - build + context: org-global filters: branches: only: master @@ -61,6 +62,7 @@ workflows: - deploy-to-s3: requires: - build + context: org-global filters: branches: only: deploy-catamorphic @@ -68,6 +70,7 @@ workflows: - deploy-to-s3: requires: - build + context: org-global filters: branches: only: deploy-production From b7482b176094cf82bc55cddfb6fc33ac17934ad7 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 21 Aug 2020 12:29:04 +0100 Subject: [PATCH 343/936] Update bucket names in circle config (#184) * clean up circle config --- .circleci/config.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 02e1f56c..18bead2f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -27,11 +27,10 @@ jobs: name: Run tests command: npm test deploy-to-s3: + executor: aws-cli/default parameters: bucket-name: type: string - machine: - enabled: true steps: - checkout - aws-cli/install @@ -45,7 +44,6 @@ jobs: BUCKET_NAME: << parameters.bucket-name >> workflows: - version: 2.1 build-and-deploy: jobs: - linter/pre-commit: @@ -58,7 +56,7 @@ workflows: filters: branches: only: master - bucket-name: integrations-stg.launchdarkly.com + bucket-name: launchdarkly-integrations-staging - deploy-to-s3: requires: - build @@ -66,7 +64,7 @@ workflows: filters: branches: only: deploy-catamorphic - bucket-name: integrations-cat.catamorphic.com + bucket-name: launchdarkly-integrations-catamorphic - deploy-to-s3: requires: - build @@ -74,4 +72,4 @@ workflows: filters: branches: only: deploy-production - bucket-name: integrations-prod.launchdarkly.com + bucket-name: launchdarkly-integrations-production From 5aa47a7a532e4373935787c7dd82f98c09c20a97 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 21 Aug 2020 12:30:14 +0100 Subject: [PATCH 344/936] Update datadog trigger parser and readme (#183) --- integrations/datadog/README.md | 11 ++++++----- integrations/datadog/manifest.json | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/integrations/datadog/README.md b/integrations/datadog/README.md index 2544386e..91a47d3a 100644 --- a/integrations/datadog/README.md +++ b/integrations/datadog/README.md @@ -6,7 +6,6 @@ Run `npm run curl datadog` in the root repository directory to generate a `curl` command to send data to Datadog. - **Note:** This integration currently lives alongside the "legacy" Datadog integration. This integration should not be enabled in production until all legacy subscriptions have been migrated ### Triggers @@ -14,12 +13,14 @@ Run `npm run curl datadog` in the root repository directory to generate a `curl` Consult the [Datadog documentation](https://docs.datadoghq.com/integrations/webhooks/) to set up outgoing webhooks from your Datadog account. When [configuring a new webhook in Datadog](https://app.datadoghq.com/account/settings#integrations/webhooks), there will be the option to specify the payload. In order for LaunchDarkly to parse the payload correctly, it will need to be as follows: -``` + +```json { -"alert_name": "$ALERT_METRIC", -"url": "$LINK", + "title": "$EVENT_TITLE", + "url": "$LINK" } ``` + If we wish to change this in the future, the full list of fields we can configure in Datadog webhooks can be found [here](https://docs.datadoghq.com/integrations/webhooks/). -To test, you'll have to attach the webhook to a monitor by putting `@webhook-` into the text of the alert you want and then test from the monitor configuration page by clicking the 'Test Notifications' button at the bottom. +To test, you'll have to attach the webhook to a monitor by putting `{{#is_alert}}@webhook-{{/is_alert}}` into the text of the alert you want and then test from the monitor configuration page by clicking the 'Test Notifications' button at the bottom. diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index c6506eb8..3ea4ec0e 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -75,7 +75,7 @@ "trigger": { "documentation": "https://docs.launchdarkly.com/integrations/datadog", "parser": { - "alertName": "/alert_name", + "alertName": "/title", "url": "/url" } } From 47bd8f0653eb70488cbd45ca8d27485302bd4d31 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 21 Aug 2020 16:30:24 +0100 Subject: [PATCH 345/936] [ch87329] Add automatic clubhouse ticketeting for private repo (#185) --- .github/workflows/pull_request.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/workflows/pull_request.yml diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 00000000..35608aa3 --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,15 @@ +on: pull_request +name: Pull request +jobs: + setClubhouseLinkInPR: + if: github.repository == 'launchdarkly/integration-framework-private' + name: Set Clubhouse Link in PR + runs-on: ubuntu-latest + steps: + - name: Set Clubhouse Link in PR + uses: launchdarkly/ld-gh-actions-clubhouse/set-ch-link@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + STORY_BASE_URL: https://app.clubhouse.io/launchdarkly/story + AUTOLINK_PREFIX: "CH-" + CREATE_STORY_URL: https://app.clubhouse.io/launchdarkly/stories/new?template_id=5f3fbdce-dfa0-446b-91c5-0cf6e01f5045 From d1f6d40177c8603db5595bfa1354607785553f86 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 26 Aug 2020 14:18:23 +0100 Subject: [PATCH 346/936] Add generic trigger icon (#186) --- integrations/generic-trigger/assets/images/horizontal.svg | 4 ---- integrations/generic-trigger/assets/images/square.svg | 1 - .../generic-trigger/assets/images/webhook-trigger.svg | 5 +++++ integrations/generic-trigger/manifest.json | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) delete mode 100644 integrations/generic-trigger/assets/images/horizontal.svg delete mode 100644 integrations/generic-trigger/assets/images/square.svg create mode 100644 integrations/generic-trigger/assets/images/webhook-trigger.svg diff --git a/integrations/generic-trigger/assets/images/horizontal.svg b/integrations/generic-trigger/assets/images/horizontal.svg deleted file mode 100644 index 799ca37f..00000000 --- a/integrations/generic-trigger/assets/images/horizontal.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/integrations/generic-trigger/assets/images/square.svg b/integrations/generic-trigger/assets/images/square.svg deleted file mode 100644 index d519b566..00000000 --- a/integrations/generic-trigger/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/generic-trigger/assets/images/webhook-trigger.svg b/integrations/generic-trigger/assets/images/webhook-trigger.svg new file mode 100644 index 00000000..c7aac972 --- /dev/null +++ b/integrations/generic-trigger/assets/images/webhook-trigger.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json index e2c75267..f3a7cfda 100644 --- a/integrations/generic-trigger/manifest.json +++ b/integrations/generic-trigger/manifest.json @@ -11,8 +11,8 @@ }, "categories": ["automation", "developer-tools"], "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" + "square": "assets/images/webhook-trigger.svg", + "horizontal": "assets/images/webhook-trigger.svg" }, "capabilities": { "trigger": { From b343d7bcef3ef335ad4659ed7de93e549f9b96d7 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 26 Aug 2020 14:30:08 +0100 Subject: [PATCH 347/936] [ch87329] Fix clubhouse link (#187) --- .github/workflows/pull_request.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 35608aa3..708d8125 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -11,5 +11,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} STORY_BASE_URL: https://app.clubhouse.io/launchdarkly/story - AUTOLINK_PREFIX: "CH-" CREATE_STORY_URL: https://app.clubhouse.io/launchdarkly/stories/new?template_id=5f3fbdce-dfa0-446b-91c5-0cf6e01f5045 From 5c904f41de8f90c29164ae765c3d0471e9d53c83 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 2 Sep 2020 16:39:33 -0700 Subject: [PATCH 348/936] [ch87972] updated trigger urls and descriptions (#188) --- integrations/datadog/manifest.json | 2 +- integrations/generic-trigger/manifest.json | 4 +++- integrations/honeycomb/manifest.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 3ea4ec0e..73608d6c 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -73,7 +73,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/datadog", + "documentation": "https://docs.launchdarkly.com/integrations/datadog/triggers#connecting-a-trigger-to-datadog", "parser": { "alertName": "/title", "url": "/url" diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json index f3a7cfda..65c90fc6 100644 --- a/integrations/generic-trigger/manifest.json +++ b/integrations/generic-trigger/manifest.json @@ -3,9 +3,11 @@ "version": "1.0.0", "overview": "Remotely trigger flag changes using a unique webhook URL", "description": "Remotely trigger flag changes using a unique webhook URL", + "details": "Triggers let you remotely execute flag changes, and generic triggers can be set up to work with any service that fires a webhook. Use a generic trigger from scripts, in-house tools, and monitoring or tracker services to turn flags on or off directly from your application.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/triggers", "site": "https://launchdarkly.com", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, @@ -16,7 +18,7 @@ }, "capabilities": { "trigger": { - "documentation": "https://docs.launchdarkly.com", + "documentation": "https://docs.launchdarkly.com/integrations/triggers#creating-a-new-trigger", "parser": { "alertName": "alertName", "value": "value", diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 276704bb..6ea6eb57 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -61,7 +61,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/honeycomb", + "documentation": "https://docs.launchdarkly.com/integrations/honeycomb/triggers#connecting-a-launchdarkly-trigger-to-honeycomb", "parser": { "alertName": "/name", "url": "/result_url" From 05a924d5b0ae5873e4736df0840a381cbfaa2d38 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 3 Sep 2020 13:43:50 +0100 Subject: [PATCH 349/936] [ch87971] Add new eventName field and default value (#190) * Add new eventName field and default value * Add deprecation warning * Add eventName to all triggers --- integrations/datadog/manifest.json | 1 + integrations/generic-trigger/manifest.json | 2 ++ integrations/honeycomb/manifest.json | 1 + manifest.schema.json | 19 +++++++++++++++++-- schemas/capabilities/trigger.json | 19 ++++++++++++++++--- 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 73608d6c..01ab37d4 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -75,6 +75,7 @@ "trigger": { "documentation": "https://docs.launchdarkly.com/integrations/datadog/triggers#connecting-a-trigger-to-datadog", "parser": { + "eventName": "/title", "alertName": "/title", "url": "/url" } diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json index 65c90fc6..d14af1d6 100644 --- a/integrations/generic-trigger/manifest.json +++ b/integrations/generic-trigger/manifest.json @@ -19,7 +19,9 @@ "capabilities": { "trigger": { "documentation": "https://docs.launchdarkly.com/integrations/triggers#creating-a-new-trigger", + "defaultEventName": "An event", "parser": { + "eventName": "eventName", "alertName": "alertName", "value": "value", "url": "url" diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 6ea6eb57..6b99567f 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -63,6 +63,7 @@ "trigger": { "documentation": "https://docs.launchdarkly.com/integrations/honeycomb/triggers#connecting-a-launchdarkly-trigger-to-honeycomb", "parser": { + "eventName": "/name", "alertName": "/name", "url": "/result_url" } diff --git a/manifest.schema.json b/manifest.schema.json index 72a7c200..1006bb33 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1069,7 +1069,8 @@ "enum": [ "documentation", "auth", - "parser" + "parser", + "defaultEventName" ] }, "required": [ @@ -1093,6 +1094,13 @@ "sharedSecret" ] }, + "defaultEventName": { + "$id": "#/properties/capability/trigger/default-event-name", + "title": "Default event name", + "description": "The default event name string used in the audit log if an eventName cannot be parsed in the trigger request body.", + "type": "string", + "default": "An alert" + }, "parser": { "$id": "#/properties/capability/trigger/trigger-parser", "title": "Trigger parser", @@ -1100,16 +1108,23 @@ "type": "object", "propertyNames": { "enum": [ + "eventName", "alertName", "value", "url" ] }, "properties": { + "eventName": { + "$id": "#/properties/capability/trigger/trigger-parser/event-name", + "title": "Event name pointer", + "description": "JSON pointer to an event name", + "type": "string" + }, "alertName": { "$id": "#/properties/capability/trigger/trigger-parser/alert-name", "title": "Alert name pointer", - "description": "JSON pointer to an alert name", + "description": "DEPRECATED (use eventName): JSON pointer to an alert name", "type": "string" }, "value": { diff --git a/schemas/capabilities/trigger.json b/schemas/capabilities/trigger.json index c4f5bcf6..4215075b 100644 --- a/schemas/capabilities/trigger.json +++ b/schemas/capabilities/trigger.json @@ -6,7 +6,7 @@ "description": "This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly", "type": "object", "propertyNames": { - "enum": ["documentation", "auth", "parser"] + "enum": ["documentation", "auth", "parser", "defaultEventName"] }, "required": ["documentation"], "properties": { @@ -25,19 +25,32 @@ "type": "string", "enum": ["sharedSecret"] }, + "defaultEventName": { + "$id": "#/properties/capability/trigger/default-event-name", + "title": "Default event name", + "description": "The default event name string used in the audit log if an eventName cannot be parsed in the trigger request body.", + "type": "string", + "default": "An alert" + }, "parser": { "$id": "#/properties/capability/trigger/trigger-parser", "title": "Trigger parser", "description": "Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer", "type": "object", "propertyNames": { - "enum": ["alertName", "value", "url"] + "enum": ["eventName", "alertName", "value", "url"] }, "properties": { + "eventName": { + "$id": "#/properties/capability/trigger/trigger-parser/event-name", + "title": "Event name pointer", + "description": "JSON pointer to an event name", + "type": "string" + }, "alertName": { "$id": "#/properties/capability/trigger/trigger-parser/alert-name", "title": "Alert name pointer", - "description": "JSON pointer to an alert name", + "description": "DEPRECATED (use eventName): JSON pointer to an alert name", "type": "string" }, "value": { From d8ed0e81222c61f159af8acbaab7efef9063b95f Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 3 Sep 2020 15:58:12 +0100 Subject: [PATCH 350/936] Fix generic template parser paths (#191) --- integrations/generic-trigger/manifest.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json index d14af1d6..4795c44f 100644 --- a/integrations/generic-trigger/manifest.json +++ b/integrations/generic-trigger/manifest.json @@ -21,10 +21,10 @@ "documentation": "https://docs.launchdarkly.com/integrations/triggers#creating-a-new-trigger", "defaultEventName": "An event", "parser": { - "eventName": "eventName", - "alertName": "alertName", - "value": "value", - "url": "url" + "eventName": "/eventName", + "alertName": "/alertName", + "value": "/value", + "url": "/url" } } } From 618f2f0a4b06ad625db612f10e358af9e19990e0 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 3 Sep 2020 08:45:06 -0700 Subject: [PATCH 351/936] readme update for generic triggers (#189) --- integrations/generic-trigger/README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/integrations/generic-trigger/README.md b/integrations/generic-trigger/README.md index c6938b37..d549b73f 100644 --- a/integrations/generic-trigger/README.md +++ b/integrations/generic-trigger/README.md @@ -1,6 +1,3 @@ # Generic trigger -TODO: - - Add new icon - - Update doc links - - Update description +This integration allows for *any* tool with outbound webhook capabilities to utilize LaunchDarkly's triggers functionality. See https://docs.launchdarkly.com/integrations/triggers#creating-a-new-trigger for more information. From 548d2aa25f8375a13dfd74e97a0bef989b1fcb33 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 3 Sep 2020 16:45:07 -0700 Subject: [PATCH 352/936] adding some periods (#194) --- __tests__/validateIntegrationManifests.js | 4 ++++ integrations/adfs/manifest.json | 2 +- integrations/ansible/manifest.json | 2 +- integrations/appdynamics/manifest.json | 2 +- integrations/appoptics/manifest.json | 2 +- integrations/azure-devops/manifest.json | 2 +- integrations/azure-sso/manifest.json | 2 +- integrations/bitbucket-flags/manifest.json | 2 +- integrations/datadog-legacy/manifest.json | 2 +- integrations/datadog/manifest.json | 2 +- integrations/dynatrace/manifest.json | 2 +- integrations/elastic/manifest.json | 2 +- integrations/generic-trigger/manifest.json | 4 ++-- integrations/googleapps-sso/manifest.json | 2 +- integrations/grafana/manifest.json | 2 +- integrations/heap/manifest.json | 2 +- integrations/jira/manifest.json | 2 +- integrations/logdna/manifest.json | 2 +- integrations/msteams/manifest.json | 2 +- integrations/new-relic-apm/manifest.json | 2 +- integrations/new-relic/manifest.json | 2 +- integrations/okta/manifest.json | 2 +- integrations/onelogin/manifest.json | 2 +- integrations/pendo/manifest.json | 2 +- integrations/sample-integration/manifest.json | 2 +- integrations/signalfx/manifest.json | 2 +- integrations/sleuth/manifest.json | 2 +- integrations/splunk/manifest.json | 2 +- integrations/terraform/manifest.json | 2 +- integrations/trello/manifest.json | 2 +- integrations/vscode/manifest.json | 2 +- 31 files changed, 35 insertions(+), 31 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index d12ff4cf..5ffac528 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -104,6 +104,10 @@ describe('All integrations', () => { ).toBe(true); }); + test.each(manifests)('Overview ends in a period for %s', (key, manifest) => { + expect(_.get(manifest, 'overview', '').endsWith('.')).toBe(true); + }); + test.each(manifests)( 'Referenced form variables exist for %s', (key, manifest) => { diff --git a/integrations/adfs/manifest.json b/integrations/adfs/manifest.json index 1537efc8..c76908fc 100644 --- a/integrations/adfs/manifest.json +++ b/integrations/adfs/manifest.json @@ -1,7 +1,7 @@ { "name": "Active Directory Federation Services (ADFS)", "version": "1.0.0", - "overview": "Provision users and manage single sign-on with ADFS (Enterprise only)", + "overview": "Provision users and manage single sign-on with ADFS (Enterprise only).", "description": "Use your ADFS identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", "details": "Active Directory Federation Services (ADFS) is a service provided by Microsoft as a standard role for Windows Server. It provides a web login using existing Active Directory credentials. Provision your LaunchDarkly users and manage single sign-on with ADFS.", "author": "LaunchDarkly", diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json index 8078e7e4..abc6771a 100644 --- a/integrations/ansible/manifest.json +++ b/integrations/ansible/manifest.json @@ -1,7 +1,7 @@ { "name": "Ansible Collection", "version": "0.2.0", - "overview": "Manage your LaunchDarkly resources using Ansible", + "overview": "Manage your LaunchDarkly resources using Ansible.", "description": "LaunchDarkly Labs project to manage LaunchDarkly resources using Ansible. This allows you to use Ansible to configure and control feature flags, environments, projects, and more.", "author": "LaunchDarkly Labs", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 9994a91e..56782719 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -1,7 +1,7 @@ { "name": "AppDynamics", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag events in AppDynamics", + "overview": "Monitor LaunchDarkly flag events in AppDynamics.", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to AppDynamics.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index f8f1e510..f3d042d9 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -1,7 +1,7 @@ { "name": "AppOptics", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag events in AppOptics", + "overview": "Monitor LaunchDarkly flag events in AppOptics.", "description": "This integration sends LaunchDarkly audit events to AppOptics.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/azure-devops/manifest.json b/integrations/azure-devops/manifest.json index 7e2152fd..2fef2ae4 100644 --- a/integrations/azure-devops/manifest.json +++ b/integrations/azure-devops/manifest.json @@ -1,7 +1,7 @@ { "name": "Azure DevOps", "version": "1.0.0", - "overview": "Roll out features using Azure DevOps releases", + "overview": "Roll out features using Azure DevOps releases.", "description": "The Azure DevOps integration lets you perform controlled rollouts to manage feature releases. With our integration, you can define a percentage rollout for your feature flags as part of a release task.", "details": "Plan smarter, collaborate better, and ship faster with a set of modern dev services. Use all the DevOps services or choose just what you need to complement your existing workflows. Azure Pipelines lets you continuously build, test, and deploy to any platform and cloud. Perform controlled rollout to manage feature releases with LaunchDarkly.", "author": "LaunchDarkly", diff --git a/integrations/azure-sso/manifest.json b/integrations/azure-sso/manifest.json index ccdf7947..3e27bd16 100644 --- a/integrations/azure-sso/manifest.json +++ b/integrations/azure-sso/manifest.json @@ -1,7 +1,7 @@ { "name": "Azure Active Directory", "version": "1.0.0", - "overview": "Provision users and manage single sign-on with Azure AD (Enterprise only)", + "overview": "Provision users and manage single sign-on with Azure AD (Enterprise only).", "description": "Use your Azure identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", "details": "Azure Active Directory (Azure AD) is Microsoft’s cloud-based identity and access management service. Provision LaunchDarkly users and manage single sign-on with Azure AD.", "author": "LaunchDarkly", diff --git a/integrations/bitbucket-flags/manifest.json b/integrations/bitbucket-flags/manifest.json index 915e1d39..351b234d 100644 --- a/integrations/bitbucket-flags/manifest.json +++ b/integrations/bitbucket-flags/manifest.json @@ -1,7 +1,7 @@ { "name": "Bitbucket Pipelines (flags)", "version": "1.0.0", - "overview": "Create and enable feature flags using Bitbucket Pipelines", + "overview": "Create and enable feature flags using Bitbucket Pipelines.", "description": "The LaunchDarkly integration lets you insert feature flag actions directly into your Pipeline's continuous delivery flow. Bitbucket Pipelines is a continuous delivery platform that lets your team build, test, and deploy from Bitbucket. It exists within Bitbucket, giving you end-to-end visibility from coding to deployment.", "details": "Bitbucket is Git code management that gives teams one place to plan projects, collaborate on code, test, and deploy. Create and enable feature flags using Bitbucket Pipelines.", "author": "LaunchDarkly", diff --git a/integrations/datadog-legacy/manifest.json b/integrations/datadog-legacy/manifest.json index 6b2004d6..234efcc3 100644 --- a/integrations/datadog-legacy/manifest.json +++ b/integrations/datadog-legacy/manifest.json @@ -1,7 +1,7 @@ { "name": "Datadog", "version": "1.0.0", - "overview": "Monitor LaunchDarkly changes in Datadog", + "overview": "Monitor LaunchDarkly changes in Datadog.", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to Datadog.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 01ab37d4..25271adb 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -1,7 +1,7 @@ { "name": "Datadog", "version": "1.0.0", - "overview": "Monitor LaunchDarkly changes in Datadog", + "overview": "Monitor LaunchDarkly changes in Datadog.", "description": "Monitor LaunchDarkly flag and other change events in DataDog. Correlate feature rollouts to changes in your system’s operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 503f3c99..eb43f444 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -1,7 +1,7 @@ { "name": "Dynatrace", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in Dynatrace", + "overview": "Monitor LaunchDarkly flag changes in Dynatrace.", "description": "Monitor LaunchDarkly flag change events alongside your Dynatrace performance graphs. Correlate feature rollouts to changes in your system’s operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/elastic/manifest.json b/integrations/elastic/manifest.json index 067c1aea..dbd6609e 100644 --- a/integrations/elastic/manifest.json +++ b/integrations/elastic/manifest.json @@ -1,7 +1,7 @@ { "name": "Elastic (ELK) Stack", "version": "1.0.0", - "overview": "Observe LaunchDarkly flag changes in the Elastic (ELK) Stack", + "overview": "Observe LaunchDarkly flag changes in the Elastic (ELK) Stack.", "description": "This integration sends LaunchDarkly audit log events to an Elasticsearch endpoint.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json index 4795c44f..d6c387b4 100644 --- a/integrations/generic-trigger/manifest.json +++ b/integrations/generic-trigger/manifest.json @@ -1,8 +1,8 @@ { "name": "Generic", "version": "1.0.0", - "overview": "Remotely trigger flag changes using a unique webhook URL", - "description": "Remotely trigger flag changes using a unique webhook URL", + "overview": "Remotely trigger flag changes using a unique webhook URL.", + "description": "Remotely trigger flag changes using a unique webhook URL.", "details": "Triggers let you remotely execute flag changes, and generic triggers can be set up to work with any service that fires a webhook. Use a generic trigger from scripts, in-house tools, and monitoring or tracker services to turn flags on or off directly from your application.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/googleapps-sso/manifest.json b/integrations/googleapps-sso/manifest.json index 6d89a3b1..b0c434bd 100644 --- a/integrations/googleapps-sso/manifest.json +++ b/integrations/googleapps-sso/manifest.json @@ -1,7 +1,7 @@ { "name": "Google Apps", "version": "1.0.0", - "overview": "Provision users and manage single sign-on with Google (Enterprise only)", + "overview": "Provision users and manage single sign-on with Google (Enterprise only).", "description": "Use your Google Apps identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", "details": "Single sign-on (SSO) lets users sign in to all their enterprise cloud applications using their managed Google account credentials. Provision LaunchDarkly users and manage single sign-on with Google.", "author": "LaunchDarkly", diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 03540ebc..2a1eedc7 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -1,7 +1,7 @@ { "name": "Grafana", "version": "0.0.1", - "overview": "Annotate your Grafana dashboards with LaunchDarkly events", + "overview": "Annotate your Grafana dashboards with LaunchDarkly events.", "description": "Send flag, environment, and project updates to Grafana to add context to your graphs.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index a4545042..2e344fc4 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -1,7 +1,7 @@ { "name": "Heap", "version": "1.0.0", - "overview": "Add LaunchDarkly user IDs and feature flag events to Heap as user and event properties", + "overview": "Add LaunchDarkly user IDs and feature flag events to Heap as user and event properties.", "description": "To set this up, attach LaunchDarkly's user key and feature flags as user and event properties in Heap.", "details": "Heap offers a smarter way to build digital products. With comprehensive data collection and structured processes, Heap helps Product Managers understand their users, make data-driven decisions, and craft delightful digital experiences. Add LaunchDarkly user IDs and feature flag events to Heap to better understand users and their experiences.", "author": "Heap", diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index c887feb7..11292301 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -1,7 +1,7 @@ { "name": "Jira Cloud", "version": "1.0.0", - "overview": "Link your feature flags with your team's Jira issues", + "overview": "Link your feature flags with your team's Jira issues.", "description": "Integrate LaunchDarkly with Jira to see your feature flags alongside your team's Jira issues.", "details": "Jira is the #1 software development tool used by agile teams to plan, track, and release great software. Built for all team members, Jira enables collaboration by providing everyone with visibility into important information for planning and coordinating projects, tracking progress, and reporting results in real-time. Integrate LaunchDarkly with Jira to see your feature flags alongside your team's Jira issues.", "author": "LaunchDarkly", diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 0d500b09..0eb14252 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -1,7 +1,7 @@ { "name": "LogDNA", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag events in LogDNA", + "overview": "Monitor LaunchDarkly flag events in LogDNA.", "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to LogDNA.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index ecd81021..e1fee7e7 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -1,7 +1,7 @@ { "name": "Microsoft Teams", "version": "1.0.0", - "overview": "Receive flag change notifications in your Teams workspaces", + "overview": "Receive flag change notifications in your Teams workspaces.", "description": "Receive LaunchDarkly notifications in your Teams workspaces. Subscribe to changes in flags, projects, and other resources.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/new-relic-apm/manifest.json b/integrations/new-relic-apm/manifest.json index 9ab8c89a..0bba36f5 100644 --- a/integrations/new-relic-apm/manifest.json +++ b/integrations/new-relic-apm/manifest.json @@ -1,7 +1,7 @@ { "name": "New Relic", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag events in New Relic APM", + "overview": "Monitor LaunchDarkly flag events in New Relic APM.", "description": "This integration sends LaunchDarkly audit events to New Relic APM as [deployment events](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments).", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index 96dad94c..c3b8ef26 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -1,7 +1,7 @@ { "name": "New Relic Insights Pro [Deprecated]", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag events in New Relic Insights Pro", + "overview": "Monitor LaunchDarkly flag events in New Relic Insights Pro.", "description": "This integration sends LaunchDarkly audit events to New Relic. Please note that it requires a paid Insights subscription to function.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/okta/manifest.json b/integrations/okta/manifest.json index 495642be..5127bd1f 100644 --- a/integrations/okta/manifest.json +++ b/integrations/okta/manifest.json @@ -1,7 +1,7 @@ { "name": "Okta", "version": "1.0.0", - "overview": "Provision users and manage single sign-on with Okta (Enterprise only)", + "overview": "Provision users and manage single sign-on with Okta (Enterprise only).", "description": "Use your Okta identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", "details": "Okta Single Sign-on is part of a complete identity and access management solution for organizations adopting and building for cloud and mobile who need to contain costs, fulfill user productivity targets, and avoid security risks. Provision LaunchDarkly users and manage single sign-on with Okta.", "author": "LaunchDarkly", diff --git a/integrations/onelogin/manifest.json b/integrations/onelogin/manifest.json index ed3f7b46..a38392a8 100644 --- a/integrations/onelogin/manifest.json +++ b/integrations/onelogin/manifest.json @@ -1,7 +1,7 @@ { "name": "OneLogin", "version": "1.0.0", - "overview": "Provision users and manage single sign-on with OneLogin (Enterprise only)", + "overview": "Provision users and manage single sign-on with OneLogin (Enterprise only).", "description": "Use your OneLogin identity provider (IdP) to manage your LaunchDarkly users. This integration is only available for LaunchDarkly customers on an Enterprise plan.", "details": "OneLogin’s SSO solution provides one click access to all of your apps, in the cloud and behind the firewall. Use OneLogin to manage your LaunchDarkly users.", "author": "LaunchDarkly", diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index 9f800778..6a14f90e 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -1,7 +1,7 @@ { "name": "Pendo", "version": "1.0.0", - "overview": "Target your Pendo audiences with LaunchDarkly rules", + "overview": "Target your Pendo audiences with LaunchDarkly rules.", "description": "Product teams often want to roll out new features iteratively, measuring adoption and collecting feedback from a subset of users before making the feature generally available. Pendo and LaunchDarkly have partnered to help our joint customers use Pendo to better target and engage users during this process. Pendo data such as product adoption, renewal data, and ARR can help target the rollout of features through LaunchDarkly.", "details": "Pendo helps product teams understand product usage, collect feedback, measure sentiment, onboard users, and announce new features in app—all without requiring engineering resources. Access Pendo audiences with LaunchDarkly targeting rules to deliver your new features to the right users.", "author": "Pendo", diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 863532a8..3dbd16ee 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -1,7 +1,7 @@ { "name": "Sample Integration", "version": "1.0.0", - "overview": "Short one-liner describing your integration", + "overview": "Short one-liner describing your integration.", "description": "Send flag data to space. Markdown based description.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index af08512e..71ed6d1a 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -1,7 +1,7 @@ { "name": "SignalFx", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in SignalFx", + "overview": "Monitor LaunchDarkly flag changes in SignalFx.", "description": "Monitor LaunchDarkly flag and other change events with clear data markers in SignalFx to correlate feature flag rollouts with changes in operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/sleuth/manifest.json b/integrations/sleuth/manifest.json index 32042668..d450bf25 100644 --- a/integrations/sleuth/manifest.json +++ b/integrations/sleuth/manifest.json @@ -1,7 +1,7 @@ { "name": "Sleuth", "version": "1.0.0", - "overview": "Track feature flags as a source of change in your DevOps stack", + "overview": "Track feature flags as a source of change in your DevOps stack.", "description": "Sleuth's native LaunchDarkly integration tracks the status and impact of feature flags relative to other source changes in your projects, such as code, issues, etc. With the Sleuth integration, Sleuth can capture the full state of feature flags at deployment time. This helps you keep track of the affected code deploys, what environment the change occurred in, who changed the flag, and flag descriptions and flag value states, both before and after code deploys.", "author": "Sleuth", "supportEmail": "support@sleuth.io", diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 24b8aec7..0eb55426 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -1,7 +1,7 @@ { "name": "Splunk", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in Splunk", + "overview": "Monitor LaunchDarkly flag changes in Splunk.", "description": "Monitor LaunchDarkly flag and other change events in Splunk and include these events in your reports, charts, alerts and dashboards.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index f72a1ecf..17b37e6c 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -1,7 +1,7 @@ { "name": "Terraform", "version": "1.0.0", - "overview": "Manage your LaunchDarkly resources as Terraform resources", + "overview": "Manage your LaunchDarkly resources as Terraform resources.", "description": "Use the LaunchDarkly Terraform provider to manage LaunchDarkly resources as Terraform resources. This allows you to use Terraform scripts to configure and control feature flags, environments, projects, and more.", "details": "Terraform is a tool for building, changing, and versioning infrastructure safely and efficiently. Terraform can manage existing and popular service providers as well as custom in-house solutions. Use Terraform to script and control your feature flag configurations.", "author": "LaunchDarkly", diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index f3fad5df..5b544dce 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -1,7 +1,7 @@ { "name": "Trello", "version": "1.0.0", - "overview": "Track and launch product features from your Trello cards", + "overview": "Track and launch product features from your Trello cards.", "description": "All from the back of your Trello cards, you can now browse and attach feature flags, enable or disable targetting status, and display the status of feature flags.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/vscode/manifest.json b/integrations/vscode/manifest.json index 8986df19..cfdc4d5f 100644 --- a/integrations/vscode/manifest.json +++ b/integrations/vscode/manifest.json @@ -1,7 +1,7 @@ { "name": "Visual Studio Code", "version": "1.0.0", - "overview": "Interact with feature flags from within VSCode", + "overview": "Interact with feature flags from within VSCode.", "description": "With this extension, you'll be able to view feature flag details when you hover over a feature flag key in your source code, autocomplete feature flag keys, and more -- all within VSCode!", "details": "Visual Studio Code (VSCode) is a lightweight, powerful source code editor with built-in support for JavaScript, TypeScript and Node.js and has a rich ecosystem of extensions for other languages and runtimes. Interact with feature flags from within Visual Studio Code.", "author": "LaunchDarkly", From 6fa1d063a6ed7e3ad7261350c7308c02070bbb33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Sep 2020 18:43:31 +0100 Subject: [PATCH 353/936] Bump yargs-parser from 18.1.1 to 18.1.3 (#197) Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 18.1.1 to 18.1.3. - [Release notes](https://github.com/yargs/yargs-parser/releases) - [Changelog](https://github.com/yargs/yargs-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/yargs-parser/compare/v18.1.1...v18.1.3) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3cb9cc93..e7031345 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4621,9 +4621,9 @@ } }, "yargs-parser": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", - "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", + "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", From 242a03812414df93bbaf0923ccef4c45a2174780 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 8 Sep 2020 15:03:08 +0100 Subject: [PATCH 354/936] [ch83496] Upload archive of manifests to artifacts bucket instead of directy copying to deploy buckets (#198) --- .circleci/config.yml | 30 ++++-------------------------- .gitignore | 1 + scripts/upload_artifacts_to_s3.sh | 24 ++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 26 deletions(-) create mode 100755 scripts/upload_artifacts_to_s3.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 18bead2f..2f44c196 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -26,22 +26,17 @@ jobs: - run: name: Run tests command: npm test - deploy-to-s3: + upload-to-s3: executor: aws-cli/default - parameters: - bucket-name: - type: string steps: - checkout - aws-cli/install - run: - name: Deploy to s3 bucket + name: Upload artifacts to s3 command: | if [ "$CIRCLE_REPOSITORY_URL" = "git@github.com:launchdarkly/integration-framework-private.git" ]; then - ./scripts/copy_to_s3.sh + ./scripts/upload_artifacts_to_s3.sh fi - environment: - BUCKET_NAME: << parameters.bucket-name >> workflows: build-and-deploy: @@ -49,27 +44,10 @@ workflows: - linter/pre-commit: config_file: .circleci/.pre-commit-ci.yaml - build - - deploy-to-s3: + - upload-to-s3: requires: - build context: org-global filters: branches: only: master - bucket-name: launchdarkly-integrations-staging - - deploy-to-s3: - requires: - - build - context: org-global - filters: - branches: - only: deploy-catamorphic - bucket-name: launchdarkly-integrations-catamorphic - - deploy-to-s3: - requires: - - build - context: org-global - filters: - branches: - only: deploy-production - bucket-name: launchdarkly-integrations-production diff --git a/.gitignore b/.gitignore index 9df57afd..579600e9 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ node_modules/ *.pid.lock build dist +pkg public .DS_Store latest diff --git a/scripts/upload_artifacts_to_s3.sh b/scripts/upload_artifacts_to_s3.sh new file mode 100755 index 00000000..49e2994a --- /dev/null +++ b/scripts/upload_artifacts_to_s3.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -uxe + +cd "${0%/*}/.." + +export REV=$(git rev-parse HEAD | cut -c1-8) + +DEST=./pkg +mkdir -p $DEST + +rm -rf $DEST/* + +BUCKET=launchdarkly-artifacts + +python -c 'import glob, json, os; print(json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]}))' > $DEST/latest.json +cp -r integrations $DEST/integrations +cp manifest.schema.json $DEST/manifest.schema.json + +ARCHIVE=goaltender_manifests_$REV.zip +cd $DEST +zip -r $ARCHIVE . +cd .. + +aws s3 cp $DEST/$ARCHIVE s3://launchdarkly-artifacts/goaltender-manifests/$ARCHIVE From db5301ae16a125fe5867274fdfda1e64b050135f Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 9 Sep 2020 16:52:26 +0100 Subject: [PATCH 355/936] Send webhook to spinnaker when build is done (#199) --- .circleci/config.yml | 14 ++++++++++++++ scripts/send_webhook.sh | 14 ++++++++++++++ 2 files changed, 28 insertions(+) create mode 100755 scripts/send_webhook.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 2f44c196..054c1a0c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -37,6 +37,17 @@ jobs: if [ "$CIRCLE_REPOSITORY_URL" = "git@github.com:launchdarkly/integration-framework-private.git" ]; then ./scripts/upload_artifacts_to_s3.sh fi + send-webhook: + docker: + - image: cimg/base:2020.01 + steps: + - checkout + - run: + name: send-webhook + command: | + if [ "$CIRCLE_REPOSITORY_URL" = "git@github.com:launchdarkly/integration-framework-private.git" ]; then + ./scripts/send_webhook.sh + fi workflows: build-and-deploy: @@ -51,3 +62,6 @@ workflows: filters: branches: only: master + - send-webhook: + requires: + - build diff --git a/scripts/send_webhook.sh b/scripts/send_webhook.sh new file mode 100755 index 00000000..0592ebb2 --- /dev/null +++ b/scripts/send_webhook.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -uxe + +REV=$(git rev-parse HEAD | cut -c1-8) + +generate_post_data=$(cat < Date: Wed, 9 Sep 2020 17:01:30 +0100 Subject: [PATCH 356/936] [ch83496] auto deploy staging pt 2 (#200) --- .circleci/config.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 054c1a0c..b07e5216 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -64,4 +64,7 @@ workflows: only: master - send-webhook: requires: - - build + - upload-to-s3 + filters: + branches: + only: master From 2651bc0b2d1649a61db4c5ad89d4f9b584f075cb Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Tue, 22 Sep 2020 10:31:49 -0700 Subject: [PATCH 357/936] Add Azure Active Directory docs link (#201) --- integrations/azure-sso/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/azure-sso/manifest.json b/integrations/azure-sso/manifest.json index 3e27bd16..6110c4ae 100644 --- a/integrations/azure-sso/manifest.json +++ b/integrations/azure-sso/manifest.json @@ -8,6 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.launchdarkly.com/docs/azure", + "launchdarklyDocs": "https://docs.launchdarkly.com/docs/azure", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], From 64a4a5b86cf63cb083ba467cca79fa04fc29ed63 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 25 Sep 2020 10:21:05 +0100 Subject: [PATCH 358/936] [ch90065] add trigger capability to signalfx (#203) * add trigger capability * add signalfx webhook doc link to readme --- integrations/signalfx/README.md | 2 ++ integrations/signalfx/manifest.json | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/integrations/signalfx/README.md b/integrations/signalfx/README.md index 6e9380e2..f9e4e0ac 100644 --- a/integrations/signalfx/README.md +++ b/integrations/signalfx/README.md @@ -4,6 +4,8 @@ [API documentation](https://developers.signalfx.com/ingest_data_reference.html#operation/Send%20Custom%20Events) +[Webhook (trigger) documentation](https://docs.signalfx.com/en/latest/admin-guide/integrate-notifications.html) + ### Set up for testing You shouldn't need to plug SignalFx into anything to test the SignalFx-Goaltender integration. Instead, just follow the following steps to locate the LD events after logging in to SignalFx: 1. Under the 'Dashboards' tab, expand the 'Built-in Dashboard Groups' section. diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 71ed6d1a..0ae22b54 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -58,6 +58,14 @@ "actions": ["*"] } ] + }, + "trigger": { + "documentation": "https://docs.launchdarkly.com/integrations/signalfx/triggers#connecting-a-launchdarkly-trigger-to-signalfx", + "parser": { + "eventName": "/eventType", + "alertName": "/detector", + "url": "/detectorUrl" + } } } } From ba778cfec3bf4c3bbdda95ddee059730516a0b74 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 7 Oct 2020 10:59:03 +0100 Subject: [PATCH 359/936] [ch91335] remove deprecated alertName trigger parser field (#205) * add triggers capability * eventName and alertName should be the same * chagne event_type to condition_name * remove alertName * update doc link * update capabilities.md to use eventName instead of alertName * remove alertName from all integration manifests * remove alertName from schemas * remove trigger capability from new relic manifest since it should be on a different pr --- docs/capabilities.md | 4 ++-- integrations/datadog/manifest.json | 1 - integrations/generic-trigger/manifest.json | 1 - integrations/honeycomb/manifest.json | 1 - integrations/signalfx/manifest.json | 1 - manifest.schema.json | 7 ------- schemas/capabilities/trigger.json | 8 +------- 7 files changed, 3 insertions(+), 20 deletions(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index 115ea88b..5177f4f4 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -253,7 +253,7 @@ By default, the trigger URL contains a globally unique path parameter to provide The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. -If your webhooks' request bodies are non-empty, you can specify the optional `parser` object with one or more of `alertName`, `value`, and `url`. The provided values will flow through LaunchDarkly into the resulting audit log messages when your service invokes a trigger in LaunchDarkly. +If your webhooks' request bodies are non-empty, you can specify the optional `parser` object with one or more of `eventName`, `value`, and `url`. The provided values will flow through LaunchDarkly into the resulting audit log messages when your service invokes a trigger in LaunchDarkly. Here is a sample `trigger` capability including all optional properties: @@ -264,7 +264,7 @@ Here is a sample `trigger` capability including all optional properties: "type": "sharedSecret" }, "parser": { - "alertName": "/alert", + "eventName": "/event", "value": "/value", "url": "/links/self/href" }, diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 25271adb..df65e1c3 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -76,7 +76,6 @@ "documentation": "https://docs.launchdarkly.com/integrations/datadog/triggers#connecting-a-trigger-to-datadog", "parser": { "eventName": "/title", - "alertName": "/title", "url": "/url" } } diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json index d6c387b4..598025e2 100644 --- a/integrations/generic-trigger/manifest.json +++ b/integrations/generic-trigger/manifest.json @@ -22,7 +22,6 @@ "defaultEventName": "An event", "parser": { "eventName": "/eventName", - "alertName": "/alertName", "value": "/value", "url": "/url" } diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 6b99567f..332e4313 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -64,7 +64,6 @@ "documentation": "https://docs.launchdarkly.com/integrations/honeycomb/triggers#connecting-a-launchdarkly-trigger-to-honeycomb", "parser": { "eventName": "/name", - "alertName": "/name", "url": "/result_url" } } diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 0ae22b54..1b3932fe 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -63,7 +63,6 @@ "documentation": "https://docs.launchdarkly.com/integrations/signalfx/triggers#connecting-a-launchdarkly-trigger-to-signalfx", "parser": { "eventName": "/eventType", - "alertName": "/detector", "url": "/detectorUrl" } } diff --git a/manifest.schema.json b/manifest.schema.json index 1006bb33..a2033028 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1109,7 +1109,6 @@ "propertyNames": { "enum": [ "eventName", - "alertName", "value", "url" ] @@ -1121,12 +1120,6 @@ "description": "JSON pointer to an event name", "type": "string" }, - "alertName": { - "$id": "#/properties/capability/trigger/trigger-parser/alert-name", - "title": "Alert name pointer", - "description": "DEPRECATED (use eventName): JSON pointer to an alert name", - "type": "string" - }, "value": { "$id": "#/properties/capability/trigger/trigger-parser/value", "title": "Value pointer", diff --git a/schemas/capabilities/trigger.json b/schemas/capabilities/trigger.json index 4215075b..5e512a0a 100644 --- a/schemas/capabilities/trigger.json +++ b/schemas/capabilities/trigger.json @@ -38,7 +38,7 @@ "description": "Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer", "type": "object", "propertyNames": { - "enum": ["eventName", "alertName", "value", "url"] + "enum": ["eventName", "value", "url"] }, "properties": { "eventName": { @@ -47,12 +47,6 @@ "description": "JSON pointer to an event name", "type": "string" }, - "alertName": { - "$id": "#/properties/capability/trigger/trigger-parser/alert-name", - "title": "Alert name pointer", - "description": "DEPRECATED (use eventName): JSON pointer to an alert name", - "type": "string" - }, "value": { "$id": "#/properties/capability/trigger/trigger-parser/value", "title": "Value pointer", From 0507c9190e36b49cd913525ce4131e5e70db753c Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 7 Oct 2020 11:43:55 +0100 Subject: [PATCH 360/936] [ch90570] add testEventNameRegexp field to schema (#206) * add testEventNameRegexp field to schema * add note to doc * add testEventNameRegexp to propertyNames list --- docs/capabilities.md | 2 ++ manifest.schema.json | 10 +++++++++- schemas/capabilities/trigger.json | 15 ++++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index 5177f4f4..09f263bf 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -253,6 +253,8 @@ By default, the trigger URL contains a globally unique path parameter to provide The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. +If the integration offers the option to send test events / webhook requests, the optional `testEventNameRegexp` fields allows you to specify regex to match the expected `eventName` value below. This will tell our integration framework not to make any real flag or resource changes associated with matching events. + If your webhooks' request bodies are non-empty, you can specify the optional `parser` object with one or more of `eventName`, `value`, and `url`. The provided values will flow through LaunchDarkly into the resulting audit log messages when your service invokes a trigger in LaunchDarkly. Here is a sample `trigger` capability including all optional properties: diff --git a/manifest.schema.json b/manifest.schema.json index a2033028..5096ce9e 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1070,7 +1070,8 @@ "documentation", "auth", "parser", - "defaultEventName" + "defaultEventName", + "testEventNameRegexp" ] }, "required": [ @@ -1101,6 +1102,13 @@ "type": "string", "default": "An alert" }, + "testEventNameRegexp": { + "$id": "#/properties/capability/trigger/test-event-name-regexp", + "title": "Test Event Name Regex", + "description": "The expected eventName of the integration partner's test events", + "type": "string", + "default": ".*[Tt][Ee][Ss][Tt].*" + }, "parser": { "$id": "#/properties/capability/trigger/trigger-parser", "title": "Trigger parser", diff --git a/schemas/capabilities/trigger.json b/schemas/capabilities/trigger.json index 5e512a0a..63d731a0 100644 --- a/schemas/capabilities/trigger.json +++ b/schemas/capabilities/trigger.json @@ -6,7 +6,13 @@ "description": "This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly", "type": "object", "propertyNames": { - "enum": ["documentation", "auth", "parser", "defaultEventName"] + "enum": [ + "documentation", + "auth", + "parser", + "defaultEventName", + "testEventNameRegexp" + ] }, "required": ["documentation"], "properties": { @@ -32,6 +38,13 @@ "type": "string", "default": "An alert" }, + "testEventNameRegexp": { + "$id": "#/properties/capability/trigger/test-event-name-regexp", + "title": "Test Event Name Regex", + "description": "The expected eventName of the integration partner's test events", + "type": "string", + "default": ".*[Tt][Ee][Ss][Tt].*" + }, "parser": { "$id": "#/properties/capability/trigger/trigger-parser", "title": "Trigger parser", From 4d2d2c833fcc306135760099807101c02341eaa4 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 8 Oct 2020 18:19:49 +0100 Subject: [PATCH 361/936] [ch90823] add triggers capability (#204) * add triggers capability * eventName and alertName should be the same * chagne event_type to condition_name * remove alertName * update doc link * update name and description" * update overview as well * make exact match Co-authored-by: Henry Barrow * remove triggers from overview and description Co-authored-by: Henry Barrow --- integrations/new-relic-apm/manifest.json | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/integrations/new-relic-apm/manifest.json b/integrations/new-relic-apm/manifest.json index 0bba36f5..05ae4e55 100644 --- a/integrations/new-relic-apm/manifest.json +++ b/integrations/new-relic-apm/manifest.json @@ -1,8 +1,8 @@ { - "name": "New Relic", - "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag events in New Relic APM.", - "description": "This integration sends LaunchDarkly audit events to New Relic APM as [deployment events](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments).", + "name": "New Relic One", + "version": "1.1.0", + "overview": "Monitor LaunchDarkly flag events in New Relic One.", + "description": "This integration sends LaunchDarkly audit events to New Relic One as [deployment events](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments).", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { @@ -58,6 +58,14 @@ "actions": ["*"] } ] + }, + "trigger": { + "documentation": "https://docs.launchdarkly.com/integrations/new-relic/triggers#connecting-a-launchdarkly-trigger-to-new-relic-one", + "testEventNameRegexp": "^New Relic Alert - Test Condition$", + "parser": { + "eventName": "/condition_name", + "url": "/incident_url" + } } } } From 6135cfbe69b615ac4844423cbb334d91255f2f80 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 14 Oct 2020 21:47:22 +0100 Subject: [PATCH 362/936] [ch90064] add trigger capability to dynatrace manifest (#202) * add trigger * add dynatrace doc link to readme * change parser fields to match datadog * add testEventNameRegexp --- integrations/dynatrace/README.md | 2 ++ integrations/dynatrace/manifest.json | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/integrations/dynatrace/README.md b/integrations/dynatrace/README.md index 613e9b66..84df4a58 100644 --- a/integrations/dynatrace/README.md +++ b/integrations/dynatrace/README.md @@ -4,4 +4,6 @@ [API documentation](https://www.dynatrace.com/support/help/extend-dynatrace/dynatrace-api/environment-api/events/post-event/) +To set up a trigger, follow the instructions for a [Dynatrace webhook integration](https://www.dynatrace.com/support/help/setup-and-configuration/integrations/third-party-integrations/problem-notification-systems/webhook-integration/). + Run `npm run curl dynatrace` in the root repository directory to generate a `curl` command to send data to Dynatrace. diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index eb43f444..c5f5275e 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -162,6 +162,14 @@ "actions": ["*"] } ] + }, + "trigger": { + "documentation": "https://docs.launchdarkly.com/integrations/dynatrace/triggers#connecting-a-launchdarkly-trigger-to-dynatrace", + "testEventNameRegexp": "^Dynatrace problem notification test run$", + "parser": { + "eventName": "/title", + "url": "/url" + } } } } From ef07bdea168f8ec9e2eb8a73528602c82650f09d Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 15 Oct 2020 19:25:42 +0100 Subject: [PATCH 363/936] [ch92301] add test event to datadog trigger (#207) * add test event regex for datadog * update honeycomb manifest for tests * remove test events & change eventName back --- integrations/datadog/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index df65e1c3..93b3f863 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -74,6 +74,7 @@ }, "trigger": { "documentation": "https://docs.launchdarkly.com/integrations/datadog/triggers#connecting-a-trigger-to-datadog", + "testEventNameRegexp": ".+ \\[TEST\\].+", "parser": { "eventName": "/title", "url": "/url" From 1aff89358caf94da82b7684c9c3c608e7063af92 Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Fri, 16 Oct 2020 13:30:58 -0400 Subject: [PATCH 364/936] Default is not an accepted value (#208) --- docs/form-variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/form-variables.md b/docs/form-variables.md index 69492d05..84dc2f5b 100644 --- a/docs/form-variables.md +++ b/docs/form-variables.md @@ -14,7 +14,7 @@ Here's an example: "key": "endpointUrl", "name": "Webhook endpoint URL", "description": "Enter the URL to the webhook endpoint", - "default": "https://example.com/inbound_webhook", + "defaultValue": "https://example.com/inbound_webhook", "type": "url" }, { From 2fb81b779b1fa303f6ec75cea1cee0f0a0418d4b Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 2 Nov 2020 20:14:00 +0000 Subject: [PATCH 365/936] [ch78771] update templates to use new displayName field (#209) * add displayName to sample context * update dynatrace flag template * add displayName to all flag sample contexts * add displayName to env sample contexts * add displayName to other sample xontexts * add displayName to project sample contexts * update elastic template * update logdna template * update new relic template (including deprecated just for kicks) * update signalfx template * update splunk template --- integrations/dynatrace/templates/flag.json.hbs | 4 +--- integrations/elastic/templates/template.json.hbs | 2 +- integrations/logdna/templates/template.json.hbs | 2 +- integrations/new-relic-apm/templates/flag.json.hbs | 2 +- integrations/new-relic/templates/template.json.hbs | 2 +- integrations/signalfx/templates/template.json.hbs | 4 +--- integrations/splunk/templates/template.json.hbs | 4 +--- sample-context/environment/create.json | 3 ++- sample-context/environment/delete.json | 3 ++- sample-context/environment/update.json | 3 ++- sample-context/flag/archive.json | 3 ++- sample-context/flag/copy.json | 3 ++- sample-context/flag/create.json | 3 ++- sample-context/flag/targeting-rule-update.json | 3 ++- sample-context/flag/toggle.json | 3 ++- sample-context/flag/update-all-environments.json | 3 ++- sample-context/other/metric.create.json | 3 ++- sample-context/other/segment.create.json | 3 ++- sample-context/other/segment.update.json | 3 ++- sample-context/other/webhook.enable.json | 3 ++- sample-context/project/create.json | 3 ++- sample-context/project/delete.json | 3 ++- sample-context/project/update.json | 3 ++- 23 files changed, 39 insertions(+), 29 deletions(-) diff --git a/integrations/dynatrace/templates/flag.json.hbs b/integrations/dynatrace/templates/flag.json.hbs index 6d986b39..5ac12657 100644 --- a/integrations/dynatrace/templates/flag.json.hbs +++ b/integrations/dynatrace/templates/flag.json.hbs @@ -29,9 +29,7 @@ "Environment name": "{{project.environment.name}}", "Environment key": "{{project.environment.key}}", "Comment": "{{#if comment}}{{comment}}{{/if}}", - {{#if member.firstName}}{{#if member.lastName}} - "User name": "{{member.firstName}} {{member.lastName}}", - {{/if}}{{/if}} + "User name": "{{member.displayName}}", "User email": "{{ member.email }}" }, "start": {{ timestamp.milliseconds }}, diff --git a/integrations/elastic/templates/template.json.hbs b/integrations/elastic/templates/template.json.hbs index c5e37421..24e6629a 100644 --- a/integrations/elastic/templates/template.json.hbs +++ b/integrations/elastic/templates/template.json.hbs @@ -30,7 +30,7 @@ "name": { "first": "{{member.firstName}}", "last": "{{member.lastName}}", - "full": "{{member.firstName}} {{member.lastName}}" + "full": "{{member.displayName}}" }, "link": "{{member._links.self.href}}" }, diff --git a/integrations/logdna/templates/template.json.hbs b/integrations/logdna/templates/template.json.hbs index 41f578fb..13773762 100644 --- a/integrations/logdna/templates/template.json.hbs +++ b/integrations/logdna/templates/template.json.hbs @@ -22,7 +22,7 @@ "kind": "{{kind}}", "member_id": "{{member._id}}", "member_email": "{{member.email}}", - "member_name": "{{member.firstName}} {{member.lastName}}" + "member_name": "{{member.displayName}}" } } ] diff --git a/integrations/new-relic-apm/templates/flag.json.hbs b/integrations/new-relic-apm/templates/flag.json.hbs index 3012be53..65219e19 100644 --- a/integrations/new-relic-apm/templates/flag.json.hbs +++ b/integrations/new-relic-apm/templates/flag.json.hbs @@ -3,7 +3,7 @@ "revision": "{{project.key}}/{{project.environment.key}}/{{key}}-{{timestamp.milliseconds}}", "changelog": "{{{title.plainText}}}", "description": "{{{title.plainText}}}{{#if comment}}, Comment: {{comment}}{{/if}}", - "user": "{{#if member.firstName}}{{member.firstName}}{{#if member.lastName}} {{/if}}{{/if}}{{#if member.lastName}}{{member.lastName}}{{/if}}", + "user": "{{member.displayName}}", "timestamp": "{{timestamp.rfc3339}}" } } diff --git a/integrations/new-relic/templates/template.json.hbs b/integrations/new-relic/templates/template.json.hbs index be7fddca..ba7ed2be 100644 --- a/integrations/new-relic/templates/template.json.hbs +++ b/integrations/new-relic/templates/template.json.hbs @@ -16,6 +16,6 @@ "environment_key": "{{project.environment.key}}", {{/if}} {{/if}} - "user": "{{#if member.firstName}}{{member.firstName}}{{#if member.lastName}} {{/if}}{{/if}}{{#if member.lastName}}{{member.lastName}}{{/if}}", + "user": "{{member.displayName}}", "user_email": "{{member.email}}" } diff --git a/integrations/signalfx/templates/template.json.hbs b/integrations/signalfx/templates/template.json.hbs index a404e2ad..439f9d8f 100644 --- a/integrations/signalfx/templates/template.json.hbs +++ b/integrations/signalfx/templates/template.json.hbs @@ -27,9 +27,7 @@ {{#if comment}} "comment": "{{comment}}", {{/if}} - {{#if member.firstName}}{{#if member.lastName}} - "user": "{{member.firstName}} {{member.lastName}}", - {{/if}}{{/if}} + "user": "{{member.displayName}}", "user_email": "{{member.email}}" }, "eventType": "LaunchDarkly {{kind}} change", diff --git a/integrations/splunk/templates/template.json.hbs b/integrations/splunk/templates/template.json.hbs index a4f1e638..84a8c859 100644 --- a/integrations/splunk/templates/template.json.hbs +++ b/integrations/splunk/templates/template.json.hbs @@ -20,9 +20,7 @@ {{#if comment}} "comment": "{{{comment}}}", {{/if}} - {{#if member.firstName}}{{#if member.lastName}} - "user": "{{member.firstName}} {{member.lastName}}", - {{/if}}{{/if}} + "user": "{{member.displayName}}", "user_email": "{{member.email}}" } } diff --git a/sample-context/environment/create.json b/sample-context/environment/create.json index 239db166..03ac97a1 100644 --- a/sample-context/environment/create.json +++ b/sample-context/environment/create.json @@ -62,7 +62,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "created the environment", "verbKind": "createEnvironment", diff --git a/sample-context/environment/delete.json b/sample-context/environment/delete.json index 136a5786..070c55dd 100644 --- a/sample-context/environment/delete.json +++ b/sample-context/environment/delete.json @@ -62,7 +62,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "deleted the environment", "verbKind": "deleteEnvironment", diff --git a/sample-context/environment/update.json b/sample-context/environment/update.json index 1b3b9346..f119faa8 100644 --- a/sample-context/environment/update.json +++ b/sample-context/environment/update.json @@ -62,7 +62,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "updated the environment", "verbKind": "updateTags", diff --git a/sample-context/flag/archive.json b/sample-context/flag/archive.json index 789f12d8..327562e6 100644 --- a/sample-context/flag/archive.json +++ b/sample-context/flag/archive.json @@ -63,7 +63,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "archived the flag", "verbKind": "updateArchived", diff --git a/sample-context/flag/copy.json b/sample-context/flag/copy.json index a4fb4f05..35c0db19 100644 --- a/sample-context/flag/copy.json +++ b/sample-context/flag/copy.json @@ -63,7 +63,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "updated the flag", "verbKind": "copyFlagConfigTo", diff --git a/sample-context/flag/create.json b/sample-context/flag/create.json index 98ba7225..1650f8a7 100644 --- a/sample-context/flag/create.json +++ b/sample-context/flag/create.json @@ -62,7 +62,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "created the flag", "verbKind": "createFlag", diff --git a/sample-context/flag/targeting-rule-update.json b/sample-context/flag/targeting-rule-update.json index 5d2500eb..8b4048da 100644 --- a/sample-context/flag/targeting-rule-update.json +++ b/sample-context/flag/targeting-rule-update.json @@ -77,7 +77,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "updated the flag", "verbKind": "updateRules", diff --git a/sample-context/flag/toggle.json b/sample-context/flag/toggle.json index 8f2c0a46..d3aa5967 100644 --- a/sample-context/flag/toggle.json +++ b/sample-context/flag/toggle.json @@ -77,7 +77,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "turned on the flag", "verbKind": "updateOn", diff --git a/sample-context/flag/update-all-environments.json b/sample-context/flag/update-all-environments.json index e51f2fca..d57d5f0c 100644 --- a/sample-context/flag/update-all-environments.json +++ b/sample-context/flag/update-all-environments.json @@ -77,7 +77,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "updated the flag", "verbKind": "updateTag", diff --git a/sample-context/other/metric.create.json b/sample-context/other/metric.create.json index 754775d8..6d353207 100644 --- a/sample-context/other/metric.create.json +++ b/sample-context/other/metric.create.json @@ -58,7 +58,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "created the metric", "verbKind": "createMetric", diff --git a/sample-context/other/segment.create.json b/sample-context/other/segment.create.json index 69f9d968..65fd86e7 100644 --- a/sample-context/other/segment.create.json +++ b/sample-context/other/segment.create.json @@ -58,7 +58,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "created the segment", "verbKind": "createSegment", diff --git a/sample-context/other/segment.update.json b/sample-context/other/segment.update.json index 9262fada..40abecba 100644 --- a/sample-context/other/segment.update.json +++ b/sample-context/other/segment.update.json @@ -59,7 +59,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "updated the segment", "verbKind": "updateRules", diff --git a/sample-context/other/webhook.enable.json b/sample-context/other/webhook.enable.json index 76cf3796..d7c29863 100644 --- a/sample-context/other/webhook.enable.json +++ b/sample-context/other/webhook.enable.json @@ -61,7 +61,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "enabled the webhook", "verbKind": "updateOn", diff --git a/sample-context/project/create.json b/sample-context/project/create.json index f73988a3..4878c35d 100644 --- a/sample-context/project/create.json +++ b/sample-context/project/create.json @@ -62,7 +62,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "created the project", "verbKind": "createProject", diff --git a/sample-context/project/delete.json b/sample-context/project/delete.json index 6a665f59..b480d7d7 100644 --- a/sample-context/project/delete.json +++ b/sample-context/project/delete.json @@ -62,7 +62,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "deleted the project", "verbKind": "deleteProject", diff --git a/sample-context/project/update.json b/sample-context/project/update.json index ad5d86d4..39fef30d 100644 --- a/sample-context/project/update.json +++ b/sample-context/project/update.json @@ -62,7 +62,8 @@ "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", "firstName": "Henrietta", - "lastName": "Powell" + "lastName": "Powell", + "displayName": "Henrietta Powell" }, "titleVerb": "updated the project", "verbKind": "updateTags", From e01c0b13426ee41ca7190513da9e63b963ce4bf8 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 17 Nov 2020 11:12:30 +0000 Subject: [PATCH 366/936] [ch94760] Save junit tests on Circle (#210) * Use pinned node orb * use junit and save results --- .circleci/config.yml | 21 ++++++++++++++------- package-lock.json | 41 +++++++++++++++++++++++++++++++++++++++++ package.json | 2 ++ 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b07e5216..10c1ab88 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,24 +8,31 @@ experimental: - master orbs: - aws-cli: circleci/aws-cli@0.1.16 + node: circleci/node@4.1.0 + aws-cli: circleci/aws-cli@1.3.0 linter: thekevjames/linter@1.0.49 jobs: build: - docker: - - image: circleci/node:latest + executor: + name: node/default + tag: '14.15.0' steps: - checkout - - run: - name: Install Dependencies - command: npm ci + - node/install-packages - run: name: prettier command: npm run prettier:check - run: name: Run tests - command: npm test + command: npm run test:ci + environment: + JEST_JUNIT_OUTPUT_DIR: ./reports/junit/ + when: always + - store_test_results: + path: ./reports/junit/ + - store_artifacts: + path: ./reports/junit upload-to-s3: executor: aws-cli/default steps: diff --git a/package-lock.json b/package-lock.json index e7031345..eb4b420e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2493,6 +2493,41 @@ "throat": "^5.0.0" } }, + "jest-junit": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.0.0.tgz", + "integrity": "sha512-+8K35LlboWiPuCnXSyiid7rFdxNlpCWWM20WEYe6IZH6psfUWKZmSpSRQ5tk0C0cBeDsvsnIzcef5mYhyJsbug==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^3.3.3", + "xml": "^1.0.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 + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "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" + } + } + } + }, "jest-leak-detector": { "version": "25.1.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", @@ -4583,6 +4618,12 @@ "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", "dev": true }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", diff --git a/package.json b/package.json index face769d..29dedf89 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "index.js", "scripts": { "test": "jest", + "test:ci": "jest --ci --runInBand --reporters=default --reporters=jest-junit", "build": "node bundleSchemas.js && prettier --write ./*.schema.json", "prettier:check": "prettier --list-different \"./**/*.{js,json}\"", "prettier:write": "prettier --write \"./**/*.{js,json}\"", @@ -32,6 +33,7 @@ "handlebars": "^4.7.6", "jest": "25.1.0", "jest-expect-message": "1.0.2", + "jest-junit": "^12.0.0", "jsonpointer": "^4.0.1", "lodash": "^4.17.19", "prettier": "^2.0.1" From 344128676f7dc098ff5bcbfcf544be093c5b40ee Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 8 Dec 2020 13:49:44 +0000 Subject: [PATCH 367/936] [ch95983] add dynamicEnum formVariable type field (#212) * add displayName to sample context * update dynatrace flag template * add displayName to all flag sample contexts * add displayName to env sample contexts * add displayName to other sample xontexts * add displayName to project sample contexts * update elastic template * update logdna template * update new relic template (including deprecated just for kicks) * update signalfx template * update splunk template * add dynamicEnum to formVariables type definition * add sample dropdownOptions field of dynamicEnum type * refactor endpoint out of auditLogEventsHook for general use across capabilities * add parser to dynamicOptions schema * refactor endpoints * add test to check dynamicEnum has dynamicOptions and vice versa --- __tests__/validateIntegrationManifests.js | 17 ++ integrations/sample-integration/manifest.json | 22 ++ manifest.schema.json | 208 ++++++++++++++++-- schemas/base.json | 82 +++++-- schemas/capabilities/auditLogEventsHook.json | 73 +----- schemas/definitions.json | 77 +++++++ 6 files changed, 372 insertions(+), 107 deletions(-) create mode 100644 schemas/definitions.json diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 5ffac528..0efd7357 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -190,6 +190,23 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'dynamicOptions is specified on dynamicEnum formVariable fields for %s', + (key, manifest) => { + const formVariables = _.get(manifest, 'formVariables', null); + if (formVariables) { + formVariables.forEach(formVariable => { + if (formVariable.type == 'dynamicEnum') { + expect(formVariable.dynamicOptions).toBeDefined(); + } + if (formVariable.dynamicOptions) { + expect(formVariable.type).toBe('dynamicEnum'); + } + }); + } + } + ); + test.each(manifests)( 'Templates can be successfully rendered for %s', (key, manifest) => { diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 3dbd16ee..fd250e0e 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -66,6 +66,28 @@ "type": "string", "isSecret": true, "isOptional": false + }, + { + "key": "dropdownOptions", + "name": "Dropdown Options", + "description": "this is a dynamic enum", + "type": "dynamicEnum", + "isSecret": false, + "isOptional": true, + "dynamicOptions": { + "endpoint": { + "url": "https://www.sample.com/", + "method": "GET", + "headers": [] + }, + "parser": { + "optionsPath": "/items", + "optionsItems": { + "label": "/name", + "value": "/value" + } + } + } } ], "capabilities": { diff --git a/manifest.schema.json b/manifest.schema.json index 5096ce9e..3066eeaf 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -235,12 +235,12 @@ "default": false }, "formVariables": { - "$id": "#/properties/formVariables", + "$id": "#/properties/form-variables", "title": "Form variables", "description": "Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`.", "type": "array", "items": { - "$id": "#/properties/formVariables/variable", + "$id": "#/properties/form-variables/variable", "title": "Form variable", "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", "type": "object", @@ -254,12 +254,13 @@ "isSecret", "isOptional", "defaultValue", - "allowedValues" + "allowedValues", + "dynamicOptions" ] }, "properties": { "key": { - "$id": "#/properties/formVariables/variable/key", + "$id": "#/properties/form-variables/variable/key", "title": "Key", "type": "string", "description": "A key will be used as the token name when the variable is substituted", @@ -267,14 +268,14 @@ "pattern": "^[^\\s]*$" }, "name": { - "$id": "#/properties/formVariables/variable/name", + "$id": "#/properties/form-variables/variable/name", "title": "Name", "type": "string", "description": "A descriptive name that will be used as the form label on the UI", "maxLength": 50 }, "type": { - "$id": "#/properties/formVariables/variable/type", + "$id": "#/properties/form-variables/variable/type", "title": "Type", "type": "string", "description": "The type of the variable", @@ -283,38 +284,39 @@ "boolean", "uri", "enum", - "oauth" + "oauth", + "dynamicEnum" ] }, "description": { - "$id": "#/properties/formVariables/variable/description", + "$id": "#/properties/form-variables/variable/description", "title": "Description", "type": "string", "description": "Describes the variable in the UI. Markdown links allowed.", "maxLength": 250 }, "placeholder": { - "$id": "#/properties/formVariables/variable/placeholder", + "$id": "#/properties/form-variables/variable/placeholder", "title": "Description", "type": "string", "description": "Placeholder value to use in the form element if applicable" }, "isSecret": { - "$id": "#/properties/formVariables/variable/is-secret", + "$id": "#/properties/form-variables/variable/is-secret", "title": "Is this variable a secret?", "type": "boolean", "description": "Secret variables will be masked in the UI", "default": false }, "isOptional": { - "$id": "#/properties/formVariables/variable/is-optional", + "$id": "#/properties/form-variables/variable/is-optional", "title": "Is this variable optional?", "type": "boolean", "description": "Variables marked as optional won't be required on the UI", "default": false }, "defaultValue": { - "$id": "#/properties/formVariables/variable/default-value", + "$id": "#/properties/form-variables/variable/default-value", "title": "Default value", "type": [ "boolean", @@ -323,13 +325,174 @@ "description": "Default value for variable. Can be overridden by user in the UI" }, "allowedValues": { - "$id": "#/properties/formVariables/variable/allowed-values", + "$id": "#/properties/form-variables/variable/allowed-values", "title": "Allowed values", "type": "array", "description": "allowed string values for enum-type formVariables", "items": { "type": "string" } + }, + "dynamicOptions": { + "$id": "#/properties/form-variables/variable/dynamic-options", + "title": "Dynamic options", + "type": "object", + "description": "Parser and endpoint for handling dynamicEnum", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET" + ], + "default": "POST" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url" + ] + }, + "parser": { + "$id": "#/properties/form-variables/variable/dynamic-options/parser", + "title": "Dynamic options parser", + "description": "Mapping of property names to location in JSON response", + "type": "object", + "required": [ + "optionsPath", + "optionsItems" + ], + "propertyNames": { + "enum": [ + "optionsPath", + "optionsItems" + ] + }, + "properties": { + "optionsPath": { + "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-path", + "title": "Options array path", + "description": "JSON path to the array containing options for parsing", + "type": "string" + }, + "optionsItems": { + "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items", + "title": "Options array", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items/label", + "title": "Label", + "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", + "type": "string" + }, + "value": { + "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items/value", + "title": "Value", + "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", + "type": "string" + } + } + } + } + } + } } }, "required": [ @@ -369,9 +532,9 @@ }, "properties": { "endpoint": { - "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", + "$id": "#/definitions/endpoint", "title": "Endpoint", - "description": "Properties that describe the HTTP endpoint LaunchDarkly will send hooks to", + "description": "Properties that describe an HTTP request to an external endpoint", "type": "object", "propertyNames": { "enum": [ @@ -382,29 +545,30 @@ }, "properties": { "url": { - "$id": "#/properties/capability/audit-log-events-hook/url", + "$id": "#/definitions/endpoint/url", "title": "URL", "type": "string", "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." }, "method": { - "$id": "#/properties/capability/audit-log-events-hook/method", + "$id": "#/definitions/endpoint/method", "title": "HTTP method", "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", "enum": [ "POST", "PUT", - "PATCH" + "PATCH", + "GET" ], "default": "POST" }, "headers": { - "$id": "#/properties/capability/audit-log-events-hook/headers", + "$id": "#/definitions/endpoint/headers", "title": "HTTP headers", "description": "Headers to send with the webhook request", "type": "array", "items": { - "$id": "#/properties/capability/audit-log-events-hook/header/items", + "$id": "#/definitions/endpoint/header/items", "title": "Header items", "description": "A name and value pair to send as headers with the hook request", "type": "object", @@ -416,7 +580,7 @@ }, "properties": { "name": { - "$id": "#/properties/capability/audit-log-events-hook/header/items/name", + "$id": "#/definitions/endpoint/header/items/name", "title": "Name", "type": "string", "description": "Name of the header", @@ -424,7 +588,7 @@ "pattern": "^[^\\s]*$" }, "value": { - "$id": "#/properties/capability/audit-log-events-hook/header/items/value", + "$id": "#/definitions/endpoint/header/items/value", "title": "Value", "type": "string", "description": "Value of the header. Form variables can be substituted in using {{variableName}}" diff --git a/schemas/base.json b/schemas/base.json index 981b7398..2715b45b 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -213,12 +213,12 @@ "default": false }, "formVariables": { - "$id": "#/properties/formVariables", + "$id": "#/properties/form-variables", "title": "Form variables", "description": "Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`.", "type": "array", "items": { - "$id": "#/properties/formVariables/variable", + "$id": "#/properties/form-variables/variable", "title": "Form variable", "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", "type": "object", @@ -232,12 +232,13 @@ "isSecret", "isOptional", "defaultValue", - "allowedValues" + "allowedValues", + "dynamicOptions" ] }, "properties": { "key": { - "$id": "#/properties/formVariables/variable/key", + "$id": "#/properties/form-variables/variable/key", "title": "Key", "type": "string", "description": "A key will be used as the token name when the variable is substituted", @@ -245,60 +246,115 @@ "pattern": "^[^\\s]*$" }, "name": { - "$id": "#/properties/formVariables/variable/name", + "$id": "#/properties/form-variables/variable/name", "title": "Name", "type": "string", "description": "A descriptive name that will be used as the form label on the UI", "maxLength": 50 }, "type": { - "$id": "#/properties/formVariables/variable/type", + "$id": "#/properties/form-variables/variable/type", "title": "Type", "type": "string", "description": "The type of the variable", - "enum": ["string", "boolean", "uri", "enum", "oauth"] + "enum": ["string", "boolean", "uri", "enum", "oauth", "dynamicEnum"] }, "description": { - "$id": "#/properties/formVariables/variable/description", + "$id": "#/properties/form-variables/variable/description", "title": "Description", "type": "string", "description": "Describes the variable in the UI. Markdown links allowed.", "maxLength": 250 }, "placeholder": { - "$id": "#/properties/formVariables/variable/placeholder", + "$id": "#/properties/form-variables/variable/placeholder", "title": "Description", "type": "string", "description": "Placeholder value to use in the form element if applicable" }, "isSecret": { - "$id": "#/properties/formVariables/variable/is-secret", + "$id": "#/properties/form-variables/variable/is-secret", "title": "Is this variable a secret?", "type": "boolean", "description": "Secret variables will be masked in the UI", "default": false }, "isOptional": { - "$id": "#/properties/formVariables/variable/is-optional", + "$id": "#/properties/form-variables/variable/is-optional", "title": "Is this variable optional?", "type": "boolean", "description": "Variables marked as optional won't be required on the UI", "default": false }, "defaultValue": { - "$id": "#/properties/formVariables/variable/default-value", + "$id": "#/properties/form-variables/variable/default-value", "title": "Default value", "type": ["boolean", "string"], "description": "Default value for variable. Can be overridden by user in the UI" }, "allowedValues": { - "$id": "#/properties/formVariables/variable/allowed-values", + "$id": "#/properties/form-variables/variable/allowed-values", "title": "Allowed values", "type": "array", "description": "allowed string values for enum-type formVariables", "items": { "type": "string" } + }, + "dynamicOptions": { + "$id": "#/properties/form-variables/variable/dynamic-options", + "title": "Dynamic options", + "type": "object", + "description": "Parser and endpoint for handling dynamicEnum", + "propertyNames": { + "enum": ["endpoint", "parser"] + }, + "required": ["endpoint", "parser"], + "properties": { + "endpoint": { + "$ref": "schemas/definitions.json#/endpoint" + }, + "parser": { + "$id": "#/properties/form-variables/variable/dynamic-options/parser", + "title": "Dynamic options parser", + "description": "Mapping of property names to location in JSON response", + "type": "object", + "required": ["optionsPath", "optionsItems"], + "propertyNames": { + "enum": ["optionsPath", "optionsItems"] + }, + "properties": { + "optionsPath": { + "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-path", + "title": "Options array path", + "description": "JSON path to the array containing options for parsing", + "type": "string" + }, + "optionsItems": { + "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items", + "title": "Options array", + "propertyNames": { + "enum": ["label", "value"] + }, + "required": ["label", "value"], + "properties": { + "label": { + "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items/label", + "title": "Label", + "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", + "type": "string" + }, + "value": { + "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items/value", + "title": "Value", + "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", + "type": "string" + } + } + } + } + } + } } }, "required": ["key", "name", "type", "description"] diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index 80cff049..be5b2888 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -10,78 +10,7 @@ }, "properties": { "endpoint": { - "$id": "#/properties/capability/audit-log-events-hook/receiving-endpoint", - "title": "Endpoint", - "description": "Properties that describe the HTTP endpoint LaunchDarkly will send hooks to", - "type": "object", - "propertyNames": { - "enum": ["url", "method", "headers"] - }, - "properties": { - "url": { - "$id": "#/properties/capability/audit-log-events-hook/url", - "title": "URL", - "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." - }, - "method": { - "$id": "#/properties/capability/audit-log-events-hook/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": ["POST", "PUT", "PATCH"], - "default": "POST" - }, - "headers": { - "$id": "#/properties/capability/audit-log-events-hook/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/properties/capability/audit-log-events-hook/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": ["name", "value"] - }, - "properties": { - "name": { - "$id": "#/properties/capability/audit-log-events-hook/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/properties/capability/audit-log-events-hook/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": ["name", "value"] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 - } - }, - "required": ["url"] + "$ref": "../definitions.json#/endpoint" }, "templates": { "$id": "#/properties/capability/audit-log-events-hook/templates", diff --git a/schemas/definitions.json b/schemas/definitions.json new file mode 100644 index 00000000..fb76d27e --- /dev/null +++ b/schemas/definitions.json @@ -0,0 +1,77 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": ["url", "method", "headers"] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": ["POST", "PUT", "PATCH", "GET"], + "default": "POST" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": ["name", "value"] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": ["name", "value"] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": ["url"] + } +} From ffc3ae03d0ffd03dab9aac136b0a3bc78ba0135a Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 9 Dec 2020 11:47:16 +0000 Subject: [PATCH 368/936] [ch95983] Add reqres API endpoint to sample-integration manifest (#213) * Add reqres API endpoint to sample-integration manifest * make sure dynamic enum is passed to context in preview and tests * Add color as query param --- __tests__/validateIntegrationManifests.js | 3 +++ integrations/sample-integration/manifest.json | 12 ++++++------ .../sample-integration/templates/flag.json.hbs | 1 + preview.js | 3 +++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 0efd7357..63063558 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -36,6 +36,9 @@ const getFormVariableContext = formVariables => { case 'enum': endpointContext[formVariable.key] = formVariable.key; break; + case 'dynamicEnum': + endpointContext[formVariable.key] = formVariable.key; + break; } }); } diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index fd250e0e..715a372d 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -68,23 +68,23 @@ "isOptional": false }, { - "key": "dropdownOptions", - "name": "Dropdown Options", + "key": "color", + "name": "Dynamic color options", "description": "this is a dynamic enum", "type": "dynamicEnum", "isSecret": false, "isOptional": true, "dynamicOptions": { "endpoint": { - "url": "https://www.sample.com/", + "url": "https://reqres.in/api/unknown", "method": "GET", "headers": [] }, "parser": { - "optionsPath": "/items", + "optionsPath": "/data", "optionsItems": { "label": "/name", - "value": "/value" + "value": "/color" } } } @@ -93,7 +93,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "https://example.com/webhookin", + "url": "https://example.com/webhookin?color={{color}}", "method": "POST", "headers": [ { diff --git a/integrations/sample-integration/templates/flag.json.hbs b/integrations/sample-integration/templates/flag.json.hbs index 6e34bc9e..f0434fe9 100644 --- a/integrations/sample-integration/templates/flag.json.hbs +++ b/integrations/sample-integration/templates/flag.json.hbs @@ -4,5 +4,6 @@ "date_happened": "{{timestamp.seconds}}", "tags": ["any", "arbitrary", "tag"], "source_type_name": "example.com", + "color": "{{formVariables.color}}", "extra": "This is a feature flag" } diff --git a/preview.js b/preview.js index b18e79c3..600d7ea5 100644 --- a/preview.js +++ b/preview.js @@ -35,6 +35,9 @@ const getFormVariableContext = formVariables => { case 'enum': endpointContext[formVariable.key] = unsubstitutedKey; break; + case 'dynamicEnum': + endpointContext[formVariable.key] = unsubstitutedKey; + break; } }); } From 3ddc5d510dbfc8df2363e2b17ff8ac7bdb0c0237 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 9 Dec 2020 17:44:04 -0800 Subject: [PATCH 369/936] [ch95892] Goaltender info for Tray (tray.io) (#211) --- .../tray/assets/images/horizontal.svg | 18 ++++++++++++++++++ integrations/tray/assets/images/square.svg | 17 +++++++++++++++++ integrations/tray/manifest.json | 19 +++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 integrations/tray/assets/images/horizontal.svg create mode 100644 integrations/tray/assets/images/square.svg create mode 100644 integrations/tray/manifest.json diff --git a/integrations/tray/assets/images/horizontal.svg b/integrations/tray/assets/images/horizontal.svg new file mode 100644 index 00000000..9bfaf4fd --- /dev/null +++ b/integrations/tray/assets/images/horizontal.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/integrations/tray/assets/images/square.svg b/integrations/tray/assets/images/square.svg new file mode 100644 index 00000000..fba31a82 --- /dev/null +++ b/integrations/tray/assets/images/square.svg @@ -0,0 +1,17 @@ + + + + + + + + background + + + + Layer 1 + + + + + diff --git a/integrations/tray/manifest.json b/integrations/tray/manifest.json new file mode 100644 index 00000000..13742566 --- /dev/null +++ b/integrations/tray/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "Tray", + "version": "1.0.0", + "overview": "Utilize LaunchDarkly in your Tray.io workflows.", + "description": "To set this up, grant Tray.io access to your LaunchDarkly account with an access token.", + "details": "Use LaunchDarkly as a connector in Tray.io to automate workflows. Connector operations allow you to incorporate LaunchDarkly workflows with many other web services. Tray.io's flexible automation allows you to use LaunchDarkly data and operations in endless ways, including exporting flag status, triggering an update to expiring users, and more.", + "author": "Tray.io", + "supportEmail": "support@tray.io", + "links": { + "site": "https://tray.io/", + "launchdarklyDocs": "https://tray.io/documentation/platform/connectors/docs/service/launchdarkly/", + "privacyPolicy": "https://tray.io/privacy" + }, + "categories": ["automation"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + } +} From ad9e3e0341f571fc48050047ff9598eab774ff32 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 10 Dec 2020 11:10:27 +0000 Subject: [PATCH 370/936] [ch95983] refactor reusable components out of schema (#214) * refactor documentation url out of trigger * replace external condition endpoint with generic * factor out the subparts of the reusable endpoint to allow for description flexibility * replace external condition endpoint properties * refactor endpointProperties * refactor out capability parsers into parser file --- manifest.schema.json | 57 ++++---- schemas/capabilities/externalCondition.json | 134 +----------------- schemas/capabilities/parser/parser.json | 33 ++++- schemas/capabilities/trigger.json | 35 +---- schemas/definitions.json | 144 +++++++++++--------- 5 files changed, 150 insertions(+), 253 deletions(-) diff --git a/manifest.schema.json b/manifest.schema.json index 3066eeaf..801db481 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -859,34 +859,32 @@ "headers" ] }, - "required": [ - "url" - ], "properties": { "url": { - "$id": "#/properties/capability/external-condition/creation/endpoint/url", + "$id": "#/definitions/endpoint/url", "title": "URL", "type": "string", "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." }, "method": { - "$id": "#/properties/capability/external-condition/creation/method", + "$id": "#/definitions/endpoint/method", "title": "HTTP method", "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", "enum": [ "POST", "PUT", - "PATCH" + "PATCH", + "GET" ], "default": "POST" }, "headers": { - "$id": "#/properties/capability/external-condition/creation/headers", + "$id": "#/definitions/endpoint/headers", "title": "HTTP headers", "description": "Headers to send with the webhook request", "type": "array", "items": { - "$id": "#/properties/capability/external-condition/creation/endpoint/header/items", + "$id": "#/definitions/endpoint/header/items", "title": "Header items", "description": "A name and value pair to send as headers with the hook request", "type": "object", @@ -898,7 +896,7 @@ }, "properties": { "name": { - "$id": "#/properties/capability/external-condition/creation/endpoint/header/items/name", + "$id": "#/definitions/endpoint/header/items/name", "title": "Name", "type": "string", "description": "Name of the header", @@ -906,7 +904,7 @@ "pattern": "^[^\\s]*$" }, "value": { - "$id": "#/properties/capability/external-condition/creation/endpoint/header/items/value", + "$id": "#/definitions/endpoint/header/items/value", "title": "Value", "type": "string", "description": "Value of the header. Form variables can be substituted in using {{variableName}}" @@ -935,7 +933,10 @@ ], "minProperties": 1 } - } + }, + "required": [ + "url" + ] }, "template": { "$id": "#/properties/capability/external-condition/creation/template", @@ -944,7 +945,7 @@ "type": "string" }, "parser": { - "$id": "#/parser", + "$id": "#/external-condition-parser", "title": "Response parser", "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", "type": "object", @@ -1062,30 +1063,30 @@ ], "properties": { "url": { - "$id": "#/properties/capability/external-condition/polling-update/endpoint/url", + "$id": "#/definitions/endpoint/url", "title": "URL", "type": "string", "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." }, "method": { - "$id": "#/properties/capability/external-condition/polling-update/method", + "$id": "#/definitions/endpoint/method", "title": "HTTP method", "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", "enum": [ - "GET", "POST", "PUT", - "PATCH" + "PATCH", + "GET" ], - "default": "GET" + "default": "POST" }, "headers": { - "$id": "#/properties/capability/external-condition/polling-update/headers", + "$id": "#/definitions/endpoint/headers", "title": "HTTP headers", "description": "Headers to send with the webhook request", "type": "array", "items": { - "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items", + "$id": "#/definitions/endpoint/header/items", "title": "Header items", "description": "A name and value pair to send as headers with the hook request", "type": "object", @@ -1097,7 +1098,7 @@ }, "properties": { "name": { - "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items/name", + "$id": "#/definitions/endpoint/header/items/name", "title": "Name", "type": "string", "description": "Name of the header", @@ -1105,7 +1106,7 @@ "pattern": "^[^\\s]*$" }, "value": { - "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items/value", + "$id": "#/definitions/endpoint/header/items/value", "title": "Value", "type": "string", "description": "Value of the header. Form variables can be substituted in using {{variableName}}" @@ -1137,7 +1138,7 @@ } }, "parser": { - "$id": "#/parser", + "$id": "#/external-condition-parser", "title": "Response parser", "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", "type": "object", @@ -1243,9 +1244,9 @@ ], "properties": { "documentation": { - "$id": "#/properties/capability/trigger/auth", + "$id": "#/definitions/documentation", "title": "Documentation link", - "description": "URL to documentation describing how to configure the trigger.", + "description": "URL to documentation describing how to configure the integration.", "type": "string", "maxLength": 2048, "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" @@ -1274,7 +1275,7 @@ "default": ".*[Tt][Ee][Ss][Tt].*" }, "parser": { - "$id": "#/properties/capability/trigger/trigger-parser", + "$id": "#/trigger-parser", "title": "Trigger parser", "description": "Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer", "type": "object", @@ -1287,19 +1288,19 @@ }, "properties": { "eventName": { - "$id": "#/properties/capability/trigger/trigger-parser/event-name", + "$id": "#/properties/event-name", "title": "Event name pointer", "description": "JSON pointer to an event name", "type": "string" }, "value": { - "$id": "#/properties/capability/trigger/trigger-parser/value", + "$id": "#/properties/value", "title": "Value pointer", "description": "JSON pointer to a metric value", "type": "string" }, "url": { - "$id": "#/properties/capability/trigger/trigger-parser/url", + "$id": "#/properties/url", "title": "URL pointer", "description": "JSON pointer to the external alert URL", "type": "string" diff --git a/schemas/capabilities/externalCondition.json b/schemas/capabilities/externalCondition.json index 73103e98..811441a0 100644 --- a/schemas/capabilities/externalCondition.json +++ b/schemas/capabilities/externalCondition.json @@ -28,71 +28,10 @@ "propertyNames": { "enum": ["url", "method", "headers"] }, - "required": ["url"], "properties": { - "url": { - "$id": "#/properties/capability/external-condition/creation/endpoint/url", - "title": "URL", - "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." - }, - "method": { - "$id": "#/properties/capability/external-condition/creation/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": ["POST", "PUT", "PATCH"], - "default": "POST" - }, - "headers": { - "$id": "#/properties/capability/external-condition/creation/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/properties/capability/external-condition/creation/endpoint/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": ["name", "value"] - }, - "properties": { - "name": { - "$id": "#/properties/capability/external-condition/creation/endpoint/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/properties/capability/external-condition/creation/endpoint/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": ["name", "value"] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 - } - } + "$ref": "../definitions.json#/endpointProperties" + }, + "required": ["url"] }, "template": { "$id": "#/properties/capability/external-condition/creation/template", @@ -101,7 +40,7 @@ "type": "string" }, "parser": { - "$ref": "parser/parser.json#/parser" + "$ref": "parser/parser.json#/externalConditionParser" } } }, @@ -125,72 +64,11 @@ }, "required": ["url"], "properties": { - "url": { - "$id": "#/properties/capability/external-condition/polling-update/endpoint/url", - "title": "URL", - "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." - }, - "method": { - "$id": "#/properties/capability/external-condition/polling-update/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": ["GET", "POST", "PUT", "PATCH"], - "default": "GET" - }, - "headers": { - "$id": "#/properties/capability/external-condition/polling-update/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": ["name", "value"] - }, - "properties": { - "name": { - "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/properties/capability/external-condition/polling-update/endpoint/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": ["name", "value"] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 - } + "$ref": "../definitions.json#/endpointProperties" } }, "parser": { - "$ref": "parser/parser.json#/parser" + "$ref": "parser/parser.json#/externalConditionParser" } } } diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index 8b958987..a9c47127 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "parser": { - "$id": "#/parser", + "externalConditionParser": { + "$id": "#/external-condition-parser", "title": "Response parser", "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", "type": "object", @@ -65,5 +65,34 @@ } }, "required": ["id", "url"] + }, + "triggerParser": { + "$id": "#/trigger-parser", + "title": "Trigger parser", + "description": "Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": ["eventName", "value", "url"] + }, + "properties": { + "eventName": { + "$id": "#/properties/event-name", + "title": "Event name pointer", + "description": "JSON pointer to an event name", + "type": "string" + }, + "value": { + "$id": "#/properties/value", + "title": "Value pointer", + "description": "JSON pointer to a metric value", + "type": "string" + }, + "url": { + "$id": "#/properties/url", + "title": "URL pointer", + "description": "JSON pointer to the external alert URL", + "type": "string" + } + } } } diff --git a/schemas/capabilities/trigger.json b/schemas/capabilities/trigger.json index 63d731a0..4ea475c5 100644 --- a/schemas/capabilities/trigger.json +++ b/schemas/capabilities/trigger.json @@ -17,12 +17,7 @@ "required": ["documentation"], "properties": { "documentation": { - "$id": "#/properties/capability/trigger/auth", - "title": "Documentation link", - "description": "URL to documentation describing how to configure the trigger.", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + "$ref": "../definitions.json#/documentation" }, "auth": { "$id": "#/properties/capability/trigger/auth", @@ -46,33 +41,7 @@ "default": ".*[Tt][Ee][Ss][Tt].*" }, "parser": { - "$id": "#/properties/capability/trigger/trigger-parser", - "title": "Trigger parser", - "description": "Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer", - "type": "object", - "propertyNames": { - "enum": ["eventName", "value", "url"] - }, - "properties": { - "eventName": { - "$id": "#/properties/capability/trigger/trigger-parser/event-name", - "title": "Event name pointer", - "description": "JSON pointer to an event name", - "type": "string" - }, - "value": { - "$id": "#/properties/capability/trigger/trigger-parser/value", - "title": "Value pointer", - "description": "JSON pointer to a metric value", - "type": "string" - }, - "url": { - "$id": "#/properties/capability/trigger/trigger-parser/url", - "title": "URL pointer", - "description": "JSON pointer to the external alert URL", - "type": "string" - } - } + "$ref": "parser/parser.json#/triggerParser" } } } diff --git a/schemas/definitions.json b/schemas/definitions.json index fb76d27e..d14bd99a 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -1,5 +1,86 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "documentation": { + "$id": "#/definitions/documentation", + "title": "Documentation link", + "description": "URL to documentation describing how to configure the integration.", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "endpointUrl": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "endpointMethod": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": ["POST", "PUT", "PATCH", "GET"], + "default": "POST" + }, + "endpointHeaders": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": ["name", "value"] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": ["name", "value"] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + }, + "endpointProperties": { + "url": { + "$ref": "#/endpointUrl" + }, + "method": { + "$ref": "#/endpointMethod" + }, + "headers": { + "$ref": "#/endpointHeaders" + } + }, "endpoint": { "$id": "#/definitions/endpoint", "title": "Endpoint", @@ -9,68 +90,7 @@ "enum": ["url", "method", "headers"] }, "properties": { - "url": { - "$id": "#/definitions/endpoint/url", - "title": "URL", - "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." - }, - "method": { - "$id": "#/definitions/endpoint/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": ["POST", "PUT", "PATCH", "GET"], - "default": "POST" - }, - "headers": { - "$id": "#/definitions/endpoint/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/definitions/endpoint/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": ["name", "value"] - }, - "properties": { - "name": { - "$id": "#/definitions/endpoint/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/definitions/endpoint/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": ["name", "value"] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 - } + "$ref": "#/endpointProperties" }, "required": ["url"] } From d6da97b3834dfbe27f8f3380d73124de0966bb07 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 11 Dec 2020 12:58:18 +0000 Subject: [PATCH 371/936] Add string type to endpoint method and make it required (#215) --- manifest.schema.json | 20 ++++++++++++-------- schemas/capabilities/externalCondition.json | 4 ++-- schemas/definitions.json | 4 ++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/manifest.schema.json b/manifest.schema.json index 801db481..db5d551e 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -378,7 +378,7 @@ "PATCH", "GET" ], - "default": "POST" + "type": "string" }, "headers": { "$id": "#/definitions/endpoint/headers", @@ -437,7 +437,8 @@ } }, "required": [ - "url" + "url", + "method" ] }, "parser": { @@ -560,7 +561,7 @@ "PATCH", "GET" ], - "default": "POST" + "type": "string" }, "headers": { "$id": "#/definitions/endpoint/headers", @@ -619,7 +620,8 @@ } }, "required": [ - "url" + "url", + "method" ] }, "templates": { @@ -876,7 +878,7 @@ "PATCH", "GET" ], - "default": "POST" + "type": "string" }, "headers": { "$id": "#/definitions/endpoint/headers", @@ -935,7 +937,8 @@ } }, "required": [ - "url" + "url", + "method" ] }, "template": { @@ -1059,7 +1062,8 @@ ] }, "required": [ - "url" + "url", + "method" ], "properties": { "url": { @@ -1078,7 +1082,7 @@ "PATCH", "GET" ], - "default": "POST" + "type": "string" }, "headers": { "$id": "#/definitions/endpoint/headers", diff --git a/schemas/capabilities/externalCondition.json b/schemas/capabilities/externalCondition.json index 811441a0..c82ee25a 100644 --- a/schemas/capabilities/externalCondition.json +++ b/schemas/capabilities/externalCondition.json @@ -31,7 +31,7 @@ "properties": { "$ref": "../definitions.json#/endpointProperties" }, - "required": ["url"] + "required": ["url", "method"] }, "template": { "$id": "#/properties/capability/external-condition/creation/template", @@ -62,7 +62,7 @@ "propertyNames": { "enum": ["url", "method", "headers"] }, - "required": ["url"], + "required": ["url", "method"], "properties": { "$ref": "../definitions.json#/endpointProperties" } diff --git a/schemas/definitions.json b/schemas/definitions.json index d14bd99a..aa9a24e3 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -19,7 +19,7 @@ "title": "HTTP method", "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", "enum": ["POST", "PUT", "PATCH", "GET"], - "default": "POST" + "type": "string" }, "endpointHeaders": { "$id": "#/definitions/endpoint/headers", @@ -92,6 +92,6 @@ "properties": { "$ref": "#/endpointProperties" }, - "required": ["url"] + "required": ["url", "method"] } } From dedffa8b41a499de698d65e70497335ceaeb26ba Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 11 Dec 2020 14:25:46 +0000 Subject: [PATCH 372/936] Remove oauth from sample-integration (#216) --- integrations/sample-integration/manifest.json | 1 - 1 file changed, 1 deletion(-) diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 715a372d..3a321c6d 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -14,7 +14,6 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, - "requiresOAuth": true, "formVariables": [ { "key": "optional", From 2d782bda08a2924b899a11c88394f41a49fc497d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 11 Dec 2020 16:02:40 +0000 Subject: [PATCH 373/936] Move formVariable items to definitions.json (#217) --- manifest.schema.json | 32 ++++----- schemas/base.json | 141 +------------------------------------- schemas/definitions.json | 142 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 156 deletions(-) diff --git a/manifest.schema.json b/manifest.schema.json index db5d551e..4f2b0c7e 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -240,7 +240,7 @@ "description": "Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`.", "type": "array", "items": { - "$id": "#/properties/form-variables/variable", + "$id": "#/definitions/form-variable", "title": "Form variable", "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", "type": "object", @@ -260,7 +260,7 @@ }, "properties": { "key": { - "$id": "#/properties/form-variables/variable/key", + "$id": "#/definitions/form-variable/key", "title": "Key", "type": "string", "description": "A key will be used as the token name when the variable is substituted", @@ -268,14 +268,14 @@ "pattern": "^[^\\s]*$" }, "name": { - "$id": "#/properties/form-variables/variable/name", + "$id": "#/definitions/form-variable/name", "title": "Name", "type": "string", "description": "A descriptive name that will be used as the form label on the UI", "maxLength": 50 }, "type": { - "$id": "#/properties/form-variables/variable/type", + "$id": "#/definitions/form-variable/type", "title": "Type", "type": "string", "description": "The type of the variable", @@ -289,34 +289,34 @@ ] }, "description": { - "$id": "#/properties/form-variables/variable/description", + "$id": "#/definitions/form-variable/description", "title": "Description", "type": "string", "description": "Describes the variable in the UI. Markdown links allowed.", "maxLength": 250 }, "placeholder": { - "$id": "#/properties/form-variables/variable/placeholder", + "$id": "#/definitions/form-variable/placeholder", "title": "Description", "type": "string", "description": "Placeholder value to use in the form element if applicable" }, "isSecret": { - "$id": "#/properties/form-variables/variable/is-secret", + "$id": "#/definitions/form-variable/is-secret", "title": "Is this variable a secret?", "type": "boolean", "description": "Secret variables will be masked in the UI", "default": false }, "isOptional": { - "$id": "#/properties/form-variables/variable/is-optional", + "$id": "#/definitions/form-variable/is-optional", "title": "Is this variable optional?", "type": "boolean", "description": "Variables marked as optional won't be required on the UI", "default": false }, "defaultValue": { - "$id": "#/properties/form-variables/variable/default-value", + "$id": "#/definitions/form-variable/default-value", "title": "Default value", "type": [ "boolean", @@ -325,7 +325,7 @@ "description": "Default value for variable. Can be overridden by user in the UI" }, "allowedValues": { - "$id": "#/properties/form-variables/variable/allowed-values", + "$id": "#/definitions/form-variable/allowed-values", "title": "Allowed values", "type": "array", "description": "allowed string values for enum-type formVariables", @@ -334,7 +334,7 @@ } }, "dynamicOptions": { - "$id": "#/properties/form-variables/variable/dynamic-options", + "$id": "#/definitions/form-variable/dynamic-options", "title": "Dynamic options", "type": "object", "description": "Parser and endpoint for handling dynamicEnum", @@ -442,7 +442,7 @@ ] }, "parser": { - "$id": "#/properties/form-variables/variable/dynamic-options/parser", + "$id": "#/definitions/form-variable/dynamic-options/parser", "title": "Dynamic options parser", "description": "Mapping of property names to location in JSON response", "type": "object", @@ -458,13 +458,13 @@ }, "properties": { "optionsPath": { - "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-path", + "$id": "#/definitions/form-variable/dynamic-options/parser/options-path", "title": "Options array path", "description": "JSON path to the array containing options for parsing", "type": "string" }, "optionsItems": { - "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items", + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items", "title": "Options array", "propertyNames": { "enum": [ @@ -478,13 +478,13 @@ ], "properties": { "label": { - "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items/label", + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/label", "title": "Label", "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", "type": "string" }, "value": { - "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items/value", + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/value", "title": "Value", "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", "type": "string" diff --git a/schemas/base.json b/schemas/base.json index 2715b45b..21a3f24d 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -218,146 +218,7 @@ "description": "Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`.", "type": "array", "items": { - "$id": "#/properties/form-variables/variable", - "title": "Form variable", - "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", - "type": "object", - "propertyNames": { - "enum": [ - "key", - "name", - "type", - "description", - "placeholder", - "isSecret", - "isOptional", - "defaultValue", - "allowedValues", - "dynamicOptions" - ] - }, - "properties": { - "key": { - "$id": "#/properties/form-variables/variable/key", - "title": "Key", - "type": "string", - "description": "A key will be used as the token name when the variable is substituted", - "maxLength": 20, - "pattern": "^[^\\s]*$" - }, - "name": { - "$id": "#/properties/form-variables/variable/name", - "title": "Name", - "type": "string", - "description": "A descriptive name that will be used as the form label on the UI", - "maxLength": 50 - }, - "type": { - "$id": "#/properties/form-variables/variable/type", - "title": "Type", - "type": "string", - "description": "The type of the variable", - "enum": ["string", "boolean", "uri", "enum", "oauth", "dynamicEnum"] - }, - "description": { - "$id": "#/properties/form-variables/variable/description", - "title": "Description", - "type": "string", - "description": "Describes the variable in the UI. Markdown links allowed.", - "maxLength": 250 - }, - "placeholder": { - "$id": "#/properties/form-variables/variable/placeholder", - "title": "Description", - "type": "string", - "description": "Placeholder value to use in the form element if applicable" - }, - "isSecret": { - "$id": "#/properties/form-variables/variable/is-secret", - "title": "Is this variable a secret?", - "type": "boolean", - "description": "Secret variables will be masked in the UI", - "default": false - }, - "isOptional": { - "$id": "#/properties/form-variables/variable/is-optional", - "title": "Is this variable optional?", - "type": "boolean", - "description": "Variables marked as optional won't be required on the UI", - "default": false - }, - "defaultValue": { - "$id": "#/properties/form-variables/variable/default-value", - "title": "Default value", - "type": ["boolean", "string"], - "description": "Default value for variable. Can be overridden by user in the UI" - }, - "allowedValues": { - "$id": "#/properties/form-variables/variable/allowed-values", - "title": "Allowed values", - "type": "array", - "description": "allowed string values for enum-type formVariables", - "items": { - "type": "string" - } - }, - "dynamicOptions": { - "$id": "#/properties/form-variables/variable/dynamic-options", - "title": "Dynamic options", - "type": "object", - "description": "Parser and endpoint for handling dynamicEnum", - "propertyNames": { - "enum": ["endpoint", "parser"] - }, - "required": ["endpoint", "parser"], - "properties": { - "endpoint": { - "$ref": "schemas/definitions.json#/endpoint" - }, - "parser": { - "$id": "#/properties/form-variables/variable/dynamic-options/parser", - "title": "Dynamic options parser", - "description": "Mapping of property names to location in JSON response", - "type": "object", - "required": ["optionsPath", "optionsItems"], - "propertyNames": { - "enum": ["optionsPath", "optionsItems"] - }, - "properties": { - "optionsPath": { - "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-path", - "title": "Options array path", - "description": "JSON path to the array containing options for parsing", - "type": "string" - }, - "optionsItems": { - "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items", - "title": "Options array", - "propertyNames": { - "enum": ["label", "value"] - }, - "required": ["label", "value"], - "properties": { - "label": { - "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items/label", - "title": "Label", - "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", - "type": "string" - }, - "value": { - "$id": "#/properties/form-variables/variable/dynamic-options/parser/options-items/value", - "title": "Value", - "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", - "type": "string" - } - } - } - } - } - } - } - }, - "required": ["key", "name", "type", "description"] + "$ref": "schemas/definitions.json#/formVariable" }, "default": [] }, diff --git a/schemas/definitions.json b/schemas/definitions.json index aa9a24e3..efc5cbe8 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -93,5 +93,147 @@ "$ref": "#/endpointProperties" }, "required": ["url", "method"] + }, + "formVariable": { + "$id": "#/definitions/form-variable", + "title": "Form variable", + "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "description", + "placeholder", + "isSecret", + "isOptional", + "defaultValue", + "allowedValues", + "dynamicOptions" + ] + }, + "properties": { + "key": { + "$id": "#/definitions/form-variable/key", + "title": "Key", + "type": "string", + "description": "A key will be used as the token name when the variable is substituted", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "name": { + "$id": "#/definitions/form-variable/name", + "title": "Name", + "type": "string", + "description": "A descriptive name that will be used as the form label on the UI", + "maxLength": 50 + }, + "type": { + "$id": "#/definitions/form-variable/type", + "title": "Type", + "type": "string", + "description": "The type of the variable", + "enum": ["string", "boolean", "uri", "enum", "oauth", "dynamicEnum"] + }, + "description": { + "$id": "#/definitions/form-variable/description", + "title": "Description", + "type": "string", + "description": "Describes the variable in the UI. Markdown links allowed.", + "maxLength": 250 + }, + "placeholder": { + "$id": "#/definitions/form-variable/placeholder", + "title": "Description", + "type": "string", + "description": "Placeholder value to use in the form element if applicable" + }, + "isSecret": { + "$id": "#/definitions/form-variable/is-secret", + "title": "Is this variable a secret?", + "type": "boolean", + "description": "Secret variables will be masked in the UI", + "default": false + }, + "isOptional": { + "$id": "#/definitions/form-variable/is-optional", + "title": "Is this variable optional?", + "type": "boolean", + "description": "Variables marked as optional won't be required on the UI", + "default": false + }, + "defaultValue": { + "$id": "#/definitions/form-variable/default-value", + "title": "Default value", + "type": ["boolean", "string"], + "description": "Default value for variable. Can be overridden by user in the UI" + }, + "allowedValues": { + "$id": "#/definitions/form-variable/allowed-values", + "title": "Allowed values", + "type": "array", + "description": "allowed string values for enum-type formVariables", + "items": { + "type": "string" + } + }, + "dynamicOptions": { + "$id": "#/definitions/form-variable/dynamic-options", + "title": "Dynamic options", + "type": "object", + "description": "Parser and endpoint for handling dynamicEnum", + "propertyNames": { + "enum": ["endpoint", "parser"] + }, + "required": ["endpoint", "parser"], + "properties": { + "endpoint": { + "$ref": "#/endpoint" + }, + "parser": { + "$id": "#/definitions/form-variable/dynamic-options/parser", + "title": "Dynamic options parser", + "description": "Mapping of property names to location in JSON response", + "type": "object", + "required": ["optionsPath", "optionsItems"], + "propertyNames": { + "enum": ["optionsPath", "optionsItems"] + }, + "properties": { + "optionsPath": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-path", + "title": "Options array path", + "description": "JSON path to the array containing options for parsing", + "type": "string" + }, + "optionsItems": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items", + "title": "Options array", + "propertyNames": { + "enum": ["label", "value"] + }, + "required": ["label", "value"], + "properties": { + "label": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/label", + "title": "Label", + "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", + "type": "string" + }, + "value": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/value", + "title": "Value", + "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", + "type": "string" + } + } + } + } + } + } + } + }, + "required": ["key", "name", "type", "description"] } } From 809fb9280372d776f5489bd7c78a20b2a822e793 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 14 Dec 2020 16:25:15 +0000 Subject: [PATCH 374/936] [ch95986] Add approval capability schema (#218) * Move formVariable items to definitions.json * Add approval capability * Remove periods in description --- manifest.schema.json | 870 +++++++++++++++++++++++- schemas/base.json | 6 +- schemas/capabilities/approval.json | 74 ++ schemas/capabilities/parser/parser.json | 41 ++ 4 files changed, 989 insertions(+), 2 deletions(-) create mode 100644 schemas/capabilities/approval.json diff --git a/manifest.schema.json b/manifest.schema.json index 4f2b0c7e..e765e06a 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -515,7 +515,8 @@ "auditLogEventsHook", "reservedCustomProperties", "externalCondition", - "trigger" + "trigger", + "approval" ] }, "properties": { @@ -1312,6 +1313,873 @@ } } } + }, + "approval": { + "$id": "#/capabilities/approval", + "title": "Approval", + "description": "This capability enables integration-driven flag change approvals", + "type": "object", + "propertyNames": { + "enum": [ + "environmentFormVariables", + "memberFormVariables", + "creationRequest", + "statusRequest" + ] + }, + "required": [ + "creationRequest", + "statusRequest" + ], + "properties": { + "environmentFormVariables": { + "$id": "#/capabilities/approval/environment-form-variables", + "title": "Environment form variables", + "description": "Environment-specific form variables that render on the environment approval settings modal", + "type": "array", + "items": { + "$id": "#/definitions/form-variable", + "title": "Form variable", + "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "description", + "placeholder", + "isSecret", + "isOptional", + "defaultValue", + "allowedValues", + "dynamicOptions" + ] + }, + "properties": { + "key": { + "$id": "#/definitions/form-variable/key", + "title": "Key", + "type": "string", + "description": "A key will be used as the token name when the variable is substituted", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "name": { + "$id": "#/definitions/form-variable/name", + "title": "Name", + "type": "string", + "description": "A descriptive name that will be used as the form label on the UI", + "maxLength": 50 + }, + "type": { + "$id": "#/definitions/form-variable/type", + "title": "Type", + "type": "string", + "description": "The type of the variable", + "enum": [ + "string", + "boolean", + "uri", + "enum", + "oauth", + "dynamicEnum" + ] + }, + "description": { + "$id": "#/definitions/form-variable/description", + "title": "Description", + "type": "string", + "description": "Describes the variable in the UI. Markdown links allowed.", + "maxLength": 250 + }, + "placeholder": { + "$id": "#/definitions/form-variable/placeholder", + "title": "Description", + "type": "string", + "description": "Placeholder value to use in the form element if applicable" + }, + "isSecret": { + "$id": "#/definitions/form-variable/is-secret", + "title": "Is this variable a secret?", + "type": "boolean", + "description": "Secret variables will be masked in the UI", + "default": false + }, + "isOptional": { + "$id": "#/definitions/form-variable/is-optional", + "title": "Is this variable optional?", + "type": "boolean", + "description": "Variables marked as optional won't be required on the UI", + "default": false + }, + "defaultValue": { + "$id": "#/definitions/form-variable/default-value", + "title": "Default value", + "type": [ + "boolean", + "string" + ], + "description": "Default value for variable. Can be overridden by user in the UI" + }, + "allowedValues": { + "$id": "#/definitions/form-variable/allowed-values", + "title": "Allowed values", + "type": "array", + "description": "allowed string values for enum-type formVariables", + "items": { + "type": "string" + } + }, + "dynamicOptions": { + "$id": "#/definitions/form-variable/dynamic-options", + "title": "Dynamic options", + "type": "object", + "description": "Parser and endpoint for handling dynamicEnum", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/definitions/form-variable/dynamic-options/parser", + "title": "Dynamic options parser", + "description": "Mapping of property names to location in JSON response", + "type": "object", + "required": [ + "optionsPath", + "optionsItems" + ], + "propertyNames": { + "enum": [ + "optionsPath", + "optionsItems" + ] + }, + "properties": { + "optionsPath": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-path", + "title": "Options array path", + "description": "JSON path to the array containing options for parsing", + "type": "string" + }, + "optionsItems": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items", + "title": "Options array", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/label", + "title": "Label", + "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", + "type": "string" + }, + "value": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/value", + "title": "Value", + "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", + "type": "string" + } + } + } + } + } + } + } + }, + "required": [ + "key", + "name", + "type", + "description" + ] + }, + "default": [] + }, + "memberFormVariables": { + "$id": "#/capabilities/approval/member-form-variables", + "title": "Member form variables", + "description": "Member-specific form variables that are used to connect integration users to LaunchDarkly members", + "type": "array", + "items": { + "$id": "#/definitions/form-variable", + "title": "Form variable", + "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "description", + "placeholder", + "isSecret", + "isOptional", + "defaultValue", + "allowedValues", + "dynamicOptions" + ] + }, + "properties": { + "key": { + "$id": "#/definitions/form-variable/key", + "title": "Key", + "type": "string", + "description": "A key will be used as the token name when the variable is substituted", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "name": { + "$id": "#/definitions/form-variable/name", + "title": "Name", + "type": "string", + "description": "A descriptive name that will be used as the form label on the UI", + "maxLength": 50 + }, + "type": { + "$id": "#/definitions/form-variable/type", + "title": "Type", + "type": "string", + "description": "The type of the variable", + "enum": [ + "string", + "boolean", + "uri", + "enum", + "oauth", + "dynamicEnum" + ] + }, + "description": { + "$id": "#/definitions/form-variable/description", + "title": "Description", + "type": "string", + "description": "Describes the variable in the UI. Markdown links allowed.", + "maxLength": 250 + }, + "placeholder": { + "$id": "#/definitions/form-variable/placeholder", + "title": "Description", + "type": "string", + "description": "Placeholder value to use in the form element if applicable" + }, + "isSecret": { + "$id": "#/definitions/form-variable/is-secret", + "title": "Is this variable a secret?", + "type": "boolean", + "description": "Secret variables will be masked in the UI", + "default": false + }, + "isOptional": { + "$id": "#/definitions/form-variable/is-optional", + "title": "Is this variable optional?", + "type": "boolean", + "description": "Variables marked as optional won't be required on the UI", + "default": false + }, + "defaultValue": { + "$id": "#/definitions/form-variable/default-value", + "title": "Default value", + "type": [ + "boolean", + "string" + ], + "description": "Default value for variable. Can be overridden by user in the UI" + }, + "allowedValues": { + "$id": "#/definitions/form-variable/allowed-values", + "title": "Allowed values", + "type": "array", + "description": "allowed string values for enum-type formVariables", + "items": { + "type": "string" + } + }, + "dynamicOptions": { + "$id": "#/definitions/form-variable/dynamic-options", + "title": "Dynamic options", + "type": "object", + "description": "Parser and endpoint for handling dynamicEnum", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/definitions/form-variable/dynamic-options/parser", + "title": "Dynamic options parser", + "description": "Mapping of property names to location in JSON response", + "type": "object", + "required": [ + "optionsPath", + "optionsItems" + ], + "propertyNames": { + "enum": [ + "optionsPath", + "optionsItems" + ] + }, + "properties": { + "optionsPath": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-path", + "title": "Options array path", + "description": "JSON path to the array containing options for parsing", + "type": "string" + }, + "optionsItems": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items", + "title": "Options array", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/label", + "title": "Label", + "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", + "type": "string" + }, + "value": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/value", + "title": "Value", + "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", + "type": "string" + } + } + } + } + } + } + } + }, + "required": [ + "key", + "name", + "type", + "description" + ] + }, + "default": [] + }, + "creationRequest": { + "$id": "#/capabilities/approval/creation-request", + "title": "Creation request", + "description": "Describes the approval creation HTTP request and the parser used to process the JSON response", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/approval-parser", + "title": "Approval parser", + "description": "Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": [ + "statusValue", + "statusDisplay", + "approvalMatcher", + "rejectionMatcher" + ] + }, + "required": [ + "statusValue", + "approvalMatcher" + ], + "properties": { + "statusValue": { + "$id": "#/approval-parser/status-value", + "title": "Status Value pointer", + "description": "JSON pointer to a status value", + "type": "string" + }, + "statusDisplay": { + "$id": "#/approval-parser/status-display", + "title": "Status Value display pointer", + "description": "JSON pointer to a human-readable status", + "type": "string" + }, + "approvalMatcher": { + "$id": "#/approval-parser/approval-matcher", + "title": "Approval matcher", + "description": "regex pattern used to determine if the approval should be considered 'approved'", + "type": "string" + }, + "rejectionMatcher": { + "$id": "#/approval-parser/rejection-matcher", + "title": "Rejection matcher", + "description": "regex pattern used to determine if the approval should be considered 'rejected'", + "type": "string" + } + } + } + } + }, + "statusRequest": { + "$id": "#/capabilities/approval/status-request", + "title": "Status Request", + "description": "Describes the approval status check HTTP request and the parser used to determine if the approval should be consider approved or rejected", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/approval-parser", + "title": "Approval parser", + "description": "Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": [ + "statusValue", + "statusDisplay", + "approvalMatcher", + "rejectionMatcher" + ] + }, + "required": [ + "statusValue", + "approvalMatcher" + ], + "properties": { + "statusValue": { + "$id": "#/approval-parser/status-value", + "title": "Status Value pointer", + "description": "JSON pointer to a status value", + "type": "string" + }, + "statusDisplay": { + "$id": "#/approval-parser/status-display", + "title": "Status Value display pointer", + "description": "JSON pointer to a human-readable status", + "type": "string" + }, + "approvalMatcher": { + "$id": "#/approval-parser/approval-matcher", + "title": "Approval matcher", + "description": "regex pattern used to determine if the approval should be considered 'approved'", + "type": "string" + }, + "rejectionMatcher": { + "$id": "#/approval-parser/rejection-matcher", + "title": "Rejection matcher", + "description": "regex pattern used to determine if the approval should be considered 'rejected'", + "type": "string" + } + } + } + } + } + } } } } diff --git a/schemas/base.json b/schemas/base.json index 21a3f24d..1552e2b2 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -232,7 +232,8 @@ "auditLogEventsHook", "reservedCustomProperties", "externalCondition", - "trigger" + "trigger", + "approval" ] }, "properties": { @@ -247,6 +248,9 @@ }, "trigger": { "$ref": "schemas/capabilities/trigger.json#/trigger" + }, + "approval": { + "$ref": "schemas/capabilities/approval.json#/approval" } } } diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json new file mode 100644 index 00000000..858860b0 --- /dev/null +++ b/schemas/capabilities/approval.json @@ -0,0 +1,74 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "approval": { + "$id": "#/capabilities/approval", + "title": "Approval", + "description": "This capability enables integration-driven flag change approvals", + "type": "object", + "propertyNames": { + "enum": [ + "environmentFormVariables", + "memberFormVariables", + "creationRequest", + "statusRequest" + ] + }, + "required": ["creationRequest", "statusRequest"], + "properties": { + "environmentFormVariables": { + "$id": "#/capabilities/approval/environment-form-variables", + "title": "Environment form variables", + "description": "Environment-specific form variables that render on the environment approval settings modal", + "type": "array", + "items": { + "$ref": "../definitions.json#/formVariable" + }, + "default": [] + }, + "memberFormVariables": { + "$id": "#/capabilities/approval/member-form-variables", + "title": "Member form variables", + "description": "Member-specific form variables that are used to connect integration users to LaunchDarkly members", + "type": "array", + "items": { + "$ref": "../definitions.json#/formVariable" + }, + "default": [] + }, + "creationRequest": { + "$id": "#/capabilities/approval/creation-request", + "title": "Creation request", + "description": "Describes the approval creation HTTP request and the parser used to process the JSON response", + "propertyNames": { + "enum": ["endpoint", "parser"] + }, + "required": ["endpoint"], + "properties": { + "endpoint": { + "$ref": "../definitions.json#/endpoint" + }, + "parser": { + "$ref": "parser/parser.json#/approvalParser" + } + } + }, + "statusRequest": { + "$id": "#/capabilities/approval/status-request", + "title": "Status Request", + "description": "Describes the approval status check HTTP request and the parser used to determine if the approval should be consider approved or rejected", + "propertyNames": { + "enum": ["endpoint", "parser"] + }, + "required": ["endpoint", "parser"], + "properties": { + "endpoint": { + "$ref": "../definitions.json#/endpoint" + }, + "parser": { + "$ref": "parser/parser.json#/approvalParser" + } + } + } + } + } +} diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index a9c47127..d8ba140a 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -94,5 +94,46 @@ "type": "string" } } + }, + "approvalParser": { + "$id": "#/approval-parser", + "title": "Approval parser", + "description": "Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": [ + "statusValue", + "statusDisplay", + "approvalMatcher", + "rejectionMatcher" + ] + }, + "required": ["statusValue", "approvalMatcher"], + "properties": { + "statusValue": { + "$id": "#/approval-parser/status-value", + "title": "Status Value pointer", + "description": "JSON pointer to a status value", + "type": "string" + }, + "statusDisplay": { + "$id": "#/approval-parser/status-display", + "title": "Status Value display pointer", + "description": "JSON pointer to a human-readable status", + "type": "string" + }, + "approvalMatcher": { + "$id": "#/approval-parser/approval-matcher", + "title": "Approval matcher", + "description": "regex pattern used to determine if the approval should be considered 'approved'", + "type": "string" + }, + "rejectionMatcher": { + "$id": "#/approval-parser/rejection-matcher", + "title": "Rejection matcher", + "description": "regex pattern used to determine if the approval should be considered 'rejected'", + "type": "string" + } + } } } From 311b43cda3109171dbd626bbca245c533821e174 Mon Sep 17 00:00:00 2001 From: Kevin Brackbill Date: Wed, 16 Dec 2020 12:06:46 -0800 Subject: [PATCH 375/936] generate typescript type definitions from schema JSON --- manifest.schema.d.ts | 630 +++++ package-lock.json | 5239 +++++++++++++++++++++++++++++++++++++++++- package.json | 9 +- 3 files changed, 5807 insertions(+), 71 deletions(-) create mode 100644 manifest.schema.d.ts diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts new file mode 100644 index 00000000..87ed38a5 --- /dev/null +++ b/manifest.schema.d.ts @@ -0,0 +1,630 @@ +/* tslint:disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +/** + * Your integration's name. + */ +export type IntegrationName = string; +/** + * A semantic version of the integration. See https://semver.org for more info. + */ +export type Version = string; +/** + * A short-one liner describing your integration + */ +export type ShortDescription = string; +/** + * A longer description of your integration + */ +export type LongDescription = string; +/** + * Details about your integration and next steps if the installation happens outside of LaunchDarkly + */ +export type LearnMoreDetails = string; +/** + * Name of the author or organization responsible for the integration + */ +export type Author = string; +/** + * Email address for your integration's support + */ +export type SupportEmail = string; +/** + * URL to your website + */ +export type Website = string; +/** + * URL to the LaunchDarkly documentation for this integration + */ +export type LaunchDarklyDocumentation = string; +/** + * URL to your organization's privacy policy + */ +export type PrivacyPolicy = string; +/** + * URL to your integration's support website + */ +export type SupportWebsite = string; +/** + * Categories that describe your integration + */ +export type Categories = + | [ + | "analytics" + | "authentication" + | "automation" + | "code-references" + | "data" + | "developer-tools" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "monitoring" + | "notifications" + ] + | [ + ( + | "analytics" + | "authentication" + | "automation" + | "code-references" + | "data" + | "developer-tools" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "monitoring" + | "notifications" + ), + ( + | "analytics" + | "authentication" + | "automation" + | "code-references" + | "data" + | "developer-tools" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "monitoring" + | "notifications" + ) + ] + | [ + ( + | "analytics" + | "authentication" + | "automation" + | "code-references" + | "data" + | "developer-tools" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "monitoring" + | "notifications" + ), + ( + | "analytics" + | "authentication" + | "automation" + | "code-references" + | "data" + | "developer-tools" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "monitoring" + | "notifications" + ), + ( + | "analytics" + | "authentication" + | "automation" + | "code-references" + | "data" + | "developer-tools" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "monitoring" + | "notifications" + ) + ]; +/** + * A square version of your integration's logo in SVG format + */ +export type SquareLogo = string; +/** + * A horizontal version of your integration's logo in SVG format + */ +export type HorizontalLogo = string; +/** + * Kind of legacy integration + */ +export type Kind = "codeRefs" | "datadog" | "dataExport" | "slackWebhooks" | "webhooks"; +/** + * Whether the integration authenticates using OAuth + */ +export type RequiresOAuth = boolean; +/** + * A key will be used as the token name when the variable is substituted + */ +export type Key = string; +/** + * A descriptive name that will be used as the form label on the UI + */ +export type Name = string; +/** + * The type of the variable + */ +export type Type = "string" | "boolean" | "uri" | "enum" | "oauth" | "dynamicEnum"; +/** + * Describes the variable in the UI. Markdown links allowed. + */ +export type Description = string; +/** + * Placeholder value to use in the form element if applicable + */ +export type Description1 = string; +/** + * Secret variables will be masked in the UI + */ +export type IsThisVariableASecret = boolean; +/** + * Variables marked as optional won't be required on the UI + */ +export type IsThisVariableOptional = boolean; +/** + * Default value for variable. Can be overridden by user in the UI + */ +export type DefaultValue = boolean | string; +/** + * allowed string values for enum-type formVariables + */ +export type AllowedValues = string[]; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod = "POST" | "PUT" | "PATCH" | "GET"; +/** + * Name of the header + */ +export type Name1 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders = HeaderItems[]; +/** + * JSON path to the array containing options for parsing + */ +export type OptionsArrayPath = string; +/** + * Relative JSON path to values for each item in the options array to be used as UI dropdown labels + */ +export type Label = string; +/** + * Relative JSON path to values for each item in the options array to be used as dropdown values + */ +export type Value1 = string; +/** + * Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`. + */ +export type FormVariables = FormVariable[]; +/** + * Template to use for flag events + */ +export type FlagTemplate = string; +/** + * Template to use for project events + */ +export type ProjectTemplate = string; +/** + * Template to use for environment events + */ +export type EnvironmentTemplate = string; +/** + * Template to use if the event does not have a corresponding named template + */ +export type DefaultTemplate = string; +/** + * Template to use when sending test events with the 'validate connection' button + */ +export type ValidationTemplate = string; +/** + * LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. + */ +export type DefaultPolicy = [Policy, ...Policy[]]; +/** + * A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. + */ +export type Actions = string[]; +/** + * This attribute defines whether the statement allows or denies access to the named resources and actions. + */ +export type Effect = "allow" | "deny"; +/** + * A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. + */ +export type NotActions = string[]; +/** + * A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. + */ +export type NotResources = string[]; +/** + * A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. + */ +export type Resources = string[]; +/** + * The reserved custom property's display name. + */ +export type Name2 = string; +/** + * The custom property's API response key. + */ +export type Key1 = string; +/** + * This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/advanced/custom-properties for more information on custom properties + */ +export type ReservedCustomProperties = { + name: Name2; + key: Key1; + [k: string]: unknown; +}[]; +/** + * Relative path to template used to render external condition creation request body + */ +export type CreationTemplate = string; +/** + * JSON Pointer to external condition ID + */ +export type IDPointer = string; +/** + * JSON pointer to external condition url + */ +export type URLPointer = string; +/** + * JSON pointer to condition status + */ +export type StatusPointer = string; +/** + * regex pattern used to determine if the response should be considered 'complete' + */ +export type CompletionMatcher = string; +/** + * relative path to sample JSON formatted sample successful response + */ +export type SampleResponse = string; +/** + * URL to documentation describing how to configure the integration. + */ +export type DocumentationLink = string; +/** + * Authentication type - currently the only option is sharedSecret. + */ +export type Authentication = "sharedSecret"; +/** + * The default event name string used in the audit log if an eventName cannot be parsed in the trigger request body. + */ +export type DefaultEventName = string; +/** + * The expected eventName of the integration partner's test events + */ +export type TestEventNameRegex = string; +/** + * JSON pointer to an event name + */ +export type EventNamePointer = string; +/** + * JSON pointer to a metric value + */ +export type ValuePointer = string; +/** + * JSON pointer to the external alert URL + */ +export type URLPointer1 = string; +/** + * Environment-specific form variables that render on the environment approval settings modal + */ +export type EnvironmentFormVariables = FormVariable[]; +/** + * Member-specific form variables that are used to connect integration users to LaunchDarkly members + */ +export type MemberFormVariables = FormVariable[]; +/** + * JSON pointer to a status value + */ +export type StatusValuePointer = string; +/** + * JSON pointer to a human-readable status + */ +export type StatusValueDisplayPointer = string; +/** + * regex pattern used to determine if the approval should be considered 'approved' + */ +export type ApprovalMatcher = string; +/** + * regex pattern used to determine if the approval should be considered 'rejected' + */ +export type RejectionMatcher = string; + +/** + * Describes the capabilities and intent of a LaunchDarkly integration + */ +export interface LaunchDarklyIntegrationsManifest { + name: IntegrationName; + version: Version; + overview: ShortDescription; + description: LongDescription; + details?: LearnMoreDetails; + author: Author; + supportEmail: SupportEmail; + links: Links; + categories: Categories; + icons: Icons; + legacy?: Legacy; + requiresOAuth?: RequiresOAuth; + formVariables?: FormVariables; + capabilities?: Capabilities; + [k: string]: unknown; +} +/** + * A set of reference links supporting your integration + */ +export interface Links { + site: Website; + launchdarklyDocs?: LaunchDarklyDocumentation; + privacyPolicy: PrivacyPolicy; + supportWebsite?: SupportWebsite; + [k: string]: unknown; +} +/** + * Logos describing your integration in SVG format + */ +export interface Icons { + square: SquareLogo; + horizontal: HorizontalLogo; + [k: string]: unknown; +} +/** + * Legacy integration + */ +export interface Legacy { + kind: Kind; + [k: string]: unknown; +} +/** + * A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration. + */ +export interface FormVariable { + key: Key; + name: Name; + type: Type; + description: Description; + placeholder?: Description1; + isSecret?: IsThisVariableASecret; + isOptional?: IsThisVariableOptional; + defaultValue?: DefaultValue; + allowedValues?: AllowedValues; + dynamicOptions?: DynamicOptions; + [k: string]: unknown; +} +/** + * Parser and endpoint for handling dynamicEnum + */ +export interface DynamicOptions { + endpoint: Endpoint; + parser: DynamicOptionsParser; + [k: string]: unknown; +} +/** + * Properties that describe an HTTP request to an external endpoint + */ +export interface Endpoint { + url: URL; + method: HTTPMethod; + headers?: HTTPHeaders; + [k: string]: unknown; +} +/** + * A name and value pair to send as headers with the hook request + */ +export interface HeaderItems { + name: Name1; + value: Value; + [k: string]: unknown; +} +/** + * Mapping of property names to location in JSON response + */ +export interface DynamicOptionsParser { + optionsPath: OptionsArrayPath; + optionsItems: OptionsArray; + [k: string]: unknown; +} +export interface OptionsArray { + label: Label; + value: Value1; + [k: string]: unknown; +} +/** + * Specify which capabilities you'd like your integration to have + */ +export interface Capabilities { + auditLogEventsHook?: AuditLogEventsHook; + reservedCustomProperties?: ReservedCustomProperties; + externalCondition?: ExternalCondition; + trigger?: Trigger; + approval?: Approval; + [k: string]: unknown; +} +/** + * This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint. + */ +export interface AuditLogEventsHook { + endpoint: Endpoint; + templates: WebhookBodyTemplate; + defaultPolicy?: DefaultPolicy; + [k: string]: unknown; +} +/** + * Templates to use for body of the webhook request + */ +export interface WebhookBodyTemplate { + flag?: FlagTemplate; + project?: ProjectTemplate; + environment?: EnvironmentTemplate; + default?: DefaultTemplate; + validation?: ValidationTemplate; + [k: string]: unknown; +} +/** + * A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. + */ +export interface Policy { + actions?: Actions; + effect?: Effect; + notActions?: NotActions; + notResources?: NotResources; + resources?: Resources; + [k: string]: unknown; +} +/** + * This capability is used to manage external feature workflow conditions + */ +export interface ExternalCondition { + creation: Creation; + pollingUpdate?: PollingUpdate; + [k: string]: unknown; +} +/** + * Properties that describe a request to an integration-controlled API endpoint to establish the external condition + */ +export interface Creation { + endpoint: CreationEndpoint; + template: CreationTemplate; + parser: ResponseParser; + [k: string]: unknown; +} +/** + * Properties that describe the HTTP endpoint LaunchDarkly will use to create an external condition + */ +export interface CreationEndpoint { + url: URL; + method: HTTPMethod; + headers?: HTTPHeaders; + [k: string]: unknown; +} +/** + * Describes a mapping of property name to a location in the JSON response specified by a JSON pointer + */ +export interface ResponseParser { + id: IDPointer; + url: URLPointer; + status?: StatusParser; + validation?: Validation; + [k: string]: unknown; +} +export interface StatusParser { + pointer: StatusPointer; + completionMatcher: CompletionMatcher; + [k: string]: unknown; +} +/** + * Validation helpers (only used for testing) + */ +export interface Validation { + sampleResponse: SampleResponse; + [k: string]: unknown; +} +/** + * Properties that describe a polling request to get the status of the external condition + */ +export interface PollingUpdate { + endpoint: PollingUpdateEndpoint; + parser: ResponseParser; + [k: string]: unknown; +} +/** + * Properties that describe the HTTP endpoint LaunchDarkly will use to get the status of an external condition via polling + */ +export interface PollingUpdateEndpoint { + url: URL; + method: HTTPMethod; + headers?: HTTPHeaders; + [k: string]: unknown; +} +/** + * This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly + */ +export interface Trigger { + documentation: DocumentationLink; + auth?: Authentication; + defaultEventName?: DefaultEventName; + testEventNameRegexp?: TestEventNameRegex; + parser?: TriggerParser; + [k: string]: unknown; +} +/** + * Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer + */ +export interface TriggerParser { + eventName?: EventNamePointer; + value?: ValuePointer; + url?: URLPointer1; + [k: string]: unknown; +} +/** + * This capability enables integration-driven flag change approvals + */ +export interface Approval { + environmentFormVariables?: EnvironmentFormVariables; + memberFormVariables?: MemberFormVariables; + creationRequest: CreationRequest; + statusRequest: StatusRequest; + [k: string]: unknown; +} +/** + * Describes the approval creation HTTP request and the parser used to process the JSON response + */ +export interface CreationRequest { + endpoint: Endpoint; + parser?: ApprovalParser; + [k: string]: unknown; +} +/** + * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer + */ +export interface ApprovalParser { + statusValue: StatusValuePointer; + statusDisplay?: StatusValueDisplayPointer; + approvalMatcher: ApprovalMatcher; + rejectionMatcher?: RejectionMatcher; + [k: string]: unknown; +} +/** + * Describes the approval status check HTTP request and the parser used to determine if the approval should be consider approved or rejected + */ +export interface StatusRequest { + endpoint: Endpoint; + parser: ApprovalParser; + [k: string]: unknown; +} diff --git a/package-lock.json b/package-lock.json index eb4b420e..da4c4b35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,4883 @@ { "name": "integration-framework", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "integration-framework", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "json-schema-to-typescript": "^10.0.0" + }, + "devDependencies": { + "@apidevtools/json-schema-ref-parser": "^8.0.0", + "ajv": "^6.10.2", + "handlebars": "^4.7.6", + "jest": "25.1.0", + "jest-expect-message": "1.0.2", + "jest-junit": "^12.0.0", + "jsonpointer": "^4.0.1", + "lodash": "^4.17.19", + "prettier": "^2.0.1" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", + "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.0", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.8.3" + } + }, + "node_modules/@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "node_modules/@babel/generator": { + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", + "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "node_modules/@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.8.3" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "node_modules/@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "node_modules/@babel/highlight/node_modules/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz", + "integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A==", + "dev": true + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "node_modules/@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "node_modules/@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@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 + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "node_modules/@jest/console": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", + "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", + "dev": true, + "dependencies": { + "@jest/source-map": "^25.1.0", + "chalk": "^3.0.0", + "jest-util": "^25.1.0", + "slash": "^3.0.0" + } + }, + "node_modules/@jest/core": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", + "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", + "dev": true, + "dependencies": { + "@jest/console": "^25.1.0", + "@jest/reporters": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-changed-files": "^25.1.0", + "jest-config": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-resolve-dependencies": "^25.1.0", + "jest-runner": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "jest-watcher": "^25.1.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "realpath-native": "^1.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", + "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", + "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0", + "lolex": "^5.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", + "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "jest-haste-map": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "node-notifier": "^6.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.0.1" + }, + "optionalDependencies": { + "node-notifier": "^6.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", + "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.3", + "source-map": "^0.6.0" + } + }, + "node_modules/@jest/test-result": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", + "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", + "dev": true, + "dependencies": { + "@jest/console": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", + "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-runner": "^25.1.0", + "jest-runtime": "^25.1.0" + } + }, + "node_modules/@jest/transform": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", + "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^25.1.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.3", + "jest-haste-map": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-util": "^25.1.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "node_modules/@jest/types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", + "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, + "node_modules/@sinonjs/commons": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", + "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", + "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "node_modules/@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, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@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==" + }, + "node_modules/@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "node_modules/@types/node": { + "version": "14.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" + }, + "node_modules/@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@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 + }, + "node_modules/abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + }, + "node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "node_modules/ajv": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", + "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/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, + "dependencies": { + "type-fest": "^0.11.0" + } + }, + "node_modules/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 + }, + "node_modules/ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "dependencies": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/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 + }, + "node_modules/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==", + "dev": true + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "node_modules/array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "node_modules/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=", + "dev": true + }, + "node_modules/aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", + "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", + "dev": true, + "dependencies": { + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.1.0", + "chalk": "^3.0.0", + "slash": "^3.0.0" + } + }, + "node_modules/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, + "dependencies": { + "@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" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", + "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", + "dev": true, + "dependencies": { + "@types/babel__traverse": "^7.0.6" + } + }, + "node_modules/babel-preset-jest": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", + "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-bigint": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^25.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/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 + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "rsvp": "^4.8.4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + } + }, + "node_modules/cli-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", + "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "dependencies": { + "ansi-regex": "^2.1.1", + "d": "^1.0.1", + "es5-ext": "^0.10.51", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.14", + "timers-ext": "^0.1.7" + } + }, + "node_modules/cli-color/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", + "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==", + "dev": true + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "node_modules/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, + "dependencies": { + "color-name": "~1.1.4" + } + }, + "node_modules/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 + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + } + }, + "node_modules/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, + "optional": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/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, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", + "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "node_modules/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=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "object-keys": "^1.0.12" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/diff-sequences": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", + "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", + "dev": true + }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/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 + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "node_modules/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, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/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 + }, + "node_modules/escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/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 + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/expect": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", + "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-regex-util": "^25.1.0" + } + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/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, + "dependencies": { + "to-regex-range": "^5.0.1" + } + }, + "node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "pump": "^3.0.0" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "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" + } + }, + "node_modules/glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "dependencies": { + "@types/glob": "*" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "glob": "*" + } + }, + "node_modules/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 + }, + "node_modules/graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "node_modules/har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "dependencies": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/html-escaper": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.1.tgz", + "integrity": "sha512-hNX23TjWwD3q56HpWjUHOKj1+4KKlnjv9PcmBUYKVpga+2cnb9nDx/B1o0yO4n+RZXZdiNxzx6B24C9aNMTkkQ==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "node_modules/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, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "ci-info": "^2.0.0" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + } + }, + "node_modules/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 + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "has-symbols": "^1.0.1" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true, + "optional": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "node_modules/jest": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", + "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", + "dev": true, + "dependencies": { + "@jest/core": "^25.1.0", + "import-local": "^3.0.2", + "jest-cli": "^25.1.0" + } + }, + "node_modules/jest-changed-files": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", + "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0", + "execa": "^3.2.0", + "throat": "^5.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "node_modules/jest-changed-files/node_modules/execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/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 + }, + "node_modules/jest-changed-files/node_modules/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, + "dependencies": { + "path-key": "^3.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "node_modules/jest-changed-files/node_modules/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 + }, + "node_modules/jest-changed-files/node_modules/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, + "dependencies": { + "shebang-regex": "^3.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/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 + }, + "node_modules/jest-changed-files/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + } + }, + "node_modules/jest-config": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", + "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^25.1.0", + "@jest/types": "^25.1.0", + "babel-jest": "^25.1.0", + "chalk": "^3.0.0", + "glob": "^7.1.1", + "jest-environment-jsdom": "^25.1.0", + "jest-environment-node": "^25.1.0", + "jest-get-type": "^25.1.0", + "jest-jasmine2": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "micromatch": "^4.0.2", + "pretty-format": "^25.1.0", + "realpath-native": "^1.1.0" + } + }, + "node_modules/jest-diff": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", + "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "diff-sequences": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "node_modules/jest-docblock": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", + "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + } + }, + "node_modules/jest-each": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", + "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.1.0", + "jest-util": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", + "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^25.1.0", + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0", + "jsdom": "^15.1.1" + } + }, + "node_modules/jest-environment-node": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", + "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", + "dev": true, + "dependencies": { + "@jest/environment": "^25.1.0", + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0" + } + }, + "node_modules/jest-expect-message": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jest-expect-message/-/jest-expect-message-1.0.2.tgz", + "integrity": "sha512-WFiXMgwS2lOqQZt1iJMI/hOXpUm32X+ApsuzYcQpW5m16Pv6/Gd9kgC+Q+Q1YVNU04kYcAOv9NXMnjg6kKUy6Q==", + "dev": true + }, + "node_modules/jest-get-type": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", + "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", + "dev": true + }, + "node_modules/jest-haste-map": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", + "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.3", + "jest-serializer": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", + "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^25.1.0", + "@jest/source-map": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "co": "^4.6.0", + "expect": "^25.1.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "pretty-format": "^25.1.0", + "throat": "^5.0.0" + } + }, + "node_modules/jest-junit": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.0.0.tgz", + "integrity": "sha512-+8K35LlboWiPuCnXSyiid7rFdxNlpCWWM20WEYe6IZH6psfUWKZmSpSRQ5tk0C0cBeDsvsnIzcef5mYhyJsbug==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^3.3.3", + "xml": "^1.0.1" + } + }, + "node_modules/jest-junit/node_modules/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 + }, + "node_modules/jest-junit/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "node_modules/jest-junit/node_modules/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, + "dependencies": { + "ansi-regex": "^4.1.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", + "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", + "dev": true, + "dependencies": { + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", + "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "jest-diff": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" + } + }, + "node_modules/jest-message-util": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", + "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + } + }, + "node_modules/jest-mock": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", + "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "node_modules/jest-regex-util": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", + "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==", + "dev": true + }, + "node_modules/jest-resolve": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", + "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", + "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-snapshot": "^25.1.0" + } + }, + "node_modules/jest-runner": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", + "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", + "dev": true, + "dependencies": { + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.3", + "jest-config": "^25.1.0", + "jest-docblock": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-jasmine2": "^25.1.0", + "jest-leak-detector": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", + "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", + "dev": true, + "dependencies": { + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/source-map": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.3", + "jest-config": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "realpath-native": "^1.1.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", + "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==", + "dev": true + }, + "node_modules/jest-snapshot": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", + "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "expect": "^25.1.0", + "jest-diff": "^25.1.0", + "jest-get-type": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^25.1.0", + "semver": "^7.1.1" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "node_modules/jest-util": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", + "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1" + } + }, + "node_modules/jest-validate": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", + "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.1.0", + "leven": "^3.1.0", + "pretty-format": "^25.1.0" + } + }, + "node_modules/jest-watcher": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", + "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", + "dev": true, + "dependencies": { + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.1.0", + "string-length": "^3.1.0" + } + }, + "node_modules/jest-worker": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "dev": true, + "dependencies": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", + "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", + "dev": true, + "dependencies": { + "@jest/core": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^15.0.0" + } + }, + "node_modules/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 + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "dependencies": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-ref-parser": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", + "integrity": "sha512-z0JGv7rRD3CnJbZY/qCpscyArdtLJhr/wRBmFUdoZ8xMjsFyNdILSprG2degqRLjBjyhZHAEBpGOxniO9rKTxA==", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "9.0.6" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/json-schema-ref-parser/node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", + "integrity": "sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, + "node_modules/json-schema-to-typescript": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.0.0.tgz", + "integrity": "sha512-G5RZlHchI9r/v31QhH5k57K+2kvYRBWKIGctJPsUuIkUIf3J3xXzvQZJGa16bhVjgs1fStaLamfFIti6K6V6wQ==", + "dependencies": { + "@types/json-schema": "^7.0.6", + "cli-color": "^2.0.0", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "is-glob": "^4.0.1", + "json-schema-ref-parser": "^9.0.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.20", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.2.0", + "stdin": "0.0.1" + }, + "bin": { + "json2ts": "dist/src/cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/json-schema-to-typescript/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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=" + }, + "node_modules/json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + } + }, + "node_modules/jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/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 + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "node_modules/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, + "dependencies": { + "p-locate": "^4.1.0" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "object-visit": "^1.0.0" + } + }, + "node_modules/memoizee": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.45", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "node_modules/mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "node_modules/mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "dependencies": { + "mime-db": "1.43.0" + } + }, + "node_modules/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 + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + } + }, + "node_modules/mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + } + }, + "node_modules/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 + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "node_modules/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 + }, + "node_modules/neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/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/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_modules/node-notifier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", + "dev": true, + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", + "shellwords": "^0.1.1", + "which": "^1.3.1" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "path-key": "^2.0.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + } + }, + "node_modules/object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "node_modules/p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + } + }, + "node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + } + }, + "node_modules/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 + }, + "node_modules/parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + } + }, + "node_modules/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, + "dependencies": { + "find-up": "^4.0.0" + } + }, + "node_modules/pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "node_modules/prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/pretty-format": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", + "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "node_modules/prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, + "node_modules/psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "dependencies": { + "util.promisify": "^1.0.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "node_modules/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 + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "node_modules/request-promise-native/node_modules/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==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "node_modules/request/node_modules/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==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + } + }, + "node_modules/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, + "dependencies": { + "resolve-from": "^5.0.0" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "dependencies": { + "@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" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "node_modules/saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "dependencies": { + "xmlchars": "^2.1.1" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + } + }, + "node_modules/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, + "dependencies": { + "shebang-regex": "^1.0.0" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + } + }, + "node_modules/stdin": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", + "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=" + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "node_modules/string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "dev": true, + "dependencies": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + } + }, + "node_modules/string-length/node_modules/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 + }, + "node_modules/string-length/node_modules/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, + "dependencies": { + "ansi-regex": "^4.1.0" + } + }, + "node_modules/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "node_modules/string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + } + }, + "node_modules/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 + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "node_modules/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, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "node_modules/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, + "dependencies": { + "is-number": "^7.0.0" + } + }, + "node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uglify-js": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz", + "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==", + "dev": true, + "optional": true, + "dependencies": { + "commander": "~2.20.3", + "source-map": "~0.6.1" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz", + "integrity": "sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + } + }, + "node_modules/v8-to-istanbul/node_modules/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 + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "dependencies": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/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, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "dev": true + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "node_modules/yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + }, "dependencies": { "@apidevtools/json-schema-ref-parser": { "version": "8.0.0", @@ -531,10 +5406,9 @@ } }, "@jsdevtools/ono": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.1.tgz", - "integrity": "sha512-pu5fxkbLQWzRbBgfFbZfHXz0KlYojOfVdUhcNfy9lef8ZhBt0pckGr8g7zv4vPX4Out5vBNvqd/az4UaVWzZ9A==", - "dev": true + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, "@sinonjs/commons": { "version": "1.7.1", @@ -592,6 +5466,15 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -617,6 +5500,21 @@ "@types/istanbul-lib-report": "*" } }, + "@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/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/node": { + "version": "14.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -711,6 +5609,11 @@ "color-convert": "^2.0.1" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -725,7 +5628,6 @@ "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" } @@ -862,8 +5764,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -933,7 +5834,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1006,8 +5906,7 @@ "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" }, "callsites": { "version": "3.1.0", @@ -1075,6 +5974,26 @@ } } }, + "cli-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", + "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "requires": { + "ansi-regex": "^2.1.1", + "d": "^1.0.1", + "es5-ext": "^0.10.51", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.14", + "timers-ext": "^0.1.7" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -1148,8 +6067,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "convert-source-map": { "version": "1.7.0", @@ -1208,6 +6126,15 @@ } } }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1387,6 +6314,46 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1409,8 +6376,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "estraverse": { "version": "4.3.0", @@ -1424,6 +6390,15 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "exec-sh": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", @@ -1515,6 +6490,21 @@ "jest-regex-util": "^25.1.0" } }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -1694,8 +6684,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.1.2", @@ -1750,7 +6739,6 @@ "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", "inflight": "^1.0.4", @@ -1760,6 +6748,14 @@ "path-is-absolute": "^1.0.0" } }, + "glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "requires": { + "@types/glob": "*" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1790,14 +6786,6 @@ "source-map": "^0.6.1", "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "har-schema": { @@ -1950,7 +6938,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1959,8 +6946,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ip-regex": { "version": "2.1.0", @@ -2060,6 +7046,11 @@ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, "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", @@ -2072,6 +7063,14 @@ "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", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2087,6 +7086,11 @@ "isobject": "^3.0.1" } }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", @@ -2766,7 +7770,6 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -2824,6 +7827,53 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, + "json-schema-ref-parser": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", + "integrity": "sha512-z0JGv7rRD3CnJbZY/qCpscyArdtLJhr/wRBmFUdoZ8xMjsFyNdILSprG2degqRLjBjyhZHAEBpGOxniO9rKTxA==", + "requires": { + "@apidevtools/json-schema-ref-parser": "9.0.6" + }, + "dependencies": { + "@apidevtools/json-schema-ref-parser": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", + "integrity": "sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==", + "requires": { + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + } + } + }, + "json-schema-to-typescript": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.0.0.tgz", + "integrity": "sha512-G5RZlHchI9r/v31QhH5k57K+2kvYRBWKIGctJPsUuIkUIf3J3xXzvQZJGa16bhVjgs1fStaLamfFIti6K6V6wQ==", + "requires": { + "@types/json-schema": "^7.0.6", + "cli-color": "^2.0.0", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "is-glob": "^4.0.1", + "json-schema-ref-parser": "^9.0.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.20", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.2.0", + "stdin": "0.0.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2833,8 +7883,7 @@ "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": "2.1.2", @@ -2843,14 +7892,6 @@ "dev": true, "requires": { "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "jsonpointer": { @@ -2909,10 +7950,9 @@ } }, "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash.sortby": { "version": "4.7.0", @@ -2929,6 +7969,14 @@ "@sinonjs/commons": "^1.7.0" } }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "requires": { + "es5-ext": "~0.10.2" + } + }, "make-dir": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", @@ -2970,6 +8018,21 @@ "object-visit": "^1.0.0" } }, + "memoizee": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "requires": { + "d": "1", + "es5-ext": "^0.10.45", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.5" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -3011,16 +8074,14 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.3.tgz", - "integrity": "sha512-+bMdgqjMN/Z77a6NlY/I3U5LlRDbnmaAk6lDveAPKwSpcPM4tKAuYsvYF8xjhOPXhOYGe/73vVLVez5PW+jqhw==", - "dev": true + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "mixin-deep": { "version": "1.3.2", @@ -3050,14 +8111,6 @@ "dev": true, "requires": { "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "ms": { @@ -3066,6 +8119,16 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -3097,6 +8160,11 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -3165,6 +8233,11 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -3252,7 +8325,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -3337,8 +8409,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", @@ -3401,10 +8472,9 @@ "dev": true }, "prettier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.1.tgz", - "integrity": "sha512-piXGBcY1zoFOG0MvHpNE5reAGseLmaCRifQ/fmfF49BcYkInEs/naD/unxGNAeOKFA5+JxVrPyMvMlpzcd20UA==", - "dev": true + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==" }, "pretty-format": { "version": "25.1.0", @@ -4055,8 +9125,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.16.1", @@ -4102,6 +9171,11 @@ } } }, + "stdin": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", + "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=" + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", @@ -4239,12 +9313,37 @@ "minimatch": "^3.0.4" } }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -4333,6 +9432,11 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -4597,8 +9701,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "3.0.3", diff --git a/package.json b/package.json index 29dedf89..2acc63d1 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { - "name": "integration-framework", + "name": "@launchdarkly/integration-framework", "version": "1.0.0", "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", - "main": "index.js", + "types": "manifest.schema.d.ts", "scripts": { "test": "jest", "test:ci": "jest --ci --runInBand --reporters=default --reporters=jest-junit", - "build": "node bundleSchemas.js && prettier --write ./*.schema.json", + "build": "node bundleSchemas.js && prettier --write ./*.schema.json && json2ts schemas/base.json > manifest.schema.d.ts", "prettier:check": "prettier --list-different \"./**/*.{js,json}\"", "prettier:write": "prettier --write \"./**/*.{js,json}\"", "preview": "node preview.js", @@ -37,5 +37,8 @@ "jsonpointer": "^4.0.1", "lodash": "^4.17.19", "prettier": "^2.0.1" + }, + "dependencies": { + "json-schema-to-typescript": "^10.0.0" } } From 0b4c6f6f06a82ae1d9ea0fb6a30b737bf9fe05b6 Mon Sep 17 00:00:00 2001 From: Kevin Brackbill Date: Wed, 16 Dec 2020 13:46:24 -0800 Subject: [PATCH 376/936] fix indentation --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2acc63d1..c62c29cc 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@launchdarkly/integration-framework", "version": "1.0.0", "description": "Feature flags not only provide you control over your deployment and rollout, but also provides context to other related systems -- giving your team visibility into how your services react due to changes to flags. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly in order to provide their users more context.", - "types": "manifest.schema.d.ts", + "types": "manifest.schema.d.ts", "scripts": { "test": "jest", "test:ci": "jest --ci --runInBand --reporters=default --reporters=jest-junit", From 003911fe2381614475a7b3b826e1f2a8eb9bfbea Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 30 Dec 2020 17:18:11 +0000 Subject: [PATCH 377/936] [ch97425] Add first draft of ServiceNow manifest (#220) * Add first draft of servicenow manifest * Bump jest version to remove vulnerability warning --- __tests__/validateIntegrationManifests.js | 2 +- .../servicenow/assets/images/logo_square.svg | 4 + integrations/servicenow/manifest.json | 113 + manifest.schema.json | 1 + package-lock.json | 2169 +++++++++-------- package.json | 2 +- schemas/base.json | 1 + 7 files changed, 1308 insertions(+), 984 deletions(-) create mode 100644 integrations/servicenow/assets/images/logo_square.svg create mode 100644 integrations/servicenow/manifest.json diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 63063558..0c988827 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -10,7 +10,7 @@ const flagContext = require('../sample-context/flag/update-all-environments'); const projectContext = require('../sample-context/project/update'); const environmentContext = require('../sample-context/environment/update'); -const OAUTH_INTEGRATIONS = ['appdynamics', 'sample-integration']; // add oauth integrations here +const OAUTH_INTEGRATIONS = ['appdynamics', 'servicenow']; // add oauth integrations here registerHelpers(); diff --git a/integrations/servicenow/assets/images/logo_square.svg b/integrations/servicenow/assets/images/logo_square.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/servicenow/assets/images/logo_square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json new file mode 100644 index 00000000..df815975 --- /dev/null +++ b/integrations/servicenow/manifest.json @@ -0,0 +1,113 @@ +{ + "name": "ServiceNow", + "version": "1.0.0", + "overview": "Create feature flag change requests in ServiceNow.", + "description": "Create feature flag change requests in ServiceNow.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.servicenow.com/", + "privacyPolicy": "https://www.servicenow.com/privacy-statement.html" + }, + "categories": ["approval"], + "icons": { + "square": "assets/images/logo_square.svg", + "horizontal": "assets/images/logo_square.svg" + }, + "requiresOAuth": true, + "formVariables": [], + "capabilities": { + "approval": { + "environmentFormVariables": [ + { + "key": "template", + "name": "Standard Change Template", + "description": "The standard change template to be utilized for all flag changes in this environment.", + "type": "dynamicEnum", + "dynamicOptions": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/template", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "optionsPath": "/result", + "optionsItems": { + "label": "/sys_name/display_value", + "value": "/sys_id/value" + } + } + } + } + ], + "memberFormVariables": [ + { + "key": "username", + "name": "ServiceNow username", + "description": "The ServiceNow username used to attribute change requests", + "type": "dynamicEnum", + "dynamicOptions": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=name,email,user_name,sys_id", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "optionsPath": "/result", + "optionsItems": { + "label": "/name", + "value": "/user_name" + } + } + } + } + ], + "creationRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}/?requested_by={{member.username}}", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "statusValue": "/result/state/value", + "statusDisplay": "/result/state/display_value", + "approvalMatcher": "0", + "rejectionMatcher": "-2" + } + }, + "statusRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{creation.id}}", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "statusValue": "/result/state/value", + "statusDisplay": "/result/state/display_value", + "approvalMatcher": "0", + "rejectionMatcher": "-2" + } + } + } + } +} diff --git a/manifest.schema.json b/manifest.schema.json index e765e06a..9dfa9453 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -152,6 +152,7 @@ "type": "string", "enum": [ "analytics", + "approval", "authentication", "automation", "code-references", diff --git a/package-lock.json b/package-lock.json index eb4b420e..cac3cba6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,34 +16,33 @@ } }, "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.4" } }, "@babel/core": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", - "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-module-transforms": "^7.9.0", - "@babel/helpers": "^7.9.0", - "@babel/parser": "^7.9.0", - "@babel/template": "^7.8.6", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", - "lodash": "^4.17.13", - "resolve": "^1.3.2", + "lodash": "^4.17.19", "semver": "^5.4.1", "source-map": "^0.5.0" }, @@ -57,14 +56,13 @@ } }, "@babel/generator": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", - "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.9.0", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", - "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { @@ -77,128 +75,129 @@ } }, "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" } }, "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.12.10" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.12.7" } }, "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "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.8.3" + "@babel/types": "^7.12.5" } }, "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "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.8.3", - "@babel/helper-replace-supers": "^7.8.6", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.6", - "@babel/types": "^7.9.0", - "lodash": "^4.17.13" + "@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.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.12.10" } }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "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.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "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/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.12.11" } }, "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, "@babel/helpers": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", - "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "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.8.3", - "@babel/traverse": "^7.9.0", - "@babel/types": "^7.9.0" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" } }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -256,11 +255,20 @@ } }, "@babel/parser": { - "version": "7.9.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz", - "integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "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", @@ -270,6 +278,60 @@ "@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", @@ -279,42 +341,69 @@ "@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/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" } }, "@babel/traverse": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", - "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.0", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.0", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.13" + "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", - "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } }, @@ -335,13 +424,14 @@ } }, "@istanbuljs/load-nyc-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", - "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "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": { "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" } @@ -353,181 +443,195 @@ "dev": true }, "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", + "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": { - "@jest/source-map": "^25.1.0", - "chalk": "^3.0.0", - "jest-util": "^25.1.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" } }, "@jest/core": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", - "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", + "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", "dev": true, "requires": { - "@jest/console": "^25.1.0", - "@jest/reporters": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.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": "^3.0.0", + "chalk": "^4.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.1.0", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-resolve-dependencies": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "jest-watcher": "^25.1.0", + "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", - "realpath-native": "^1.1.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", - "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", + "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": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0" + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" } }, "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", + "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/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "lolex": "^5.0.0" + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" } }, "@jest/reporters": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", - "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", + "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": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", + "@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.0", + "istanbul-lib-instrument": "^4.0.3", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", - "node-notifier": "^6.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": "^3.1.0", + "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^4.0.1" + "v8-to-istanbul": "^7.0.0" } }, "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", + "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.3", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" } }, "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", + "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": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@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": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", - "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", + "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": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0" + "@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": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", + "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": "^25.1.0", + "@jest/types": "^26.6.2", "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.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", - "realpath-native": "^1.1.0", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "@jest/types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", - "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", + "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": "^1.1.1", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" + "chalk": "^4.0.0" } }, "@jsdevtools/ono": { @@ -537,18 +641,27 @@ "dev": true }, "@sinonjs/commons": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", - "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "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" + } + }, "@types/babel__core": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", - "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", + "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", @@ -559,18 +672,18 @@ } }, "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "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.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -578,24 +691,27 @@ } }, "@types/babel__traverse": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", - "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", + "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "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.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "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": { @@ -608,70 +724,79 @@ } }, "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "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-coverage": "*", "@types/istanbul-lib-report": "*" } }, + "@types/node": { + "version": "14.14.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.16.tgz", + "integrity": "sha512-naXYePhweTi+BMv11TgioE2/FXU4fSl29HAH1ffxVciNsH3rYXjNP2yM8wqmSm7jS20gM8TIklKiTen+1iVncw==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/prettier": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.6.tgz", + "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", + "dev": true + }, "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "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/yargs": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", - "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", + "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", "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==", + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", "dev": true }, "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", "dev": true, "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" } }, "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "dev": true }, "ajv": { @@ -693,6 +818,14 @@ "dev": true, "requires": { "type-fest": "^0.11.0" + }, + "dependencies": { + "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 + } } }, "ansi-regex": { @@ -702,12 +835,11 @@ "dev": true }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, @@ -748,12 +880,6 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -781,12 +907,6 @@ "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", @@ -806,23 +926,24 @@ "dev": true }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "babel-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", - "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", + "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": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/babel__core": "^7.1.0", + "@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": "^25.1.0", - "chalk": "^3.0.0", + "babel-preset-jest": "^26.6.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", "slash": "^3.0.0" } }, @@ -840,23 +961,45 @@ } }, "babel-plugin-jest-hoist": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", - "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", + "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.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "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": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", - "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", + "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-syntax-bigint": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.1.0" + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" } }, "balanced-match": { @@ -954,23 +1097,6 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "requires": { - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -1037,21 +1163,33 @@ "dev": true }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "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" } }, + "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 + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "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", @@ -1093,9 +1231,9 @@ "dev": true }, "collect-v8-coverage": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", - "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==", + "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": { @@ -1192,9 +1330,9 @@ "dev": true }, "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "requires": { "cssom": "~0.3.6" @@ -1218,23 +1356,23 @@ } }, "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" } }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "decamelize": { @@ -1243,6 +1381,12 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, + "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==", + "dev": true + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -1255,14 +1399,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "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" - } + "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-property": { "version": "2.0.2", @@ -1318,18 +1459,26 @@ "dev": true }, "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", + "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 }, "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "dev": true, "requires": { - "webidl-conversions": "^4.0.2" + "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==", + "dev": true + } } }, "ecc-jsbn": { @@ -1342,6 +1491,12 @@ "safer-buffer": "^2.1.0" } }, + "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": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1357,34 +1512,13 @@ "once": "^1.4.0" } }, - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "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.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.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==", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { @@ -1394,9 +1528,9 @@ "dev": true }, "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, "requires": { "esprima": "^4.0.1", @@ -1502,17 +1636,17 @@ } }, "expect": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", - "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", + "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": "^25.1.0", + "@jest/types": "^26.6.2", "ansi-styles": "^4.0.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.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" } }, "extend": { @@ -1698,9 +1832,9 @@ "dev": true }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "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 }, @@ -1711,9 +1845,9 @@ "dev": true }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "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": { @@ -1722,6 +1856,12 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "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-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -1767,9 +1907,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "growly": { @@ -1807,13 +1947,27 @@ "dev": true }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + } + } } }, "has": { @@ -1831,12 +1985,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "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": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -1889,19 +2037,25 @@ } } }, + "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 + }, "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "dev": true, "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^1.0.5" } }, "html-escaper": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.1.tgz", - "integrity": "sha512-hNX23TjWwD3q56HpWjUHOKj1+4KKlnjv9PcmBUYKVpga+2cnb9nDx/B1o0yO4n+RZXZdiNxzx6B24C9aNMTkkQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-signature": { @@ -1988,18 +2142,18 @@ } } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -2009,6 +2163,15 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -2029,12 +2192,6 @@ } } }, - "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", @@ -2054,6 +2211,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", @@ -2087,14 +2251,11 @@ "isobject": "^3.0.1" } }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } + "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=", + "dev": true }, "is-stream": { "version": "1.1.0", @@ -2102,15 +2263,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "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-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -2124,11 +2276,14 @@ "dev": true }, "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "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 + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { "version": "1.0.0", @@ -2161,15 +2316,12 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", - "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "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": { "@babel/core": "^7.7.5", - "@babel/parser": "^7.7.5", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" @@ -2206,9 +2358,9 @@ } }, "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", + "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": { "html-escaper": "^2.0.0", @@ -2216,54 +2368,54 @@ } }, "jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", - "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", + "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": "^25.1.0", + "@jest/core": "^26.6.3", "import-local": "^3.0.2", - "jest-cli": "^25.1.0" + "jest-cli": "^26.6.3" }, "dependencies": { "jest-cli": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", - "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", + "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": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", + "@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": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", + "jest-config": "^26.6.3", + "jest-util": "^26.6.2", + "jest-validate": "^26.6.2", "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^15.0.0" + "yargs": "^15.4.1" } } } }, "jest-changed-files": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", - "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", + "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": "^25.1.0", - "execa": "^3.2.0", + "@jest/types": "^26.6.2", + "execa": "^4.0.0", "throat": "^5.0.0" }, "dependencies": { "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "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", @@ -2272,9 +2424,9 @@ } }, "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -2284,15 +2436,14 @@ "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", - "p-finally": "^2.0.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -2313,12 +2464,6 @@ "path-key": "^3.0.0" } }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2352,89 +2497,92 @@ } }, "jest-config": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", - "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", + "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": "^25.1.0", - "@jest/types": "^25.1.0", - "babel-jest": "^25.1.0", - "chalk": "^3.0.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", - "jest-environment-jsdom": "^25.1.0", - "jest-environment-node": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", + "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": "^25.1.0", - "realpath-native": "^1.1.0" + "pretty-format": "^26.6.2" } }, "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", + "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": { - "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" } }, "jest-docblock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", - "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", + "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": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", - "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", + "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": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.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" } }, "jest-environment-jsdom": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", - "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", + "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": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "jsdom": "^15.1.1" + "@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" } }, "jest-environment-node": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", - "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", + "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": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0" + "@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" } }, "jest-expect-message": { @@ -2444,52 +2592,56 @@ "dev": true }, "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", + "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 }, "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", + "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": { - "@jest/types": "^25.1.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.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", + "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", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", - "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", + "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": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.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": "^25.1.0", + "expect": "^26.6.2", "is-generator-fn": "^2.0.0", - "jest-each": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.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" } }, @@ -2529,229 +2681,259 @@ } }, "jest-leak-detector": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", - "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", + "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": "^25.1.0", - "pretty-format": "^25.1.0" + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" } }, "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", + "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": { - "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" } }, "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", + "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": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.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": "^1.0.1" + "stack-utils": "^2.0.2" } }, "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", + "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", "dev": true, "requires": { - "@jest/types": "^25.1.0" + "@jest/types": "^26.6.2", + "@types/node": "*" } }, "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "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 }, "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==", + "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 }, "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", - "dev": true, - "requires": { - "@jest/types": "^25.1.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "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": { + "@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" } }, "jest-resolve-dependencies": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", - "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", + "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": { - "@jest/types": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-snapshot": "^25.1.0" + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" } }, "jest-runner": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", - "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", - "dev": true, - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", + "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": { + "@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.3", - "jest-config": "^25.1.0", - "jest-docblock": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-leak-detector": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", + "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": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", - "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", - "dev": true, - "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "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": "^3.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.3", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "realpath-native": "^1.1.0", + "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.0.0" + "yargs": "^15.4.1" } }, "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==", - "dev": true + "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" + } }, "jest-snapshot": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", - "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", + "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": "^25.1.0", - "chalk": "^3.0.0", - "expect": "^25.1.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "mkdirp": "^0.5.1", + "@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": "^25.1.0", - "semver": "^7.1.1" + "pretty-format": "^26.6.2", + "semver": "^7.3.2" }, "dependencies": { "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "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" + } } } }, "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", + "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", "dev": true, "requires": { - "@jest/types": "^25.1.0", - "chalk": "^3.0.0", + "@jest/types": "^26.6.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" + "micromatch": "^4.0.2" } }, "jest-validate": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", - "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", + "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": "^25.1.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", + "@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": "^25.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 + } } }, "jest-watcher": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", - "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", + "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": { - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.1.0", - "string-length": "^3.1.0" + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" } }, "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "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" } @@ -2779,36 +2961,36 @@ "dev": true }, "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "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.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", + "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.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", + "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": "^7.0.0", - "ws": "^7.0.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", "xml-name-validator": "^3.0.0" } }, @@ -2818,6 +3000,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "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", @@ -2837,20 +3025,12 @@ "dev": true }, "json5": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", - "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "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" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "jsonpointer": { @@ -2899,6 +3079,12 @@ "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 + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -2920,19 +3106,19 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "lolex": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", - "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "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": { - "@sinonjs/commons": "^1.7.0" + "yallist": "^4.0.0" } }, "make-dir": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", - "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "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" @@ -2987,18 +3173,18 @@ } }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.44.0" } }, "mimic-fn": { @@ -3017,9 +3203,9 @@ } }, "minimist": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.3.tgz", - "integrity": "sha512-+bMdgqjMN/Z77a6NlY/I3U5LlRDbnmaAk6lDveAPKwSpcPM4tKAuYsvYF8xjhOPXhOYGe/73vVLVez5PW+jqhw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mixin-deep": { @@ -3043,23 +3229,6 @@ } } }, - "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -3116,28 +3285,61 @@ "dev": true }, "node-notifier": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", - "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", + "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", "dev": true, "optional": true, "requires": { "growly": "^1.3.0", - "is-wsl": "^2.1.1", - "semver": "^6.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", "shellwords": "^0.1.1", - "which": "^1.3.1" + "uuid": "^8.3.0", + "which": "^2.0.2" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^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==", + "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" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3196,18 +3398,6 @@ } } }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "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", @@ -3217,28 +3407,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -3258,9 +3426,9 @@ } }, "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "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" @@ -3281,9 +3449,9 @@ } }, "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", "dev": true }, "p-finally": { @@ -3293,9 +3461,9 @@ "dev": true }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "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" @@ -3316,10 +3484,22 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "parse5": { + "parse-json": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "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" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true }, "pascalcase": { @@ -3382,12 +3562,6 @@ "find-up": "^4.0.0" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -3407,31 +3581,31 @@ "dev": true }, "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", + "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": "^25.1.0", + "@jest/types": "^26.6.2", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" + "react-is": "^17.0.1" } }, "prompts": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", - "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "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.4" + "sisteransi": "^1.0.5" } }, "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "pump": { @@ -3457,18 +3631,40 @@ "dev": true }, "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", + "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", "dev": true }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "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": { - "util.promisify": "^1.0.0" + "@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" } }, "regex-not": { @@ -3540,21 +3736,21 @@ } }, "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "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==", "dev": true, "requires": { - "request-promise-core": "1.1.3", + "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, @@ -3584,11 +3780,12 @@ "dev": true }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -3797,12 +3994,12 @@ } }, "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "dev": true, "requires": { - "xmlchars": "^2.1.1" + "xmlchars": "^2.2.0" } }, "semver": { @@ -3863,9 +4060,9 @@ "optional": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "sisteransi": { @@ -4028,9 +4225,9 @@ } }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "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", @@ -4043,6 +4240,38 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -4076,10 +4305,21 @@ } }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "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", @@ -4109,30 +4349,13 @@ "dev": true }, "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "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": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.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 - }, - "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" - } - } + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" } }, "string-width": { @@ -4146,26 +4369,6 @@ "strip-ansi": "^6.0.0" } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -4194,9 +4397,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "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" @@ -4310,12 +4513,12 @@ } }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", "dev": true, "requires": { - "punycode": "^2.1.0" + "punycode": "^2.1.1" } }, "tunnel-agent": { @@ -4349,9 +4552,9 @@ "dev": true }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "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": { @@ -4447,18 +4650,6 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -4466,9 +4657,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz", - "integrity": "sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", + "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -4484,6 +4675,16 @@ } } }, + "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", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -4505,13 +4706,11 @@ } }, "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", "dev": true, "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", "xml-name-validator": "^3.0.0" } }, @@ -4525,9 +4724,9 @@ } }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true }, "whatwg-encoding": { @@ -4546,14 +4745,14 @@ "dev": true }, "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" } }, "which": { @@ -4613,9 +4812,9 @@ } }, "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", "dev": true }, "xml": { @@ -4637,15 +4836,21 @@ "dev": true }, "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", @@ -4658,7 +4863,7 @@ "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "yargs-parser": "^18.1.2" } }, "yargs-parser": { diff --git a/package.json b/package.json index 29dedf89..08f64557 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@apidevtools/json-schema-ref-parser": "^8.0.0", "ajv": "^6.10.2", "handlebars": "^4.7.6", - "jest": "25.1.0", + "jest": "^26.6.3", "jest-expect-message": "1.0.2", "jest-junit": "^12.0.0", "jsonpointer": "^4.0.1", diff --git a/schemas/base.json b/schemas/base.json index 1552e2b2..bc1436dc 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -140,6 +140,7 @@ "type": "string", "enum": [ "analytics", + "approval", "authentication", "automation", "code-references", From 80caeef6b1cfcc9b7cef964d010ecf262058f63e Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 31 Dec 2020 18:10:14 +0000 Subject: [PATCH 378/936] Ensure defualt values are provided when formVariable is optional (#221) --- __tests__/validateIntegrationManifests.js | 24 ++++++++++++++++++- docs/form-variables.md | 4 ++-- integrations/sample-integration/manifest.json | 8 ++++--- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 0c988827..d3ce2432 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -168,7 +168,12 @@ describe('All integrations', () => { formVariable.isOptional, '"defaultValue" is only valid if "isOptional" is true. Use "placeholder" if you do not want the variable to be optional.' ).toBe(true); - if (formVariable.type === 'string' || formVariable.type === 'uri') { + if ( + formVariable.type === 'string' || + formVariable.type === 'uri' || + formVariable.type === 'enum' || + formVariable.type === 'dynamicEnum' + ) { expect(_.isString(formVariable.defaultValue)).toBe(true); } else if (formVariable.type === 'boolean') { expect(_.isBoolean(formVariable.defaultValue)).toBe(true); @@ -179,6 +184,23 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'defaultValue is always provided when isOptional true for %s', + (key, manifest) => { + const formVariables = _.get(manifest, 'formVariables', null); + if (formVariables) { + formVariables.forEach(formVariable => { + if (formVariable.isOptional) { + expect( + formVariable.defaultValue, + '"isOptional" is only valid if "defaultValue" is provided.' + ).toBeDefined(); + } + }); + } + } + ); + test.each(manifests)( 'no non-string formVariables have been set to isSecret for %s', (key, manifest) => { diff --git a/docs/form-variables.md b/docs/form-variables.md index 84dc2f5b..ff5f152f 100644 --- a/docs/form-variables.md +++ b/docs/form-variables.md @@ -38,7 +38,7 @@ Form variables apply to the entire integration configuration. There are no capab The `formVariables[].description` will be used as a field label on the UI. You can use simple markdown to link a word or phrase to an external URL. -Accepted form variable types are `string`, `boolean`, `uri`, and `enum`. -Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. If you provide a `defaultValue`, you must also set `isOptional` to `true`. +Accepted form variable types are `string`, `boolean`, `uri`, `enum`, and `dynamicEnum`. +Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. If you provide a `defaultValue`, you must also set `isOptional` to `true` and vice versa. To learn more, read the [manifest schema](../manifest.schema.json). diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 3a321c6d..c8edbc09 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -21,7 +21,8 @@ "description": "This is an optional property", "type": "string", "isSecret": false, - "isOptional": true + "isOptional": true, + "defaultValue": "" }, { "key": "required", @@ -37,7 +38,8 @@ "description": "This field will be validated as a URL", "type": "uri", "isSecret": false, - "isOptional": true + "isOptional": true, + "defaultValue": "https://example.com" }, { "key": "hasPlaceholder", @@ -46,6 +48,7 @@ "type": "string", "isSecret": false, "isOptional": true, + "defaultValue": "", "placeholder": "I am a placeholder" }, { @@ -72,7 +75,6 @@ "description": "this is a dynamic enum", "type": "dynamicEnum", "isSecret": false, - "isOptional": true, "dynamicOptions": { "endpoint": { "url": "https://reqres.in/api/unknown", From a896c176d1e6fe3a89e6baaa84eb7e7fa3ae9f45 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 15 Jan 2021 15:36:07 +0100 Subject: [PATCH 379/936] Imiller/ch98557/update approvalParser schema to have approvalId (#222) * add approvalId to approval parser * add approvalId to propertyNames * best guess at servicenow approvalId path * pull package-lock.json over from master --- integrations/servicenow/manifest.json | 1 + manifest.schema.d.ts | 11 +++++++++++ manifest.schema.json | 14 ++++++++++++++ schemas/capabilities/parser/parser.json | 7 +++++++ 4 files changed, 33 insertions(+) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index df815975..c91a0a90 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -84,6 +84,7 @@ ] }, "parser": { + "approvalId": "/result/sys_id", "statusValue": "/result/state/value", "statusDisplay": "/result/state/display_value", "approvalMatcher": "0", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 87ed38a5..35833a1f 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -55,6 +55,7 @@ export type SupportWebsite = string; export type Categories = | [ | "analytics" + | "approval" | "authentication" | "automation" | "code-references" @@ -70,6 +71,7 @@ export type Categories = | [ ( | "analytics" + | "approval" | "authentication" | "automation" | "code-references" @@ -84,6 +86,7 @@ export type Categories = ), ( | "analytics" + | "approval" | "authentication" | "automation" | "code-references" @@ -100,6 +103,7 @@ export type Categories = | [ ( | "analytics" + | "approval" | "authentication" | "automation" | "code-references" @@ -114,6 +118,7 @@ export type Categories = ), ( | "analytics" + | "approval" | "authentication" | "automation" | "code-references" @@ -128,6 +133,7 @@ export type Categories = ), ( | "analytics" + | "approval" | "authentication" | "automation" | "code-references" @@ -349,6 +355,10 @@ export type EnvironmentFormVariables = FormVariable[]; * Member-specific form variables that are used to connect integration users to LaunchDarkly members */ export type MemberFormVariables = FormVariable[]; +/** + * Externally-created approval entity ID + */ +export type ApprovalIDPointer = string; /** * JSON pointer to a status value */ @@ -614,6 +624,7 @@ export interface CreationRequest { * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer */ export interface ApprovalParser { + approvalId?: ApprovalIDPointer; statusValue: StatusValuePointer; statusDisplay?: StatusValueDisplayPointer; approvalMatcher: ApprovalMatcher; diff --git a/manifest.schema.json b/manifest.schema.json index 9dfa9453..4f111768 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1988,6 +1988,7 @@ "type": "object", "propertyNames": { "enum": [ + "approvalId", "statusValue", "statusDisplay", "approvalMatcher", @@ -1999,6 +2000,12 @@ "approvalMatcher" ], "properties": { + "approvalId": { + "$id": "#/approval-parser/approval-id", + "title": "Approval ID pointer", + "description": "Externally-created approval entity ID", + "type": "string" + }, "statusValue": { "$id": "#/approval-parser/status-value", "title": "Status Value pointer", @@ -2141,6 +2148,7 @@ "type": "object", "propertyNames": { "enum": [ + "approvalId", "statusValue", "statusDisplay", "approvalMatcher", @@ -2152,6 +2160,12 @@ "approvalMatcher" ], "properties": { + "approvalId": { + "$id": "#/approval-parser/approval-id", + "title": "Approval ID pointer", + "description": "Externally-created approval entity ID", + "type": "string" + }, "statusValue": { "$id": "#/approval-parser/status-value", "title": "Status Value pointer", diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index d8ba140a..c0a2c39e 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -102,6 +102,7 @@ "type": "object", "propertyNames": { "enum": [ + "approvalId", "statusValue", "statusDisplay", "approvalMatcher", @@ -110,6 +111,12 @@ }, "required": ["statusValue", "approvalMatcher"], "properties": { + "approvalId": { + "$id": "#/approval-parser/approval-id", + "title": "Approval ID pointer", + "description": "Externally-created approval entity ID", + "type": "string" + }, "statusValue": { "$id": "#/approval-parser/status-value", "title": "Status Value pointer", From faa8a13982890bf412fa61ba587fada51464de6a Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 15 Jan 2021 16:55:56 +0000 Subject: [PATCH 380/936] Add short description query param to creation template to verify everything is working (#223) --- integrations/servicenow/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index c91a0a90..5ccc2d3a 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -74,7 +74,7 @@ ], "creationRequest": { "endpoint": { - "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}/?requested_by={{member.username}}", + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}", "method": "POST", "headers": [ { @@ -84,7 +84,7 @@ ] }, "parser": { - "approvalId": "/result/sys_id", + "approvalId": "/result/sys_id/value", "statusValue": "/result/state/value", "statusDisplay": "/result/state/display_value", "approvalMatcher": "0", From 74fd6f3b3b836d8de796bed60d8f97a63cbbb08f Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 19 Jan 2021 16:45:19 +0100 Subject: [PATCH 381/936] add urlTemplate to approvalparser (#224) --- manifest.schema.d.ts | 5 +++++ manifest.schema.json | 18 ++++++++++++++++-- schemas/capabilities/parser/parser.json | 9 ++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 35833a1f..fae13321 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -375,6 +375,10 @@ export type ApprovalMatcher = string; * regex pattern used to determine if the approval should be considered 'rejected' */ export type RejectionMatcher = string; +/** + * expected format for the external creation request URL. Values can be substituted in using {{value}} + */ +export type URLTemplate = string; /** * Describes the capabilities and intent of a LaunchDarkly integration @@ -629,6 +633,7 @@ export interface ApprovalParser { statusDisplay?: StatusValueDisplayPointer; approvalMatcher: ApprovalMatcher; rejectionMatcher?: RejectionMatcher; + urlTemplate?: URLTemplate; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index 4f111768..238565d3 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1992,7 +1992,8 @@ "statusValue", "statusDisplay", "approvalMatcher", - "rejectionMatcher" + "rejectionMatcher", + "urlTemplate" ] }, "required": [ @@ -2029,6 +2030,12 @@ "title": "Rejection matcher", "description": "regex pattern used to determine if the approval should be considered 'rejected'", "type": "string" + }, + "urlTemplate": { + "$id": "#/approval-parser/url-template", + "title": "URL template", + "description": "expected format for the external creation request URL. Values can be substituted in using {{value}}", + "type": "string" } } } @@ -2152,7 +2159,8 @@ "statusValue", "statusDisplay", "approvalMatcher", - "rejectionMatcher" + "rejectionMatcher", + "urlTemplate" ] }, "required": [ @@ -2189,6 +2197,12 @@ "title": "Rejection matcher", "description": "regex pattern used to determine if the approval should be considered 'rejected'", "type": "string" + }, + "urlTemplate": { + "$id": "#/approval-parser/url-template", + "title": "URL template", + "description": "expected format for the external creation request URL. Values can be substituted in using {{value}}", + "type": "string" } } } diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index c0a2c39e..b0421e06 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -106,7 +106,8 @@ "statusValue", "statusDisplay", "approvalMatcher", - "rejectionMatcher" + "rejectionMatcher", + "urlTemplate" ] }, "required": ["statusValue", "approvalMatcher"], @@ -140,6 +141,12 @@ "title": "Rejection matcher", "description": "regex pattern used to determine if the approval should be considered 'rejected'", "type": "string" + }, + "urlTemplate": { + "$id": "#/approval-parser/url-template", + "title": "URL template", + "description": "expected format for the external creation request URL. Values can be substituted in using {{value}}", + "type": "string" } } } From 21a6cba07bedbedd2aa4a0399e8c37c008b563c2 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 2 Feb 2021 12:45:14 +0100 Subject: [PATCH 382/936] add deletionRequest --- manifest.schema.d.ts | 10 ++- manifest.schema.json | 135 +++++++++++++++++++++++++++-- schemas/capabilities/approval.json | 17 +++- schemas/definitions.json | 2 +- 4 files changed, 152 insertions(+), 12 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index fae13321..4ee9040e 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -206,7 +206,7 @@ export type URL = string; /** * HTTP method to use when LaunchDarkly makes the request to your endpoint */ -export type HTTPMethod = "POST" | "PUT" | "PATCH" | "GET"; +export type HTTPMethod = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; /** * Name of the header */ @@ -614,6 +614,7 @@ export interface Approval { memberFormVariables?: MemberFormVariables; creationRequest: CreationRequest; statusRequest: StatusRequest; + deletionRequest?: DeletionRequest; [k: string]: unknown; } /** @@ -644,3 +645,10 @@ export interface StatusRequest { parser: ApprovalParser; [k: string]: unknown; } +/** + * Describes the HTTP request for the deletion of the external approval entity + */ +export interface DeletionRequest { + endpoint: Endpoint; + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index 238565d3..cc2205d3 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -377,7 +377,8 @@ "POST", "PUT", "PATCH", - "GET" + "GET", + "DELETE" ], "type": "string" }, @@ -561,7 +562,8 @@ "POST", "PUT", "PATCH", - "GET" + "GET", + "DELETE" ], "type": "string" }, @@ -878,7 +880,8 @@ "POST", "PUT", "PATCH", - "GET" + "GET", + "DELETE" ], "type": "string" }, @@ -1082,7 +1085,8 @@ "POST", "PUT", "PATCH", - "GET" + "GET", + "DELETE" ], "type": "string" }, @@ -1325,7 +1329,8 @@ "environmentFormVariables", "memberFormVariables", "creationRequest", - "statusRequest" + "statusRequest", + "deletionRequest" ] }, "required": [ @@ -1475,7 +1480,8 @@ "POST", "PUT", "PATCH", - "GET" + "GET", + "DELETE" ], "type": "string" }, @@ -1746,7 +1752,8 @@ "POST", "PUT", "PATCH", - "GET" + "GET", + "DELETE" ], "type": "string" }, @@ -1916,7 +1923,8 @@ "POST", "PUT", "PATCH", - "GET" + "GET", + "DELETE" ], "type": "string" }, @@ -2083,7 +2091,8 @@ "POST", "PUT", "PATCH", - "GET" + "GET", + "DELETE" ], "type": "string" }, @@ -2207,6 +2216,114 @@ } } } + }, + "deletionRequest": { + "$id": "#/capabilities/approval/deletion-request", + "title": "Deletion Request", + "description": "Describes the HTTP request for the deletion of the external approval entity", + "propertyNames": { + "enum": [ + "endpoint" + ] + }, + "required": [ + "endpoint" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + } + } } } } diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index 858860b0..a9549dee 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -10,7 +10,8 @@ "environmentFormVariables", "memberFormVariables", "creationRequest", - "statusRequest" + "statusRequest", + "deletionRequest" ] }, "required": ["creationRequest", "statusRequest"], @@ -68,6 +69,20 @@ "$ref": "parser/parser.json#/approvalParser" } } + }, + "deletionRequest": { + "$id": "#/capabilities/approval/deletion-request", + "title": "Deletion Request", + "description": "Describes the HTTP request for the deletion of the external approval entity", + "propertyNames": { + "enum": ["endpoint"] + }, + "required": ["endpoint"], + "properties": { + "endpoint": { + "$ref": "../definitions.json#/endpoint" + } + } } } } diff --git a/schemas/definitions.json b/schemas/definitions.json index efc5cbe8..79b86580 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -18,7 +18,7 @@ "$id": "#/definitions/endpoint/method", "title": "HTTP method", "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": ["POST", "PUT", "PATCH", "GET"], + "enum": ["POST", "PUT", "PATCH", "GET", "DELETE"], "type": "string" }, "endpointHeaders": { From 9aea0e3d4d363461e6ea859e754811c1cbf188e2 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 2 Feb 2021 18:20:14 +0000 Subject: [PATCH 383/936] update servicenow status endpoint (#225) --- integrations/servicenow/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 5ccc2d3a..860290ac 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -93,8 +93,8 @@ }, "statusRequest": { "endpoint": { - "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{creation.id}}", - "method": "POST", + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{context.approvalId}}", + "method": "GET", "headers": [ { "name": "Authorization", From 0458f94b2444c1062434f44eb6a17fd4cdbd1ba0 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 8 Feb 2021 16:43:33 +0000 Subject: [PATCH 384/936] Use Implementing state as Servicenow approval condition (#226) --- integrations/servicenow/manifest.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 860290ac..1c921259 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -87,8 +87,8 @@ "approvalId": "/result/sys_id/value", "statusValue": "/result/state/value", "statusDisplay": "/result/state/display_value", - "approvalMatcher": "0", - "rejectionMatcher": "-2" + "approvalMatcher": "-1", + "rejectionMatcher": "n/a" } }, "statusRequest": { @@ -105,8 +105,8 @@ "parser": { "statusValue": "/result/state/value", "statusDisplay": "/result/state/display_value", - "approvalMatcher": "0", - "rejectionMatcher": "-2" + "approvalMatcher": "-1", + "rejectionMatcher": "n/a" } } } From ac36596607ba8dde55bd3836edbf9ae722239962 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 16 Feb 2021 14:11:57 +0000 Subject: [PATCH 385/936] [ch98744] Add justification to servicenow manifest (#227) * Add justification * Add url template --- integrations/servicenow/manifest.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 1c921259..40fa239e 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -74,7 +74,7 @@ ], "creationRequest": { "endpoint": { - "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}", + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}&{{#if context.details.plainText}}&justification={{queryEncode context.details.plainText}}{{/if}}", "method": "POST", "headers": [ { @@ -88,7 +88,8 @@ "statusValue": "/result/state/value", "statusDisplay": "/result/state/display_value", "approvalMatcher": "-1", - "rejectionMatcher": "n/a" + "rejectionMatcher": "n/a", + "urlTemplate": "{{oauth.baseURI}}/change_request.do?sys_id={{queryEncode context.approvalId}}" } }, "statusRequest": { From a44a4b2cad821c52a6378adb2ba3d38eaf6df6f7 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 17 Feb 2021 11:39:45 +0000 Subject: [PATCH 386/936] Add Servicenow svgs (#228) --- integrations/servicenow/assets/images/logo_square.svg | 4 ---- integrations/servicenow/assets/images/servicenow-icon.svg | 3 +++ .../servicenow/assets/images/servicenow-rectangle.svg | 5 +++++ integrations/servicenow/manifest.json | 4 ++-- 4 files changed, 10 insertions(+), 6 deletions(-) delete mode 100644 integrations/servicenow/assets/images/logo_square.svg create mode 100644 integrations/servicenow/assets/images/servicenow-icon.svg create mode 100644 integrations/servicenow/assets/images/servicenow-rectangle.svg diff --git a/integrations/servicenow/assets/images/logo_square.svg b/integrations/servicenow/assets/images/logo_square.svg deleted file mode 100644 index 799ca37f..00000000 --- a/integrations/servicenow/assets/images/logo_square.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/integrations/servicenow/assets/images/servicenow-icon.svg b/integrations/servicenow/assets/images/servicenow-icon.svg new file mode 100644 index 00000000..f676f2c1 --- /dev/null +++ b/integrations/servicenow/assets/images/servicenow-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/servicenow/assets/images/servicenow-rectangle.svg b/integrations/servicenow/assets/images/servicenow-rectangle.svg new file mode 100644 index 00000000..35828a89 --- /dev/null +++ b/integrations/servicenow/assets/images/servicenow-rectangle.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 40fa239e..11ee7296 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -11,8 +11,8 @@ }, "categories": ["approval"], "icons": { - "square": "assets/images/logo_square.svg", - "horizontal": "assets/images/logo_square.svg" + "square": "assets/images/servicenow-icon.svg", + "horizontal": "assets/images/servicenow-rectangle.svg" }, "requiresOAuth": true, "formVariables": [], From 05fac48a9932208446cfded466e5759eb6f329f1 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 17 Feb 2021 17:39:32 +0100 Subject: [PATCH 387/936] [ch100894] add new memberListRequest to approvals schema (#229) * add member list request and new member list parser to approvals schema * forgot to add memberListRequest to property list * actually probably want this to be required * add servicenow memberListRequest * make not required for now so it doesn't break all the goaltender tests * oops forgot leading slash * change user to member * update snow manifest * well that was a bug * missed some members * missed some more * update descriptions * how many typos can i make in a day --- integrations/servicenow/manifest.json | 19 +++ manifest.schema.d.ts | 34 +++++ manifest.schema.json | 163 ++++++++++++++++++++++++ schemas/capabilities/approval.json | 18 +++ schemas/capabilities/parser/parser.json | 40 ++++++ 5 files changed, 274 insertions(+) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 11ee7296..a16f24c7 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -109,6 +109,25 @@ "approvalMatcher": "-1", "rejectionMatcher": "n/a" } + }, + "memberListRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=email,sys_id", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "memberArrayPath": "/result", + "memberItems": { + "memberId": "/sys_id", + "email": "/email" + } + } } } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 4ee9040e..0f2c32b8 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -379,6 +379,18 @@ export type RejectionMatcher = string; * expected format for the external creation request URL. Values can be substituted in using {{value}} */ export type URLTemplate = string; +/** + * JSON path to the array containing integration member details + */ +export type MemberArrayPath = string; +/** + * Relative JSON path to the email field in each member item in the array + */ +export type Email = string; +/** + * Relative JSON path to the integration member ID field in each member item in the array + */ +export type MemberID = string; /** * Describes the capabilities and intent of a LaunchDarkly integration @@ -614,6 +626,7 @@ export interface Approval { memberFormVariables?: MemberFormVariables; creationRequest: CreationRequest; statusRequest: StatusRequest; + memberListRequest?: MemberListRequest; deletionRequest?: DeletionRequest; [k: string]: unknown; } @@ -645,6 +658,27 @@ export interface StatusRequest { parser: ApprovalParser; [k: string]: unknown; } +/** + * Describes the HTTP request to get integration users for mapping to Launchdarkly users + */ +export interface MemberListRequest { + endpoint: Endpoint; + parser: MemberListParser; + [k: string]: unknown; +} +/** + * Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer + */ +export interface MemberListParser { + memerArrayPath?: MemberArrayPath; + memberItems: MemberItemsArray; + [k: string]: unknown; +} +export interface MemberItemsArray { + email: Email; + memberId: MemberID; + [k: string]: unknown; +} /** * Describes the HTTP request for the deletion of the external approval entity */ diff --git a/manifest.schema.json b/manifest.schema.json index cc2205d3..d2d6e0b9 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1330,6 +1330,7 @@ "memberFormVariables", "creationRequest", "statusRequest", + "memberListRequest", "deletionRequest" ] }, @@ -2217,6 +2218,168 @@ } } }, + "memberListRequest": { + "$id": "#/capabilities/approval/member-list-request", + "title": "Member List Request", + "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/member-list-parser", + "title": "Member list parser", + "description": "Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "required": [ + "memberArrayPath", + "memberItems" + ], + "propertyNames": { + "enum": [ + "memberArrayPath", + "memberItems" + ] + }, + "properties": { + "memerArrayPath": { + "$id": "#/member-list-parser/member-array-path", + "title": "Member array path", + "description": "JSON path to the array containing integration member details", + "type": "string" + }, + "memberItems": { + "$id": "#/member-list-parser/member-items", + "title": "Member items array", + "propertyNames": { + "enum": [ + "email", + "memberId" + ] + }, + "required": [ + "email", + "memberId" + ], + "properties": { + "email": { + "$id": "#/member-list-parser/member-items/email", + "title": "Email", + "description": "Relative JSON path to the email field in each member item in the array", + "type": "string" + }, + "memberId": { + "$id": "#/member-list-parser/member-items/member-id", + "title": "Member ID", + "description": "Relative JSON path to the integration member ID field in each member item in the array", + "type": "string" + } + } + } + } + } + } + }, "deletionRequest": { "$id": "#/capabilities/approval/deletion-request", "title": "Deletion Request", diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index a9549dee..e78e24af 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -11,6 +11,7 @@ "memberFormVariables", "creationRequest", "statusRequest", + "memberListRequest", "deletionRequest" ] }, @@ -70,6 +71,23 @@ } } }, + "memberListRequest": { + "$id": "#/capabilities/approval/member-list-request", + "title": "Member List Request", + "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", + "propertyNames": { + "enum": ["endpoint", "parser"] + }, + "required": ["endpoint", "parser"], + "properties": { + "endpoint": { + "$ref": "../definitions.json#/endpoint" + }, + "parser": { + "$ref": "parser/parser.json#/memberListParser" + } + } + }, "deletionRequest": { "$id": "#/capabilities/approval/deletion-request", "title": "Deletion Request", diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index b0421e06..2303cc4d 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -149,5 +149,45 @@ "type": "string" } } + }, + "memberListParser": { + "$id": "#/member-list-parser", + "title": "Member list parser", + "description": "Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "required": ["memberArrayPath", "memberItems"], + "propertyNames": { + "enum": ["memberArrayPath", "memberItems"] + }, + "properties": { + "memerArrayPath": { + "$id": "#/member-list-parser/member-array-path", + "title": "Member array path", + "description": "JSON path to the array containing integration member details", + "type": "string" + }, + "memberItems": { + "$id": "#/member-list-parser/member-items", + "title": "Member items array", + "propertyNames": { + "enum": ["email", "memberId"] + }, + "required": ["email", "memberId"], + "properties": { + "email": { + "$id": "#/member-list-parser/member-items/email", + "title": "Email", + "description": "Relative JSON path to the email field in each member item in the array", + "type": "string" + }, + "memberId": { + "$id": "#/member-list-parser/member-items/member-id", + "title": "Member ID", + "description": "Relative JSON path to the integration member ID field in each member item in the array", + "type": "string" + } + } + } + } } } From b99364112303c65fc901c62cadc564aee415ab37 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 17 Feb 2021 18:14:06 +0100 Subject: [PATCH 388/936] fix typo (#230) --- manifest.schema.d.ts | 2 +- manifest.schema.json | 2 +- schemas/capabilities/parser/parser.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 0f2c32b8..147e4517 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -670,7 +670,7 @@ export interface MemberListRequest { * Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer */ export interface MemberListParser { - memerArrayPath?: MemberArrayPath; + memberArrayPath: MemberArrayPath; memberItems: MemberItemsArray; [k: string]: unknown; } diff --git a/manifest.schema.json b/manifest.schema.json index d2d6e0b9..0198b658 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2342,7 +2342,7 @@ ] }, "properties": { - "memerArrayPath": { + "memberArrayPath": { "$id": "#/member-list-parser/member-array-path", "title": "Member array path", "description": "JSON path to the array containing integration member details", diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index 2303cc4d..145c8342 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -160,7 +160,7 @@ "enum": ["memberArrayPath", "memberItems"] }, "properties": { - "memerArrayPath": { + "memberArrayPath": { "$id": "#/member-list-parser/member-array-path", "title": "Member array path", "description": "JSON path to the array containing integration member details", From 75b4179a142a9b6a1f8eac51ad00e152094d0d2a Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 22 Feb 2021 13:32:14 +0100 Subject: [PATCH 389/936] Imiller/ch97553/make MemberListRequest required (#231) * fix typo * make required --- manifest.schema.d.ts | 2 +- manifest.schema.json | 3 ++- schemas/capabilities/approval.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 147e4517..3bcb7dff 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -626,7 +626,7 @@ export interface Approval { memberFormVariables?: MemberFormVariables; creationRequest: CreationRequest; statusRequest: StatusRequest; - memberListRequest?: MemberListRequest; + memberListRequest: MemberListRequest; deletionRequest?: DeletionRequest; [k: string]: unknown; } diff --git a/manifest.schema.json b/manifest.schema.json index 0198b658..807b5335 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1336,7 +1336,8 @@ }, "required": [ "creationRequest", - "statusRequest" + "statusRequest", + "memberListRequest" ], "properties": { "environmentFormVariables": { diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index e78e24af..d6467ffe 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -15,7 +15,7 @@ "deletionRequest" ] }, - "required": ["creationRequest", "statusRequest"], + "required": ["creationRequest", "statusRequest", "memberListRequest"], "properties": { "environmentFormVariables": { "$id": "#/capabilities/approval/environment-form-variables", From 6066f877b59a58d85c7f175e367169241c9a6d51 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 23 Feb 2021 13:42:21 +0000 Subject: [PATCH 390/936] Make deletion request required (#232) --- integrations/servicenow/manifest.json | 12 ++++++++++++ manifest.schema.d.ts | 2 +- manifest.schema.json | 1 + schemas/capabilities/approval.json | 7 ++++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index a16f24c7..f6f70662 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -110,6 +110,18 @@ "rejectionMatcher": "n/a" } }, + "deletionRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{context.approvalId}}?state=Canceled", + "method": "PATCH", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + } + }, "memberListRequest": { "endpoint": { "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=email,sys_id", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 3bcb7dff..6a281b87 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -627,7 +627,7 @@ export interface Approval { creationRequest: CreationRequest; statusRequest: StatusRequest; memberListRequest: MemberListRequest; - deletionRequest?: DeletionRequest; + deletionRequest: DeletionRequest; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index 807b5335..3ee26f32 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1337,6 +1337,7 @@ "required": [ "creationRequest", "statusRequest", + "deletionRequest", "memberListRequest" ], "properties": { diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index d6467ffe..0f756460 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -15,7 +15,12 @@ "deletionRequest" ] }, - "required": ["creationRequest", "statusRequest", "memberListRequest"], + "required": [ + "creationRequest", + "statusRequest", + "deletionRequest", + "memberListRequest" + ], "properties": { "environmentFormVariables": { "$id": "#/capabilities/approval/environment-form-variables", From 39f70e92f971b6f98433681758303d29066b51c6 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 24 Feb 2021 14:15:04 +0000 Subject: [PATCH 391/936] [ch101451] Add postApplyRequest and add parser to deletionRequest (#233) * Add postApplyRequest to schema and add parser to deletionRequest * Make parsers required and move memberListRequest up --- integrations/servicenow/manifest.json | 51 ++- manifest.schema.d.ts | 73 ++-- manifest.schema.json | 559 ++++++++++++-------------- schemas/capabilities/approval.json | 51 ++- 4 files changed, 352 insertions(+), 382 deletions(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index f6f70662..04bf4e40 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -45,33 +45,6 @@ } } ], - "memberFormVariables": [ - { - "key": "username", - "name": "ServiceNow username", - "description": "The ServiceNow username used to attribute change requests", - "type": "dynamicEnum", - "dynamicOptions": { - "endpoint": { - "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=name,email,user_name,sys_id", - "method": "GET", - "headers": [ - { - "name": "Authorization", - "value": "Bearer {{oauth.accessToken}}" - } - ] - }, - "parser": { - "optionsPath": "/result", - "optionsItems": { - "label": "/name", - "value": "/user_name" - } - } - } - } - ], "creationRequest": { "endpoint": { "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}&{{#if context.details.plainText}}&justification={{queryEncode context.details.plainText}}{{/if}}", @@ -110,6 +83,24 @@ "rejectionMatcher": "n/a" } }, + "postApplyRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{context.approvalId}}?state=Review", + "method": "PATCH", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "statusValue": "/result/state/value", + "statusDisplay": "/result/state/display_value", + "approvalMatcher": "-1", + "rejectionMatcher": "n/a" + } + }, "deletionRequest": { "endpoint": { "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{context.approvalId}}?state=Canceled", @@ -120,6 +111,12 @@ "value": "Bearer {{oauth.accessToken}}" } ] + }, + "parser": { + "statusValue": "/result/state/value", + "statusDisplay": "/result/state/display_value", + "approvalMatcher": "-1", + "rejectionMatcher": "n/a" } }, "memberListRequest": { diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 6a281b87..4bbbf4d0 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -348,13 +348,21 @@ export type ValuePointer = string; */ export type URLPointer1 = string; /** - * Environment-specific form variables that render on the environment approval settings modal + * JSON path to the array containing integration member details */ -export type EnvironmentFormVariables = FormVariable[]; +export type MemberArrayPath = string; /** - * Member-specific form variables that are used to connect integration users to LaunchDarkly members + * Relative JSON path to the email field in each member item in the array */ -export type MemberFormVariables = FormVariable[]; +export type Email = string; +/** + * Relative JSON path to the integration member ID field in each member item in the array + */ +export type MemberID = string; +/** + * Environment-specific form variables that render on the environment approval settings modal + */ +export type EnvironmentFormVariables = FormVariable[]; /** * Externally-created approval entity ID */ @@ -379,18 +387,6 @@ export type RejectionMatcher = string; * expected format for the external creation request URL. Values can be substituted in using {{value}} */ export type URLTemplate = string; -/** - * JSON path to the array containing integration member details - */ -export type MemberArrayPath = string; -/** - * Relative JSON path to the email field in each member item in the array - */ -export type Email = string; -/** - * Relative JSON path to the integration member ID field in each member item in the array - */ -export type MemberID = string; /** * Describes the capabilities and intent of a LaunchDarkly integration @@ -622,14 +618,35 @@ export interface TriggerParser { * This capability enables integration-driven flag change approvals */ export interface Approval { + memberListRequest: MemberListRequest; environmentFormVariables?: EnvironmentFormVariables; - memberFormVariables?: MemberFormVariables; creationRequest: CreationRequest; statusRequest: StatusRequest; - memberListRequest: MemberListRequest; + postApplyRequest: PostApplyRequest; deletionRequest: DeletionRequest; [k: string]: unknown; } +/** + * Describes the HTTP request to get integration users for mapping to Launchdarkly users + */ +export interface MemberListRequest { + endpoint: Endpoint; + parser: MemberListParser; + [k: string]: unknown; +} +/** + * Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer + */ +export interface MemberListParser { + memberArrayPath: MemberArrayPath; + memberItems: MemberItemsArray; + [k: string]: unknown; +} +export interface MemberItemsArray { + email: Email; + memberId: MemberID; + [k: string]: unknown; +} /** * Describes the approval creation HTTP request and the parser used to process the JSON response */ @@ -659,24 +676,11 @@ export interface StatusRequest { [k: string]: unknown; } /** - * Describes the HTTP request to get integration users for mapping to Launchdarkly users + * Describes the HTTP request to make after the changes have been applied in LaunchDarkly */ -export interface MemberListRequest { +export interface PostApplyRequest { endpoint: Endpoint; - parser: MemberListParser; - [k: string]: unknown; -} -/** - * Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer - */ -export interface MemberListParser { - memberArrayPath: MemberArrayPath; - memberItems: MemberItemsArray; - [k: string]: unknown; -} -export interface MemberItemsArray { - email: Email; - memberId: MemberID; + parser: ApprovalParser; [k: string]: unknown; } /** @@ -684,5 +688,6 @@ export interface MemberItemsArray { */ export interface DeletionRequest { endpoint: Endpoint; + parser: ApprovalParser; [k: string]: unknown; } diff --git a/manifest.schema.json b/manifest.schema.json index 3ee26f32..54a9f9e2 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1327,296 +1327,187 @@ "propertyNames": { "enum": [ "environmentFormVariables", - "memberFormVariables", "creationRequest", "statusRequest", - "memberListRequest", - "deletionRequest" + "postApplyRequest", + "deletionRequest", + "memberListRequest" ] }, "required": [ "creationRequest", "statusRequest", + "postApplyRequest", "deletionRequest", "memberListRequest" ], "properties": { - "environmentFormVariables": { - "$id": "#/capabilities/approval/environment-form-variables", - "title": "Environment form variables", - "description": "Environment-specific form variables that render on the environment approval settings modal", - "type": "array", - "items": { - "$id": "#/definitions/form-variable", - "title": "Form variable", - "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", - "type": "object", - "propertyNames": { - "enum": [ - "key", - "name", - "type", - "description", - "placeholder", - "isSecret", - "isOptional", - "defaultValue", - "allowedValues", - "dynamicOptions" - ] - }, - "properties": { - "key": { - "$id": "#/definitions/form-variable/key", - "title": "Key", - "type": "string", - "description": "A key will be used as the token name when the variable is substituted", - "maxLength": 20, - "pattern": "^[^\\s]*$" - }, - "name": { - "$id": "#/definitions/form-variable/name", - "title": "Name", - "type": "string", - "description": "A descriptive name that will be used as the form label on the UI", - "maxLength": 50 - }, - "type": { - "$id": "#/definitions/form-variable/type", - "title": "Type", - "type": "string", - "description": "The type of the variable", + "memberListRequest": { + "$id": "#/capabilities/approval/member-list-request", + "title": "Member List Request", + "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { "enum": [ - "string", - "boolean", - "uri", - "enum", - "oauth", - "dynamicEnum" + "url", + "method", + "headers" ] }, - "description": { - "$id": "#/definitions/form-variable/description", - "title": "Description", - "type": "string", - "description": "Describes the variable in the UI. Markdown links allowed.", - "maxLength": 250 - }, - "placeholder": { - "$id": "#/definitions/form-variable/placeholder", - "title": "Description", - "type": "string", - "description": "Placeholder value to use in the form element if applicable" - }, - "isSecret": { - "$id": "#/definitions/form-variable/is-secret", - "title": "Is this variable a secret?", - "type": "boolean", - "description": "Secret variables will be masked in the UI", - "default": false - }, - "isOptional": { - "$id": "#/definitions/form-variable/is-optional", - "title": "Is this variable optional?", - "type": "boolean", - "description": "Variables marked as optional won't be required on the UI", - "default": false - }, - "defaultValue": { - "$id": "#/definitions/form-variable/default-value", - "title": "Default value", - "type": [ - "boolean", - "string" - ], - "description": "Default value for variable. Can be overridden by user in the UI" - }, - "allowedValues": { - "$id": "#/definitions/form-variable/allowed-values", - "title": "Allowed values", - "type": "array", - "description": "allowed string values for enum-type formVariables", - "items": { - "type": "string" - } - }, - "dynamicOptions": { - "$id": "#/definitions/form-variable/dynamic-options", - "title": "Dynamic options", - "type": "object", - "description": "Parser and endpoint for handling dynamicEnum", - "propertyNames": { + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", "enum": [ - "endpoint", - "parser" - ] + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" }, - "required": [ - "endpoint", - "parser" - ], - "properties": { - "endpoint": { - "$id": "#/definitions/endpoint", - "title": "Endpoint", - "description": "Properties that describe an HTTP request to an external endpoint", + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", "type": "object", "propertyNames": { "enum": [ - "url", - "method", - "headers" + "name", + "value" ] }, "properties": { - "url": { - "$id": "#/definitions/endpoint/url", - "title": "URL", + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." - }, - "method": { - "$id": "#/definitions/endpoint/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": [ - "POST", - "PUT", - "PATCH", - "GET", - "DELETE" - ], - "type": "string" + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" }, - "headers": { - "$id": "#/definitions/endpoint/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/definitions/endpoint/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": [ - "name", - "value" - ] - }, - "properties": { - "name": { - "$id": "#/definitions/endpoint/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/definitions/endpoint/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": [ - "name", - "value" - ] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" } }, "required": [ - "url", - "method" + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/member-list-parser", + "title": "Member list parser", + "description": "Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "required": [ + "memberArrayPath", + "memberItems" + ], + "propertyNames": { + "enum": [ + "memberArrayPath", + "memberItems" + ] + }, + "properties": { + "memberArrayPath": { + "$id": "#/member-list-parser/member-array-path", + "title": "Member array path", + "description": "JSON path to the array containing integration member details", + "type": "string" + }, + "memberItems": { + "$id": "#/member-list-parser/member-items", + "title": "Member items array", + "propertyNames": { + "enum": [ + "email", + "memberId" ] }, - "parser": { - "$id": "#/definitions/form-variable/dynamic-options/parser", - "title": "Dynamic options parser", - "description": "Mapping of property names to location in JSON response", - "type": "object", - "required": [ - "optionsPath", - "optionsItems" - ], - "propertyNames": { - "enum": [ - "optionsPath", - "optionsItems" - ] + "required": [ + "email", + "memberId" + ], + "properties": { + "email": { + "$id": "#/member-list-parser/member-items/email", + "title": "Email", + "description": "Relative JSON path to the email field in each member item in the array", + "type": "string" }, - "properties": { - "optionsPath": { - "$id": "#/definitions/form-variable/dynamic-options/parser/options-path", - "title": "Options array path", - "description": "JSON path to the array containing options for parsing", - "type": "string" - }, - "optionsItems": { - "$id": "#/definitions/form-variable/dynamic-options/parser/options-items", - "title": "Options array", - "propertyNames": { - "enum": [ - "label", - "value" - ] - }, - "required": [ - "label", - "value" - ], - "properties": { - "label": { - "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/label", - "title": "Label", - "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", - "type": "string" - }, - "value": { - "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/value", - "title": "Value", - "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", - "type": "string" - } - } - } + "memberId": { + "$id": "#/member-list-parser/member-items/member-id", + "title": "Member ID", + "description": "Relative JSON path to the integration member ID field in each member item in the array", + "type": "string" } } } } - }, - "required": [ - "key", - "name", - "type", - "description" - ] - }, - "default": [] + } + } }, - "memberFormVariables": { - "$id": "#/capabilities/approval/member-form-variables", - "title": "Member form variables", - "description": "Member-specific form variables that are used to connect integration users to LaunchDarkly members", + "environmentFormVariables": { + "$id": "#/capabilities/approval/environment-form-variables", + "title": "Environment form variables", + "description": "Environment-specific form variables that render on the environment approval settings modal", "type": "array", "items": { "$id": "#/definitions/form-variable", @@ -2220,10 +2111,10 @@ } } }, - "memberListRequest": { - "$id": "#/capabilities/approval/member-list-request", - "title": "Member List Request", - "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", + "postApplyRequest": { + "$id": "#/capabilities/approval/post-apply-request", + "title": "Post Apply Request", + "description": "Describes the HTTP request to make after the changes have been applied in LaunchDarkly", "propertyNames": { "enum": [ "endpoint", @@ -2329,54 +2220,60 @@ ] }, "parser": { - "$id": "#/member-list-parser", - "title": "Member list parser", - "description": "Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer", + "$id": "#/approval-parser", + "title": "Approval parser", + "description": "Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer", "type": "object", - "required": [ - "memberArrayPath", - "memberItems" - ], "propertyNames": { "enum": [ - "memberArrayPath", - "memberItems" + "approvalId", + "statusValue", + "statusDisplay", + "approvalMatcher", + "rejectionMatcher", + "urlTemplate" ] }, + "required": [ + "statusValue", + "approvalMatcher" + ], "properties": { - "memberArrayPath": { - "$id": "#/member-list-parser/member-array-path", - "title": "Member array path", - "description": "JSON path to the array containing integration member details", + "approvalId": { + "$id": "#/approval-parser/approval-id", + "title": "Approval ID pointer", + "description": "Externally-created approval entity ID", "type": "string" }, - "memberItems": { - "$id": "#/member-list-parser/member-items", - "title": "Member items array", - "propertyNames": { - "enum": [ - "email", - "memberId" - ] - }, - "required": [ - "email", - "memberId" - ], - "properties": { - "email": { - "$id": "#/member-list-parser/member-items/email", - "title": "Email", - "description": "Relative JSON path to the email field in each member item in the array", - "type": "string" - }, - "memberId": { - "$id": "#/member-list-parser/member-items/member-id", - "title": "Member ID", - "description": "Relative JSON path to the integration member ID field in each member item in the array", - "type": "string" - } - } + "statusValue": { + "$id": "#/approval-parser/status-value", + "title": "Status Value pointer", + "description": "JSON pointer to a status value", + "type": "string" + }, + "statusDisplay": { + "$id": "#/approval-parser/status-display", + "title": "Status Value display pointer", + "description": "JSON pointer to a human-readable status", + "type": "string" + }, + "approvalMatcher": { + "$id": "#/approval-parser/approval-matcher", + "title": "Approval matcher", + "description": "regex pattern used to determine if the approval should be considered 'approved'", + "type": "string" + }, + "rejectionMatcher": { + "$id": "#/approval-parser/rejection-matcher", + "title": "Rejection matcher", + "description": "regex pattern used to determine if the approval should be considered 'rejected'", + "type": "string" + }, + "urlTemplate": { + "$id": "#/approval-parser/url-template", + "title": "URL template", + "description": "expected format for the external creation request URL. Values can be substituted in using {{value}}", + "type": "string" } } } @@ -2388,11 +2285,13 @@ "description": "Describes the HTTP request for the deletion of the external approval entity", "propertyNames": { "enum": [ - "endpoint" + "endpoint", + "parser" ] }, "required": [ - "endpoint" + "endpoint", + "parser" ], "properties": { "endpoint": { @@ -2487,6 +2386,64 @@ "url", "method" ] + }, + "parser": { + "$id": "#/approval-parser", + "title": "Approval parser", + "description": "Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": [ + "approvalId", + "statusValue", + "statusDisplay", + "approvalMatcher", + "rejectionMatcher", + "urlTemplate" + ] + }, + "required": [ + "statusValue", + "approvalMatcher" + ], + "properties": { + "approvalId": { + "$id": "#/approval-parser/approval-id", + "title": "Approval ID pointer", + "description": "Externally-created approval entity ID", + "type": "string" + }, + "statusValue": { + "$id": "#/approval-parser/status-value", + "title": "Status Value pointer", + "description": "JSON pointer to a status value", + "type": "string" + }, + "statusDisplay": { + "$id": "#/approval-parser/status-display", + "title": "Status Value display pointer", + "description": "JSON pointer to a human-readable status", + "type": "string" + }, + "approvalMatcher": { + "$id": "#/approval-parser/approval-matcher", + "title": "Approval matcher", + "description": "regex pattern used to determine if the approval should be considered 'approved'", + "type": "string" + }, + "rejectionMatcher": { + "$id": "#/approval-parser/rejection-matcher", + "title": "Rejection matcher", + "description": "regex pattern used to determine if the approval should be considered 'rejected'", + "type": "string" + }, + "urlTemplate": { + "$id": "#/approval-parser/url-template", + "title": "URL template", + "description": "expected format for the external creation request URL. Values can be substituted in using {{value}}", + "type": "string" + } + } } } } diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index 0f756460..9b056c35 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -8,20 +8,38 @@ "propertyNames": { "enum": [ "environmentFormVariables", - "memberFormVariables", "creationRequest", "statusRequest", - "memberListRequest", - "deletionRequest" + "postApplyRequest", + "deletionRequest", + "memberListRequest" ] }, "required": [ "creationRequest", "statusRequest", + "postApplyRequest", "deletionRequest", "memberListRequest" ], "properties": { + "memberListRequest": { + "$id": "#/capabilities/approval/member-list-request", + "title": "Member List Request", + "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", + "propertyNames": { + "enum": ["endpoint", "parser"] + }, + "required": ["endpoint", "parser"], + "properties": { + "endpoint": { + "$ref": "../definitions.json#/endpoint" + }, + "parser": { + "$ref": "parser/parser.json#/memberListParser" + } + } + }, "environmentFormVariables": { "$id": "#/capabilities/approval/environment-form-variables", "title": "Environment form variables", @@ -32,16 +50,6 @@ }, "default": [] }, - "memberFormVariables": { - "$id": "#/capabilities/approval/member-form-variables", - "title": "Member form variables", - "description": "Member-specific form variables that are used to connect integration users to LaunchDarkly members", - "type": "array", - "items": { - "$ref": "../definitions.json#/formVariable" - }, - "default": [] - }, "creationRequest": { "$id": "#/capabilities/approval/creation-request", "title": "Creation request", @@ -76,10 +84,10 @@ } } }, - "memberListRequest": { - "$id": "#/capabilities/approval/member-list-request", - "title": "Member List Request", - "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", + "postApplyRequest": { + "$id": "#/capabilities/approval/post-apply-request", + "title": "Post Apply Request", + "description": "Describes the HTTP request to make after the changes have been applied in LaunchDarkly", "propertyNames": { "enum": ["endpoint", "parser"] }, @@ -89,7 +97,7 @@ "$ref": "../definitions.json#/endpoint" }, "parser": { - "$ref": "parser/parser.json#/memberListParser" + "$ref": "parser/parser.json#/approvalParser" } } }, @@ -98,12 +106,15 @@ "title": "Deletion Request", "description": "Describes the HTTP request for the deletion of the external approval entity", "propertyNames": { - "enum": ["endpoint"] + "enum": ["endpoint", "parser"] }, - "required": ["endpoint"], + "required": ["endpoint", "parser"], "properties": { "endpoint": { "$ref": "../definitions.json#/endpoint" + }, + "parser": { + "$ref": "parser/parser.json#/approvalParser" } } } From 2d803bc101130d5b3b634f0d9f2dd0227b3777bb Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 26 Feb 2021 15:15:29 +0100 Subject: [PATCH 392/936] [ch101677] add requested_by to SNow creation requests (#234) * it turns out it's user_name, not sys_id, that we wanted * add requested_by to creation request * pass member id from context Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow --- integrations/servicenow/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 04bf4e40..c98c9cc2 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -47,7 +47,7 @@ ], "creationRequest": { "endpoint": { - "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}&{{#if context.details.plainText}}&justification={{queryEncode context.details.plainText}}{{/if}}", + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}&{{#if context.details.plainText}}&justification={{queryEncode context.details.plainText}}{{/if}}&requested_by={{queryEncode context.member.externalMemberId}}", "method": "POST", "headers": [ { @@ -121,7 +121,7 @@ }, "memberListRequest": { "endpoint": { - "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=email,sys_id", + "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=email,user_name", "method": "GET", "headers": [ { @@ -133,7 +133,7 @@ "parser": { "memberArrayPath": "/result", "memberItems": { - "memberId": "/sys_id", + "memberId": "/user_name", "email": "/email" } } From fcb1bda71f37d1a53e0adecc5790304ac4cdff28 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 5 Mar 2021 17:03:39 +0000 Subject: [PATCH 393/936] Add link to LD approval request to ServiceNow change request (#235) --- integrations/servicenow/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index c98c9cc2..5f38f349 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -47,7 +47,7 @@ ], "creationRequest": { "endpoint": { - "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}&{{#if context.details.plainText}}&justification={{queryEncode context.details.plainText}}{{/if}}&requested_by={{queryEncode context.member.externalMemberId}}", + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}&justification={{queryEncode context._links.approval.href}}{{#if context.details.plainText}}%0A%0A{{queryEncode context.details.plainText}}{{/if}}&requested_by={{queryEncode context.member.externalMemberId}}", "method": "POST", "headers": [ { From 9ca9a1bb8761e07a6452d3396d497d991943c102 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 10 Mar 2021 09:04:14 -0800 Subject: [PATCH 394/936] Minor vscode card updates (#237) --- integrations/vscode/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/vscode/manifest.json b/integrations/vscode/manifest.json index cfdc4d5f..ff411aa7 100644 --- a/integrations/vscode/manifest.json +++ b/integrations/vscode/manifest.json @@ -1,5 +1,5 @@ { - "name": "Visual Studio Code", + "name": "Visual Studio Code (VSCode)", "version": "1.0.0", "overview": "Interact with feature flags from within VSCode.", "description": "With this extension, you'll be able to view feature flag details when you hover over a feature flag key in your source code, autocomplete feature flag keys, and more -- all within VSCode!", @@ -7,7 +7,7 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://marketplace.visualstudio.com/items?itemName=launchdarkly.launchdarkly", + "site": "https://marketplace.visualstudio.com/items?itemName=LaunchDarklyOfficial.launchdarkly", "launchdarklyDocs": "https://docs.launchdarkly.com/docs/visual-studio-code", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, From ad02c2563607ffebe8bf8769845f62273c9ef1ed Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 10 Mar 2021 19:45:55 +0000 Subject: [PATCH 395/936] Fix externalMemberId bug (#239) --- integrations/servicenow/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 5f38f349..a806a8dd 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -47,7 +47,7 @@ ], "creationRequest": { "endpoint": { - "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}&justification={{queryEncode context._links.approval.href}}{{#if context.details.plainText}}%0A%0A{{queryEncode context.details.plainText}}{{/if}}&requested_by={{queryEncode context.member.externalMemberId}}", + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}&justification={{queryEncode context._links.approval.href}}{{#if context.details.plainText}}%0A%0A{{queryEncode context.details.plainText}}{{/if}}&requested_by={{queryEncode context.member.externalId}}", "method": "POST", "headers": [ { From 009e61da89e0c20d568602ffdb8fc4af34d465b2 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 10 Mar 2021 19:47:21 +0000 Subject: [PATCH 396/936] Reject approval requests when change request is in state 4 (#238) --- integrations/servicenow/manifest.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index a806a8dd..a060838f 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -60,8 +60,8 @@ "approvalId": "/result/sys_id/value", "statusValue": "/result/state/value", "statusDisplay": "/result/state/display_value", - "approvalMatcher": "-1", - "rejectionMatcher": "n/a", + "approvalMatcher": "^-1", + "rejectionMatcher": "^4", "urlTemplate": "{{oauth.baseURI}}/change_request.do?sys_id={{queryEncode context.approvalId}}" } }, @@ -79,8 +79,8 @@ "parser": { "statusValue": "/result/state/value", "statusDisplay": "/result/state/display_value", - "approvalMatcher": "-1", - "rejectionMatcher": "n/a" + "approvalMatcher": "^-1", + "rejectionMatcher": "^4" } }, "postApplyRequest": { @@ -97,8 +97,8 @@ "parser": { "statusValue": "/result/state/value", "statusDisplay": "/result/state/display_value", - "approvalMatcher": "-1", - "rejectionMatcher": "n/a" + "approvalMatcher": "^-1", + "rejectionMatcher": "^4" } }, "deletionRequest": { @@ -115,8 +115,8 @@ "parser": { "statusValue": "/result/state/value", "statusDisplay": "/result/state/display_value", - "approvalMatcher": "-1", - "rejectionMatcher": "n/a" + "approvalMatcher": "^-1", + "rejectionMatcher": "^4" } }, "memberListRequest": { From af9306ef9e272092cc32280e0b3ede68eed55d2f Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 11 Mar 2021 14:45:10 +0000 Subject: [PATCH 397/936] Improve servicenow description and sentance case environment form variable name (#240) --- integrations/servicenow/manifest.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index a060838f..b9db9b7e 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -2,11 +2,12 @@ "name": "ServiceNow", "version": "1.0.0", "overview": "Create feature flag change requests in ServiceNow.", - "description": "Create feature flag change requests in ServiceNow.", + "description": "Efficiently comply with company-wide change management policies by embedding LaunchDarkly approvals into existing ServiceNow workflows.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.servicenow.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/servicenow", "privacyPolicy": "https://www.servicenow.com/privacy-statement.html" }, "categories": ["approval"], @@ -21,7 +22,7 @@ "environmentFormVariables": [ { "key": "template", - "name": "Standard Change Template", + "name": "Standard change template", "description": "The standard change template to be utilized for all flag changes in this environment.", "type": "dynamicEnum", "dynamicOptions": { From dac9c352ef44eab93514659deda6c31a5a512193 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 12 Mar 2021 15:43:35 +0000 Subject: [PATCH 398/936] [ch102661] Improve serveral horizontal icons (#241) --- .../onelogin/assets/images/horizontal.svg | 33 +++---------------- .../segment/assets/images/horizontal.svg | 25 ++++++++++++++ integrations/segment/manifest.json | 2 +- .../servicenow/assets/images/logo_square.svg | 4 --- .../assets/images/servicenow-horizontal.svg | 1 + .../assets/images/servicenow-rectangle.svg | 5 --- integrations/servicenow/manifest.json | 2 +- .../sleuth/assets/images/horizontal.svg | 9 +++++ .../assets/images/logo_new_logo_dark.svg | 1 - .../assets/images/logo_new_logo_symbol.svg | 1 - integrations/sleuth/assets/images/square.svg | 5 +++ integrations/sleuth/manifest.json | 4 +-- 12 files changed, 49 insertions(+), 43 deletions(-) mode change 100755 => 100644 integrations/onelogin/assets/images/horizontal.svg create mode 100644 integrations/segment/assets/images/horizontal.svg delete mode 100644 integrations/servicenow/assets/images/logo_square.svg create mode 100644 integrations/servicenow/assets/images/servicenow-horizontal.svg delete mode 100644 integrations/servicenow/assets/images/servicenow-rectangle.svg create mode 100644 integrations/sleuth/assets/images/horizontal.svg delete mode 100644 integrations/sleuth/assets/images/logo_new_logo_dark.svg delete mode 100644 integrations/sleuth/assets/images/logo_new_logo_symbol.svg create mode 100644 integrations/sleuth/assets/images/square.svg diff --git a/integrations/onelogin/assets/images/horizontal.svg b/integrations/onelogin/assets/images/horizontal.svg old mode 100755 new mode 100644 index 9877b25c..a786786d --- a/integrations/onelogin/assets/images/horizontal.svg +++ b/integrations/onelogin/assets/images/horizontal.svg @@ -1,28 +1,5 @@ - - - - - - + + + + + diff --git a/integrations/segment/assets/images/horizontal.svg b/integrations/segment/assets/images/horizontal.svg new file mode 100644 index 00000000..1949c758 --- /dev/null +++ b/integrations/segment/assets/images/horizontal.svg @@ -0,0 +1,25 @@ + + + + +2019_SegmentLogo_Horizontal + + + + + + + + + + + + + + + + + + diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json index e963db0a..f32c3153 100644 --- a/integrations/segment/manifest.json +++ b/integrations/segment/manifest.json @@ -14,7 +14,7 @@ "categories": ["data"], "icons": { "square": "assets/images/square.svg", - "horizontal": "assets/images/square.svg" + "horizontal": "assets/images/horizontal.svg" }, "legacy": { "kind": "dataExport" diff --git a/integrations/servicenow/assets/images/logo_square.svg b/integrations/servicenow/assets/images/logo_square.svg deleted file mode 100644 index 799ca37f..00000000 --- a/integrations/servicenow/assets/images/logo_square.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/integrations/servicenow/assets/images/servicenow-horizontal.svg b/integrations/servicenow/assets/images/servicenow-horizontal.svg new file mode 100644 index 00000000..4c76a79d --- /dev/null +++ b/integrations/servicenow/assets/images/servicenow-horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/servicenow/assets/images/servicenow-rectangle.svg b/integrations/servicenow/assets/images/servicenow-rectangle.svg deleted file mode 100644 index 35828a89..00000000 --- a/integrations/servicenow/assets/images/servicenow-rectangle.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index b9db9b7e..f1890ede 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -13,7 +13,7 @@ "categories": ["approval"], "icons": { "square": "assets/images/servicenow-icon.svg", - "horizontal": "assets/images/servicenow-rectangle.svg" + "horizontal": "assets/images/servicenow-horizontal.svg" }, "requiresOAuth": true, "formVariables": [], diff --git a/integrations/sleuth/assets/images/horizontal.svg b/integrations/sleuth/assets/images/horizontal.svg new file mode 100644 index 00000000..2b119c4e --- /dev/null +++ b/integrations/sleuth/assets/images/horizontal.svg @@ -0,0 +1,9 @@ + + + 1-color / sleuth + + + + + + diff --git a/integrations/sleuth/assets/images/logo_new_logo_dark.svg b/integrations/sleuth/assets/images/logo_new_logo_dark.svg deleted file mode 100644 index 2f7a6aff..00000000 --- a/integrations/sleuth/assets/images/logo_new_logo_dark.svg +++ /dev/null @@ -1 +0,0 @@ -logo_new diff --git a/integrations/sleuth/assets/images/logo_new_logo_symbol.svg b/integrations/sleuth/assets/images/logo_new_logo_symbol.svg deleted file mode 100644 index bf29154d..00000000 --- a/integrations/sleuth/assets/images/logo_new_logo_symbol.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/sleuth/assets/images/square.svg b/integrations/sleuth/assets/images/square.svg new file mode 100644 index 00000000..9147ef8c --- /dev/null +++ b/integrations/sleuth/assets/images/square.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/sleuth/manifest.json b/integrations/sleuth/manifest.json index d450bf25..2bb646f1 100644 --- a/integrations/sleuth/manifest.json +++ b/integrations/sleuth/manifest.json @@ -13,7 +13,7 @@ }, "categories": ["monitoring"], "icons": { - "square": "assets/images/logo_new_logo_symbol.svg", - "horizontal": "assets/images/logo_new_logo_dark.svg" + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" } } From eeb25d1f0b48f7f62da453f351a05c99eb0ee6b0 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 15 Mar 2021 10:09:20 +0000 Subject: [PATCH 399/936] Route staging deploys through Thumb Seeker (#242) --- scripts/send_webhook.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/send_webhook.sh b/scripts/send_webhook.sh index 0592ebb2..8c50cdcf 100755 --- a/scripts/send_webhook.sh +++ b/scripts/send_webhook.sh @@ -5,10 +5,13 @@ REV=$(git rev-parse HEAD | cut -c1-8) generate_post_data=$(cat < Date: Thu, 18 Mar 2021 15:11:18 -0400 Subject: [PATCH 400/936] add IntelliJ card (#236) --- .../intellij/assets/images/square.svg | 62 +++++++++++++++++++ integrations/intellij/manifest.json | 19 ++++++ 2 files changed, 81 insertions(+) create mode 100644 integrations/intellij/assets/images/square.svg create mode 100644 integrations/intellij/manifest.json diff --git a/integrations/intellij/assets/images/square.svg b/integrations/intellij/assets/images/square.svg new file mode 100644 index 00000000..965507cb --- /dev/null +++ b/integrations/intellij/assets/images/square.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/intellij/manifest.json b/integrations/intellij/manifest.json new file mode 100644 index 00000000..dc2c24bb --- /dev/null +++ b/integrations/intellij/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "IntelliJ", + "version": "1.0.0", + "overview": "Interact with feature flags from within IntelliJ-based IDEs.", + "description": "With this plugin, you'll be able to view feature flag details when you hover over a feature flag key in your source code, view all of your flags in a tool window and more -- all within IntelliJ!", + "details": "IntelliJ is a platform developed by JetBrains for IDEs and language-aware developer tools. Interact with feature flags from within IntelliJ.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://plugins.jetbrains.com/plugin/15159-launchdarkly", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/intellij", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["developer-tools"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + } +} From 7ffd073b93512b397de79afb74fa87fe2c83d043 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 25 Mar 2021 10:49:35 +0100 Subject: [PATCH 401/936] [ch103605] remove external condition (#243) * remove external condition * remove tests --- __tests__/validateExternalCondition.js | 71 --- integrations/sample-integration/manifest.json | 20 - manifest.schema.d.ts | 94 +--- manifest.schema.json | 417 ------------------ schemas/base.json | 4 - schemas/capabilities/externalCondition.json | 77 ---- schemas/capabilities/parser/parser.json | 66 --- 7 files changed, 2 insertions(+), 747 deletions(-) delete mode 100644 __tests__/validateExternalCondition.js delete mode 100644 schemas/capabilities/externalCondition.json diff --git a/__tests__/validateExternalCondition.js b/__tests__/validateExternalCondition.js deleted file mode 100644 index 85c19663..00000000 --- a/__tests__/validateExternalCondition.js +++ /dev/null @@ -1,71 +0,0 @@ -const { readdirSync, existsSync, readFileSync } = require('fs'); -const _ = require('lodash'); -const jsonpointer = require('jsonpointer'); - -const getDirectories = source => - readdirSync(source, { withFileTypes: true }) - .filter(dir => dir.isDirectory()) - .map(dir => dir.name); - -let manifests = []; - -const integrationDirs = getDirectories('integrations'); -integrationDirs.forEach(dir => { - const manifest = require(`../integrations/${dir}/manifest.json`); - manifests.push([dir, manifest]); -}); - -externalConditionManifests = manifests.filter(manifest => { - return _.get(manifest[1], 'capabilities.externalCondition', null) !== null; -}); - -describe('All externalCondition integrations', () => { - test.each(externalConditionManifests)( - 'Validate %s externalCondition', - (key, manifest) => { - // Validate creation parser is defined - const creationParser = _.get( - manifest, - 'capabilities.externalCondition.creation.parser', - undefined - ); - expect( - creationParser, - `${key}: creation parser must be defined` - ).toBeDefined(); - - // Validate sample response exists and matches up with the parser - const sampleResponsePath = _.get( - manifest, - 'capabilities.externalCondition.creation.sampleResponse', - undefined - ); - const fullResponsePath = `./integrations/${key}/${sampleResponsePath}`; - expect( - existsSync(fullResponsePath), - `${key}: sample response file must exist` - ).toBe(true); - - const sampleResponse = require('.' + fullResponsePath); - _.forIn(creationParser, (pointer, k) => { - responseValue = jsonpointer.get(sampleResponse, pointer); - expect( - responseValue, - `${key}: ${k} pointer ${pointer} must point to a value in the sample response` - ).toBeDefined(); - }); - - // Validate the template path is correct - const templatePath = _.get( - manifest, - 'capabilities.externalCondition.creation.template', - undefined - ); - const fullTemplatePath = `./integrations/${key}/${templatePath}`; - expect( - existsSync(fullTemplatePath), - `${key}: creation template file must exist` - ).toBe(true); - } - ); -}); diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index c8edbc09..10efe6ef 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -117,26 +117,6 @@ "actions": ["*"] } ] - }, - "externalCondition": { - "creation": { - "endpoint": { - "url": "https://example.com/create-condition", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - } - ] - }, - "template": "templates/ticket-creation-request.json.hbs", - "parser": { - "id": "/id", - "url": "/links/self/href" - }, - "sampleResponse": "sample-responses/ticket-creation.json" - } } } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 4bbbf4d0..cd065ce9 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -295,30 +295,6 @@ export type ReservedCustomProperties = { key: Key1; [k: string]: unknown; }[]; -/** - * Relative path to template used to render external condition creation request body - */ -export type CreationTemplate = string; -/** - * JSON Pointer to external condition ID - */ -export type IDPointer = string; -/** - * JSON pointer to external condition url - */ -export type URLPointer = string; -/** - * JSON pointer to condition status - */ -export type StatusPointer = string; -/** - * regex pattern used to determine if the response should be considered 'complete' - */ -export type CompletionMatcher = string; -/** - * relative path to sample JSON formatted sample successful response - */ -export type SampleResponse = string; /** * URL to documentation describing how to configure the integration. */ @@ -346,7 +322,7 @@ export type ValuePointer = string; /** * JSON pointer to the external alert URL */ -export type URLPointer1 = string; +export type URLPointer = string; /** * JSON path to the array containing integration member details */ @@ -493,7 +469,6 @@ export interface OptionsArray { export interface Capabilities { auditLogEventsHook?: AuditLogEventsHook; reservedCustomProperties?: ReservedCustomProperties; - externalCondition?: ExternalCondition; trigger?: Trigger; approval?: Approval; [k: string]: unknown; @@ -529,71 +504,6 @@ export interface Policy { resources?: Resources; [k: string]: unknown; } -/** - * This capability is used to manage external feature workflow conditions - */ -export interface ExternalCondition { - creation: Creation; - pollingUpdate?: PollingUpdate; - [k: string]: unknown; -} -/** - * Properties that describe a request to an integration-controlled API endpoint to establish the external condition - */ -export interface Creation { - endpoint: CreationEndpoint; - template: CreationTemplate; - parser: ResponseParser; - [k: string]: unknown; -} -/** - * Properties that describe the HTTP endpoint LaunchDarkly will use to create an external condition - */ -export interface CreationEndpoint { - url: URL; - method: HTTPMethod; - headers?: HTTPHeaders; - [k: string]: unknown; -} -/** - * Describes a mapping of property name to a location in the JSON response specified by a JSON pointer - */ -export interface ResponseParser { - id: IDPointer; - url: URLPointer; - status?: StatusParser; - validation?: Validation; - [k: string]: unknown; -} -export interface StatusParser { - pointer: StatusPointer; - completionMatcher: CompletionMatcher; - [k: string]: unknown; -} -/** - * Validation helpers (only used for testing) - */ -export interface Validation { - sampleResponse: SampleResponse; - [k: string]: unknown; -} -/** - * Properties that describe a polling request to get the status of the external condition - */ -export interface PollingUpdate { - endpoint: PollingUpdateEndpoint; - parser: ResponseParser; - [k: string]: unknown; -} -/** - * Properties that describe the HTTP endpoint LaunchDarkly will use to get the status of an external condition via polling - */ -export interface PollingUpdateEndpoint { - url: URL; - method: HTTPMethod; - headers?: HTTPHeaders; - [k: string]: unknown; -} /** * This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly */ @@ -611,7 +521,7 @@ export interface Trigger { export interface TriggerParser { eventName?: EventNamePointer; value?: ValuePointer; - url?: URLPointer1; + url?: URLPointer; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index 54a9f9e2..654790fd 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -516,7 +516,6 @@ "enum": [ "auditLogEventsHook", "reservedCustomProperties", - "externalCondition", "trigger", "approval" ] @@ -819,422 +818,6 @@ "minLength": 1, "maxLength": 3 }, - "externalCondition": { - "$id": "#/properties/capability/external-condition", - "title": "External condition", - "description": "This capability is used to manage external feature workflow conditions", - "type": "object", - "propertyNames": { - "enum": [ - "creation", - "pollingUpdate" - ] - }, - "required": [ - "creation" - ], - "properties": { - "creation": { - "$id": "#/properties/capability/external-condition/creation", - "title": "Creation", - "description": "Properties that describe a request to an integration-controlled API endpoint to establish the external condition", - "type": "object", - "propertyNames": { - "enum": [ - "endpoint", - "template", - "parser", - "sampleResponse" - ] - }, - "required": [ - "endpoint", - "template", - "parser" - ], - "properties": { - "endpoint": { - "$id": "#/properties/capability/external-condition/creation/endpoint", - "title": "Creation endpoint", - "description": "Properties that describe the HTTP endpoint LaunchDarkly will use to create an external condition", - "type": "object", - "propertyNames": { - "enum": [ - "url", - "method", - "headers" - ] - }, - "properties": { - "url": { - "$id": "#/definitions/endpoint/url", - "title": "URL", - "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." - }, - "method": { - "$id": "#/definitions/endpoint/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": [ - "POST", - "PUT", - "PATCH", - "GET", - "DELETE" - ], - "type": "string" - }, - "headers": { - "$id": "#/definitions/endpoint/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/definitions/endpoint/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": [ - "name", - "value" - ] - }, - "properties": { - "name": { - "$id": "#/definitions/endpoint/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/definitions/endpoint/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": [ - "name", - "value" - ] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 - } - }, - "required": [ - "url", - "method" - ] - }, - "template": { - "$id": "#/properties/capability/external-condition/creation/template", - "title": "Creation template", - "description": "Relative path to template used to render external condition creation request body", - "type": "string" - }, - "parser": { - "$id": "#/external-condition-parser", - "title": "Response parser", - "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", - "type": "object", - "propertyNames": { - "enum": [ - "id", - "url", - "status", - "validation" - ] - }, - "properties": { - "id": { - "$id": "#/properties/id", - "title": "ID pointer", - "description": "JSON Pointer to external condition ID", - "type": "string" - }, - "url": { - "$id": "#/properties/url", - "title": "URL pointer", - "description": "JSON pointer to external condition url", - "type": "string" - }, - "status": { - "$id": "#/properties/status", - "title": "Status parser", - "type": "object", - "propertyNames": { - "enum": [ - "pointer", - "completionMatcher" - ] - }, - "required": [ - "pointer", - "completionMatcher" - ], - "properties": { - "pointer": { - "$id": "#/properties/status/pointer", - "title": "Status pointer", - "description": "JSON pointer to condition status", - "type": "string" - }, - "completionMatcher": { - "$id": "#/properties/status/completion-matcher", - "title": "Completion matcher", - "description": "regex pattern used to determine if the response should be considered 'complete'", - "type": "string" - } - } - }, - "validation": { - "$id": "#/properties/validation", - "title": "Validation", - "description": "Validation helpers (only used for testing)", - "type": "object", - "propertyNames": { - "enum": [ - "sampleResponse" - ] - }, - "required": [ - "sampleResponse" - ], - "properties": { - "sampleResponse": { - "$id": "#/properties/validation/sample-response", - "title": "Sample response", - "description": "relative path to sample JSON formatted sample successful response", - "type": "string", - "pattern": ".*\\.json$" - } - } - } - }, - "required": [ - "id", - "url" - ] - } - } - }, - "pollingUpdate": { - "$id": "#/properties/capability/external-condition/polling-update", - "title": "Polling Update", - "description": "Properties that describe a polling request to get the status of the external condition", - "type": "object", - "propertyNames": { - "enum": [ - "endpoint", - "parser" - ] - }, - "required": [ - "endpoint", - "parser" - ], - "properties": { - "endpoint": { - "$id": "#/properties/capability/external-condition/polling-update/endpoint", - "title": "Polling update endpoint", - "description": "Properties that describe the HTTP endpoint LaunchDarkly will use to get the status of an external condition via polling", - "type": "object", - "propertyNames": { - "enum": [ - "url", - "method", - "headers" - ] - }, - "required": [ - "url", - "method" - ], - "properties": { - "url": { - "$id": "#/definitions/endpoint/url", - "title": "URL", - "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." - }, - "method": { - "$id": "#/definitions/endpoint/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": [ - "POST", - "PUT", - "PATCH", - "GET", - "DELETE" - ], - "type": "string" - }, - "headers": { - "$id": "#/definitions/endpoint/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/definitions/endpoint/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": [ - "name", - "value" - ] - }, - "properties": { - "name": { - "$id": "#/definitions/endpoint/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/definitions/endpoint/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": [ - "name", - "value" - ] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 - } - } - }, - "parser": { - "$id": "#/external-condition-parser", - "title": "Response parser", - "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", - "type": "object", - "propertyNames": { - "enum": [ - "id", - "url", - "status", - "validation" - ] - }, - "properties": { - "id": { - "$id": "#/properties/id", - "title": "ID pointer", - "description": "JSON Pointer to external condition ID", - "type": "string" - }, - "url": { - "$id": "#/properties/url", - "title": "URL pointer", - "description": "JSON pointer to external condition url", - "type": "string" - }, - "status": { - "$id": "#/properties/status", - "title": "Status parser", - "type": "object", - "propertyNames": { - "enum": [ - "pointer", - "completionMatcher" - ] - }, - "required": [ - "pointer", - "completionMatcher" - ], - "properties": { - "pointer": { - "$id": "#/properties/status/pointer", - "title": "Status pointer", - "description": "JSON pointer to condition status", - "type": "string" - }, - "completionMatcher": { - "$id": "#/properties/status/completion-matcher", - "title": "Completion matcher", - "description": "regex pattern used to determine if the response should be considered 'complete'", - "type": "string" - } - } - }, - "validation": { - "$id": "#/properties/validation", - "title": "Validation", - "description": "Validation helpers (only used for testing)", - "type": "object", - "propertyNames": { - "enum": [ - "sampleResponse" - ] - }, - "required": [ - "sampleResponse" - ], - "properties": { - "sampleResponse": { - "$id": "#/properties/validation/sample-response", - "title": "Sample response", - "description": "relative path to sample JSON formatted sample successful response", - "type": "string", - "pattern": ".*\\.json$" - } - } - } - }, - "required": [ - "id", - "url" - ] - } - } - } - } - }, "trigger": { "$id": "#/properties/capability/trigger", "title": "Trigger", diff --git a/schemas/base.json b/schemas/base.json index bc1436dc..56b28875 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -232,7 +232,6 @@ "enum": [ "auditLogEventsHook", "reservedCustomProperties", - "externalCondition", "trigger", "approval" ] @@ -244,9 +243,6 @@ "reservedCustomProperties": { "$ref": "schemas/capabilities/reservedCustomProperties.json#/reservedCustomProperties" }, - "externalCondition": { - "$ref": "schemas/capabilities/externalCondition.json#/externalCondition" - }, "trigger": { "$ref": "schemas/capabilities/trigger.json#/trigger" }, diff --git a/schemas/capabilities/externalCondition.json b/schemas/capabilities/externalCondition.json deleted file mode 100644 index c82ee25a..00000000 --- a/schemas/capabilities/externalCondition.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "externalCondition": { - "$id": "#/properties/capability/external-condition", - "title": "External condition", - "description": "This capability is used to manage external feature workflow conditions", - "type": "object", - "propertyNames": { - "enum": ["creation", "pollingUpdate"] - }, - "required": ["creation"], - "properties": { - "creation": { - "$id": "#/properties/capability/external-condition/creation", - "title": "Creation", - "description": "Properties that describe a request to an integration-controlled API endpoint to establish the external condition", - "type": "object", - "propertyNames": { - "enum": ["endpoint", "template", "parser", "sampleResponse"] - }, - "required": ["endpoint", "template", "parser"], - "properties": { - "endpoint": { - "$id": "#/properties/capability/external-condition/creation/endpoint", - "title": "Creation endpoint", - "description": "Properties that describe the HTTP endpoint LaunchDarkly will use to create an external condition", - "type": "object", - "propertyNames": { - "enum": ["url", "method", "headers"] - }, - "properties": { - "$ref": "../definitions.json#/endpointProperties" - }, - "required": ["url", "method"] - }, - "template": { - "$id": "#/properties/capability/external-condition/creation/template", - "title": "Creation template", - "description": "Relative path to template used to render external condition creation request body", - "type": "string" - }, - "parser": { - "$ref": "parser/parser.json#/externalConditionParser" - } - } - }, - "pollingUpdate": { - "$id": "#/properties/capability/external-condition/polling-update", - "title": "Polling Update", - "description": "Properties that describe a polling request to get the status of the external condition", - "type": "object", - "propertyNames": { - "enum": ["endpoint", "parser"] - }, - "required": ["endpoint", "parser"], - "properties": { - "endpoint": { - "$id": "#/properties/capability/external-condition/polling-update/endpoint", - "title": "Polling update endpoint", - "description": "Properties that describe the HTTP endpoint LaunchDarkly will use to get the status of an external condition via polling", - "type": "object", - "propertyNames": { - "enum": ["url", "method", "headers"] - }, - "required": ["url", "method"], - "properties": { - "$ref": "../definitions.json#/endpointProperties" - } - }, - "parser": { - "$ref": "parser/parser.json#/externalConditionParser" - } - } - } - } - } -} diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index 145c8342..0b804a6b 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -1,71 +1,5 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "externalConditionParser": { - "$id": "#/external-condition-parser", - "title": "Response parser", - "description": "Describes a mapping of property name to a location in the JSON response specified by a JSON pointer", - "type": "object", - "propertyNames": { - "enum": ["id", "url", "status", "validation"] - }, - "properties": { - "id": { - "$id": "#/properties/id", - "title": "ID pointer", - "description": "JSON Pointer to external condition ID", - "type": "string" - }, - "url": { - "$id": "#/properties/url", - "title": "URL pointer", - "description": "JSON pointer to external condition url", - "type": "string" - }, - "status": { - "$id": "#/properties/status", - "title": "Status parser", - "type": "object", - "propertyNames": { - "enum": ["pointer", "completionMatcher"] - }, - "required": ["pointer", "completionMatcher"], - "properties": { - "pointer": { - "$id": "#/properties/status/pointer", - "title": "Status pointer", - "description": "JSON pointer to condition status", - "type": "string" - }, - "completionMatcher": { - "$id": "#/properties/status/completion-matcher", - "title": "Completion matcher", - "description": "regex pattern used to determine if the response should be considered 'complete'", - "type": "string" - } - } - }, - "validation": { - "$id": "#/properties/validation", - "title": "Validation", - "description": "Validation helpers (only used for testing)", - "type": "object", - "propertyNames": { - "enum": ["sampleResponse"] - }, - "required": ["sampleResponse"], - "properties": { - "sampleResponse": { - "$id": "#/properties/validation/sample-response", - "title": "Sample response", - "description": "relative path to sample JSON formatted sample successful response", - "type": "string", - "pattern": ".*\\.json$" - } - } - } - }, - "required": ["id", "url"] - }, "triggerParser": { "$id": "#/trigger-parser", "title": "Trigger parser", From aada6df49852b542af5502259fd28fd256f45c38 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 25 Mar 2021 14:23:02 +0100 Subject: [PATCH 402/936] [ch103708] add otherCapabilities array to phase out legacy kind (#244) * replace legacy with externalCapabilities * everything at once for pre commits * add sso and ide capabilities * categorize sso and ide integrations * add legacy back in + external and externalEnterprise capabilities * remove slackWebhooks from externalCapabilities * add legacy back in to manifests * add test to enforce at least one capability * remove externalEnterprise * change external to other * add minItems to enforce --- __tests__/validateIntegrationManifests.js | 12 ++++++++++++ integrations/adfs/manifest.json | 3 ++- integrations/ansible/manifest.json | 3 ++- integrations/azure-devops/manifest.json | 3 ++- integrations/azure-event-hubs/manifest.json | 3 ++- integrations/azure-sso/manifest.json | 3 ++- integrations/bitbucket-flags/manifest.json | 3 ++- integrations/bitbucket/manifest.json | 3 ++- integrations/circleci-coderefs/manifest.json | 3 ++- integrations/datadog-legacy/manifest.json | 3 ++- integrations/git/manifest.json | 3 ++- integrations/github/manifest.json | 3 ++- integrations/gitlab-coderefs/manifest.json | 3 ++- integrations/google-pubsub/manifest.json | 3 ++- integrations/googleapps-sso/manifest.json | 3 ++- integrations/heap/manifest.json | 3 ++- integrations/intellij/manifest.json | 3 ++- integrations/jira/manifest.json | 3 ++- integrations/kinesis/manifest.json | 3 ++- integrations/mparticle/manifest.json | 3 ++- integrations/okta/manifest.json | 3 ++- integrations/onelogin/manifest.json | 3 ++- integrations/pendo/manifest.json | 3 ++- integrations/release/manifest.json | 3 ++- integrations/segment/manifest.json | 3 ++- integrations/slack-app/manifest.json | 3 ++- integrations/slack-webhooks/manifest.json | 3 ++- integrations/sleuth/manifest.json | 3 ++- integrations/terraform/manifest.json | 3 ++- integrations/tray/manifest.json | 3 ++- integrations/trello/manifest.json | 3 ++- integrations/vscode/manifest.json | 3 ++- integrations/webhooks/manifest.json | 3 ++- manifest.schema.d.ts | 8 ++++++++ manifest.schema.json | 19 +++++++++++++++++++ schemas/base.json | 12 ++++++++++++ 36 files changed, 115 insertions(+), 32 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index d3ce2432..2a6929da 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -232,6 +232,18 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'at least one externalCapability has been defined if no manifest capabilities for %s', + (key, manifest) => { + const capabilities = _.get(manifest, 'capabilities', null); + if (!capabilities) { + const otherCapabilities = _.get(manifest, 'otherCapabilities', null); + expect(otherCapabilities).not.toBeNull(); + expect(otherCapabilities.length).toBeGreaterThan(0); + } + } + ); + test.each(manifests)( 'Templates can be successfully rendered for %s', (key, manifest) => { diff --git a/integrations/adfs/manifest.json b/integrations/adfs/manifest.json index c76908fc..cd4c0ba4 100644 --- a/integrations/adfs/manifest.json +++ b/integrations/adfs/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["sso"] } diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json index abc6771a..5d0ff492 100644 --- a/integrations/ansible/manifest.json +++ b/integrations/ansible/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/square.svg", "horizontal": "assets/horizontal.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/azure-devops/manifest.json b/integrations/azure-devops/manifest.json index 2fef2ae4..3bef8d6d 100644 --- a/integrations/azure-devops/manifest.json +++ b/integrations/azure-devops/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/azure-event-hubs/manifest.json b/integrations/azure-event-hubs/manifest.json index 951077c6..03c688b8 100644 --- a/integrations/azure-event-hubs/manifest.json +++ b/integrations/azure-event-hubs/manifest.json @@ -17,5 +17,6 @@ }, "legacy": { "kind": "dataExport" - } + }, + "otherCapabilities": ["dataExport"] } diff --git a/integrations/azure-sso/manifest.json b/integrations/azure-sso/manifest.json index 6110c4ae..5210a0be 100644 --- a/integrations/azure-sso/manifest.json +++ b/integrations/azure-sso/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["sso"] } diff --git a/integrations/bitbucket-flags/manifest.json b/integrations/bitbucket-flags/manifest.json index 351b234d..f73bec19 100644 --- a/integrations/bitbucket-flags/manifest.json +++ b/integrations/bitbucket-flags/manifest.json @@ -16,5 +16,6 @@ "icons": { "square": "assets/images/bitbucket_square.svg", "horizontal": "assets/images/bitbucket_horizontal.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json index 00f71778..52f76eba 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket/manifest.json @@ -18,5 +18,6 @@ }, "legacy": { "kind": "codeRefs" - } + }, + "otherCapabilities": ["codeRefs"] } diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json index 682ebf0a..d27a7e38 100644 --- a/integrations/circleci-coderefs/manifest.json +++ b/integrations/circleci-coderefs/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["codeRefs"] } diff --git a/integrations/datadog-legacy/manifest.json b/integrations/datadog-legacy/manifest.json index 234efcc3..c279c06a 100644 --- a/integrations/datadog-legacy/manifest.json +++ b/integrations/datadog-legacy/manifest.json @@ -17,5 +17,6 @@ }, "legacy": { "kind": "datadog" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json index a5b5b9ac..c8e292a9 100644 --- a/integrations/git/manifest.json +++ b/integrations/git/manifest.json @@ -18,5 +18,6 @@ }, "legacy": { "kind": "codeRefs" - } + }, + "otherCapabilities": ["codeRefs"] } diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index b0744fae..85c933a9 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -18,5 +18,6 @@ }, "legacy": { "kind": "codeRefs" - } + }, + "otherCapabilities": ["codeRefs"] } diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab-coderefs/manifest.json index bfd03c09..4e07e09d 100644 --- a/integrations/gitlab-coderefs/manifest.json +++ b/integrations/gitlab-coderefs/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["codeRefs"] } diff --git a/integrations/google-pubsub/manifest.json b/integrations/google-pubsub/manifest.json index 4aa566d9..712ee696 100644 --- a/integrations/google-pubsub/manifest.json +++ b/integrations/google-pubsub/manifest.json @@ -17,5 +17,6 @@ }, "legacy": { "kind": "dataExport" - } + }, + "otherCapabilities": ["dataExport"] } diff --git a/integrations/googleapps-sso/manifest.json b/integrations/googleapps-sso/manifest.json index b0c434bd..22a04ea1 100644 --- a/integrations/googleapps-sso/manifest.json +++ b/integrations/googleapps-sso/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["sso"] } diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index 2e344fc4..7838e1d5 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -16,5 +16,6 @@ "icons": { "square": "assets/images/heapanalytics-square.svg", "horizontal": "assets/images/heapanalytics-rect.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/intellij/manifest.json b/integrations/intellij/manifest.json index dc2c24bb..805826f2 100644 --- a/integrations/intellij/manifest.json +++ b/integrations/intellij/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" - } + }, + "otherCapabilities": ["ide"] } diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 11292301..76fea4df 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/kinesis/manifest.json b/integrations/kinesis/manifest.json index 342112ad..c85f652b 100644 --- a/integrations/kinesis/manifest.json +++ b/integrations/kinesis/manifest.json @@ -17,5 +17,6 @@ }, "legacy": { "kind": "dataExport" - } + }, + "otherCapabilities": ["dataExport"] } diff --git a/integrations/mparticle/manifest.json b/integrations/mparticle/manifest.json index 71092482..afe3d426 100644 --- a/integrations/mparticle/manifest.json +++ b/integrations/mparticle/manifest.json @@ -17,5 +17,6 @@ }, "legacy": { "kind": "dataExport" - } + }, + "otherCapabilities": ["dataExport"] } diff --git a/integrations/okta/manifest.json b/integrations/okta/manifest.json index 5127bd1f..beff4bce 100644 --- a/integrations/okta/manifest.json +++ b/integrations/okta/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["sso"] } diff --git a/integrations/onelogin/manifest.json b/integrations/onelogin/manifest.json index a38392a8..ea93daee 100644 --- a/integrations/onelogin/manifest.json +++ b/integrations/onelogin/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["sso"] } diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index 6a14f90e..861dec2a 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/pendo_square.svg", "horizontal": "assets/images/pendo_horizontal.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/release/manifest.json b/integrations/release/manifest.json index c4be642d..ac3cd3bd 100644 --- a/integrations/release/manifest.json +++ b/integrations/release/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json index f32c3153..eaaad783 100644 --- a/integrations/segment/manifest.json +++ b/integrations/segment/manifest.json @@ -18,5 +18,6 @@ }, "legacy": { "kind": "dataExport" - } + }, + "otherCapabilities": ["dataExport"] } diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index 882ca244..e4800bee 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -17,5 +17,6 @@ }, "legacy": { "kind": "webhooks" - } + }, + "otherCapabilities": ["webhooks"] } diff --git a/integrations/slack-webhooks/manifest.json b/integrations/slack-webhooks/manifest.json index d82f0f95..f6d522cc 100644 --- a/integrations/slack-webhooks/manifest.json +++ b/integrations/slack-webhooks/manifest.json @@ -17,5 +17,6 @@ }, "legacy": { "kind": "slackWebhooks" - } + }, + "otherCapabilities": ["webhooks"] } diff --git a/integrations/sleuth/manifest.json b/integrations/sleuth/manifest.json index 2bb646f1..7fdac695 100644 --- a/integrations/sleuth/manifest.json +++ b/integrations/sleuth/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index 17b37e6c..b876e556 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -16,5 +16,6 @@ "icons": { "square": "assets/images/terraform_square.svg", "horizontal": "assets/images/terraform_horizontal.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/tray/manifest.json b/integrations/tray/manifest.json index 13742566..6a811e0b 100644 --- a/integrations/tray/manifest.json +++ b/integrations/tray/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index 5b544dce..b03f54a3 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -13,5 +13,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["external"] } diff --git a/integrations/vscode/manifest.json b/integrations/vscode/manifest.json index ff411aa7..317dc795 100644 --- a/integrations/vscode/manifest.json +++ b/integrations/vscode/manifest.json @@ -15,5 +15,6 @@ "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" - } + }, + "otherCapabilities": ["ide"] } diff --git a/integrations/webhooks/manifest.json b/integrations/webhooks/manifest.json index 523667c0..a2ce754e 100644 --- a/integrations/webhooks/manifest.json +++ b/integrations/webhooks/manifest.json @@ -17,5 +17,6 @@ }, "legacy": { "kind": "webhooks" - } + }, + "otherCapabilities": ["webhooks"] } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index cd065ce9..0a770ce7 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -159,6 +159,13 @@ export type HorizontalLogo = string; * Kind of legacy integration */ export type Kind = "codeRefs" | "datadog" | "dataExport" | "slackWebhooks" | "webhooks"; +/** + * Capabilities not configured by manifests + */ +export type OtherCapabilities = [ + "codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks", + ...("codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks")[] +]; /** * Whether the integration authenticates using OAuth */ @@ -379,6 +386,7 @@ export interface LaunchDarklyIntegrationsManifest { categories: Categories; icons: Icons; legacy?: Legacy; + otherCapabilities?: OtherCapabilities; requiresOAuth?: RequiresOAuth; formVariables?: FormVariables; capabilities?: Capabilities; diff --git a/manifest.schema.json b/manifest.schema.json index 654790fd..3160dbc0 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -19,6 +19,7 @@ "formVariables", "capabilities", "legacy", + "otherCapabilities", "requiresOAuth" ] }, @@ -228,6 +229,24 @@ "kind" ] }, + "otherCapabilities": { + "$id": "#/properties/other-capabilities", + "title": "Other capabilities", + "description": "Capabilities not configured by manifests", + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "enum": [ + "codeRefs", + "dataExport", + "external", + "ide", + "sso", + "webhooks" + ] + } + }, "requiresOAuth": { "$id": "#/properties/requires-oauth", "title": "Requires OAuth", diff --git a/schemas/base.json b/schemas/base.json index 56b28875..a71bc465 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -19,6 +19,7 @@ "formVariables", "capabilities", "legacy", + "otherCapabilities", "requiresOAuth" ] }, @@ -206,6 +207,17 @@ }, "required": ["kind"] }, + "otherCapabilities": { + "$id": "#/properties/other-capabilities", + "title": "Other capabilities", + "description": "Capabilities not configured by manifests", + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "enum": ["codeRefs", "dataExport", "external", "ide", "sso", "webhooks"] + } + }, "requiresOAuth": { "$id": "#/properties/requires-oauth", "title": "Requires OAuth", From cb8c9e4f4a0d2f0139afa5d242e3af0e1b68c17a Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Tue, 6 Apr 2021 14:59:12 -0700 Subject: [PATCH 403/936] Adding a better link for the pendo integration (#245) --- integrations/pendo/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index 861dec2a..1666b725 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -9,6 +9,7 @@ "links": { "supportWebsite": "https://support.pendo.io/hc/en-us/articles/360032592312-LaunchDarkly-Recipe-Automate-the-feature-release-process", "site": "https://www.pendo.io/", + "launchdarklyDocs": "https://launchdarkly.com/blog/launched-pendo-integration-with-launchdarkly/", "privacyPolicy": "https://www.pendo.io/legal/privacy-policy/" }, "categories": ["analytics"], From 98088ae01681f1f341096fb2ce55a63dff0889d1 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 8 Apr 2021 15:30:56 +0100 Subject: [PATCH 404/936] Add basicAuthHeaderValue helper documentation and example (#246) --- docs/capabilities.md | 1 + helpers/index.js | 8 ++++++++ integrations/sample-integration/manifest.json | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/docs/capabilities.md b/docs/capabilities.md index 09f263bf..12da5a07 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -212,6 +212,7 @@ Furthermore, the following custom helpers are supported: - `equal` - renders a block if the string version of both arguments are equals - `pathEncode` - URL path encodes the string version of the argument - `queryEncode` - URL query encodes the string version of the argument +- `basicAuthHeaderValue` - transforms `username` and `password` arguments into the `Authorization` header value required for a basic auth (including the `Basic ` prefix). To test your templates, you can run `npm run preview $INTEGRATION_NAME` or use the [Handlebars Sandbox](http://tryhandlebarsjs.com/). diff --git a/helpers/index.js b/helpers/index.js index 75482f59..c15da374 100644 --- a/helpers/index.js +++ b/helpers/index.js @@ -13,6 +13,14 @@ const registerHelpers = () => { Handlebars.registerHelper('queryEncode', function (v) { return encodeURIComponent(v); }); + Handlebars.registerHelper( + 'basicAuthHeaderValue', + function (username, password) { + return `Basic ${Buffer.from(`${username}:${password}`).toString( + 'base64' + )}`; + } + ); }; module.exports = { registerHelpers }; diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 10efe6ef..96c6f270 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -100,6 +100,10 @@ { "name": "Content-Type", "value": "application/json" + }, + { + "name": "Authorization", + "value": "{{{basicAuthHeaderValue required secret}}}" } ] }, From 2653842292d5611fce2d88e97cd102a034568bb8 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 9 Apr 2021 10:01:45 +0100 Subject: [PATCH 405/936] Add JSON body template string to all approval requests (#247) --- manifest.schema.d.ts | 9 ++++++++ manifest.schema.json | 35 ++++++++++++++++++++++++++++++ schemas/capabilities/approval.json | 25 ++++++++++++++++----- schemas/definitions.json | 6 +++++ 4 files changed, 70 insertions(+), 5 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 0a770ce7..c48ae73b 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -330,6 +330,10 @@ export type ValuePointer = string; * JSON pointer to the external alert URL */ export type URLPointer = string; +/** + * Template string used to render the JSON request body + */ +export type JSONBody = string; /** * JSON path to the array containing integration member details */ @@ -549,6 +553,7 @@ export interface Approval { */ export interface MemberListRequest { endpoint: Endpoint; + jsonBody?: JSONBody; parser: MemberListParser; [k: string]: unknown; } @@ -570,6 +575,7 @@ export interface MemberItemsArray { */ export interface CreationRequest { endpoint: Endpoint; + jsonBody?: JSONBody; parser?: ApprovalParser; [k: string]: unknown; } @@ -590,6 +596,7 @@ export interface ApprovalParser { */ export interface StatusRequest { endpoint: Endpoint; + jsonBody?: JSONBody; parser: ApprovalParser; [k: string]: unknown; } @@ -598,6 +605,7 @@ export interface StatusRequest { */ export interface PostApplyRequest { endpoint: Endpoint; + jsonBody?: JSONBody; parser: ApprovalParser; [k: string]: unknown; } @@ -606,6 +614,7 @@ export interface PostApplyRequest { */ export interface DeletionRequest { endpoint: Endpoint; + jsonBody?: JSONBody; parser: ApprovalParser; [k: string]: unknown; } diff --git a/manifest.schema.json b/manifest.schema.json index 3160dbc0..adb6e6af 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -951,6 +951,7 @@ "propertyNames": { "enum": [ "endpoint", + "jsonBody", "parser" ] }, @@ -1052,6 +1053,12 @@ "method" ] }, + "jsonBody": { + "$id": "#/definitions/json-body", + "title": "JSON Body", + "description": "Template string used to render the JSON request body", + "type": "string" + }, "parser": { "$id": "#/member-list-parser", "title": "Member list parser", @@ -1385,6 +1392,7 @@ "propertyNames": { "enum": [ "endpoint", + "jsonBody", "parser" ] }, @@ -1485,6 +1493,12 @@ "method" ] }, + "jsonBody": { + "$id": "#/definitions/json-body", + "title": "JSON Body", + "description": "Template string used to render the JSON request body", + "type": "string" + }, "parser": { "$id": "#/approval-parser", "title": "Approval parser", @@ -1552,6 +1566,7 @@ "propertyNames": { "enum": [ "endpoint", + "jsonBody", "parser" ] }, @@ -1653,6 +1668,12 @@ "method" ] }, + "jsonBody": { + "$id": "#/definitions/json-body", + "title": "JSON Body", + "description": "Template string used to render the JSON request body", + "type": "string" + }, "parser": { "$id": "#/approval-parser", "title": "Approval parser", @@ -1720,6 +1741,7 @@ "propertyNames": { "enum": [ "endpoint", + "jsonBody", "parser" ] }, @@ -1821,6 +1843,12 @@ "method" ] }, + "jsonBody": { + "$id": "#/definitions/json-body", + "title": "JSON Body", + "description": "Template string used to render the JSON request body", + "type": "string" + }, "parser": { "$id": "#/approval-parser", "title": "Approval parser", @@ -1888,6 +1916,7 @@ "propertyNames": { "enum": [ "endpoint", + "jsonBody", "parser" ] }, @@ -1989,6 +2018,12 @@ "method" ] }, + "jsonBody": { + "$id": "#/definitions/json-body", + "title": "JSON Body", + "description": "Template string used to render the JSON request body", + "type": "string" + }, "parser": { "$id": "#/approval-parser", "title": "Approval parser", diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index 9b056c35..66a5599b 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -28,13 +28,16 @@ "title": "Member List Request", "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", "propertyNames": { - "enum": ["endpoint", "parser"] + "enum": ["endpoint", "jsonBody", "parser"] }, "required": ["endpoint", "parser"], "properties": { "endpoint": { "$ref": "../definitions.json#/endpoint" }, + "jsonBody": { + "$ref": "../definitions.json#/jsonBody" + }, "parser": { "$ref": "parser/parser.json#/memberListParser" } @@ -55,13 +58,16 @@ "title": "Creation request", "description": "Describes the approval creation HTTP request and the parser used to process the JSON response", "propertyNames": { - "enum": ["endpoint", "parser"] + "enum": ["endpoint", "jsonBody", "parser"] }, "required": ["endpoint"], "properties": { "endpoint": { "$ref": "../definitions.json#/endpoint" }, + "jsonBody": { + "$ref": "../definitions.json#/jsonBody" + }, "parser": { "$ref": "parser/parser.json#/approvalParser" } @@ -72,13 +78,16 @@ "title": "Status Request", "description": "Describes the approval status check HTTP request and the parser used to determine if the approval should be consider approved or rejected", "propertyNames": { - "enum": ["endpoint", "parser"] + "enum": ["endpoint", "jsonBody", "parser"] }, "required": ["endpoint", "parser"], "properties": { "endpoint": { "$ref": "../definitions.json#/endpoint" }, + "jsonBody": { + "$ref": "../definitions.json#/jsonBody" + }, "parser": { "$ref": "parser/parser.json#/approvalParser" } @@ -89,13 +98,16 @@ "title": "Post Apply Request", "description": "Describes the HTTP request to make after the changes have been applied in LaunchDarkly", "propertyNames": { - "enum": ["endpoint", "parser"] + "enum": ["endpoint", "jsonBody", "parser"] }, "required": ["endpoint", "parser"], "properties": { "endpoint": { "$ref": "../definitions.json#/endpoint" }, + "jsonBody": { + "$ref": "../definitions.json#/jsonBody" + }, "parser": { "$ref": "parser/parser.json#/approvalParser" } @@ -106,13 +118,16 @@ "title": "Deletion Request", "description": "Describes the HTTP request for the deletion of the external approval entity", "propertyNames": { - "enum": ["endpoint", "parser"] + "enum": ["endpoint", "jsonBody", "parser"] }, "required": ["endpoint", "parser"], "properties": { "endpoint": { "$ref": "../definitions.json#/endpoint" }, + "jsonBody": { + "$ref": "../definitions.json#/jsonBody" + }, "parser": { "$ref": "parser/parser.json#/approvalParser" } diff --git a/schemas/definitions.json b/schemas/definitions.json index 79b86580..a749144e 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -94,6 +94,12 @@ }, "required": ["url", "method"] }, + "jsonBody": { + "$id": "#/definitions/json-body", + "title": "JSON Body", + "description": "Template string used to render the JSON request body", + "type": "string" + }, "formVariable": { "$id": "#/definitions/form-variable", "title": "Form variable", From 765e3eef478916da72a58bd0870db047a800f97e Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 12 Apr 2021 10:23:17 +0100 Subject: [PATCH 406/936] Add horizontal appoptics logo (#248) --- integrations/appoptics/assets/images/appoptics.svg | 1 + integrations/appoptics/assets/images/horizontal.svg | 5 ----- integrations/appoptics/manifest.json | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) create mode 100644 integrations/appoptics/assets/images/appoptics.svg delete mode 100644 integrations/appoptics/assets/images/horizontal.svg diff --git a/integrations/appoptics/assets/images/appoptics.svg b/integrations/appoptics/assets/images/appoptics.svg new file mode 100644 index 00000000..3b5d8cfe --- /dev/null +++ b/integrations/appoptics/assets/images/appoptics.svg @@ -0,0 +1 @@ + diff --git a/integrations/appoptics/assets/images/horizontal.svg b/integrations/appoptics/assets/images/horizontal.svg deleted file mode 100644 index 9a3b9639..00000000 --- a/integrations/appoptics/assets/images/horizontal.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index f3d042d9..91ee86c9 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -12,7 +12,7 @@ "categories": ["monitoring"], "icons": { "square": "assets/images/solarwinds-square.svg", - "horizontal": "assets/images/horizontal.svg" + "horizontal": "assets/images/appoptics.svg" }, "formVariables": [ { From b5c468ae149b2dfdeea15eb2669e5724113cc737 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 26 Apr 2021 11:42:17 +0100 Subject: [PATCH 407/936] Update sample context to include 'simple' timestamp format (#249) --- sample-context/environment/create.json | 3 ++- sample-context/environment/delete.json | 3 ++- sample-context/environment/update.json | 3 ++- sample-context/flag/archive.json | 3 ++- sample-context/flag/copy.json | 3 ++- sample-context/flag/create.json | 3 ++- sample-context/flag/targeting-rule-update.json | 3 ++- sample-context/flag/toggle.json | 3 ++- sample-context/flag/update-all-environments.json | 3 ++- sample-context/other/metric.create.json | 3 ++- sample-context/other/segment.create.json | 3 ++- sample-context/other/segment.update.json | 3 ++- sample-context/other/webhook.enable.json | 3 ++- sample-context/project/create.json | 3 ++- sample-context/project/delete.json | 3 ++- sample-context/project/update.json | 3 ++- 16 files changed, 32 insertions(+), 16 deletions(-) diff --git a/sample-context/environment/create.json b/sample-context/environment/create.json index 03ac97a1..af924946 100644 --- a/sample-context/environment/create.json +++ b/sample-context/environment/create.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580778632128, "seconds": 1580778632, - "rfc3339": "2020-02-04T01:10:32Z" + "rfc3339": "2020-02-04T01:10:32Z", + "simple": "2020-02-04 01:10:32" }, "kind": "environment", "name": "Local dev", diff --git a/sample-context/environment/delete.json b/sample-context/environment/delete.json index 070c55dd..a452e9be 100644 --- a/sample-context/environment/delete.json +++ b/sample-context/environment/delete.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580778870198, "seconds": 1580778870, - "rfc3339": "2020-02-04T01:14:30Z" + "rfc3339": "2020-02-04T01:14:30Z", + "simple": "2020-02-04 01:14:30" }, "kind": "environment", "name": "Local dev", diff --git a/sample-context/environment/update.json b/sample-context/environment/update.json index f119faa8..530e0bd3 100644 --- a/sample-context/environment/update.json +++ b/sample-context/environment/update.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580778761928, "seconds": 1580778761, - "rfc3339": "2020-02-04T01:12:41Z" + "rfc3339": "2020-02-04T01:12:41Z", + "simple": "2020-02-04 01:12:41" }, "kind": "environment", "name": "Local dev", diff --git a/sample-context/flag/archive.json b/sample-context/flag/archive.json index 327562e6..cfcb0727 100644 --- a/sample-context/flag/archive.json +++ b/sample-context/flag/archive.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580778134028, "seconds": 1580778134, - "rfc3339": "2020-02-04T01:02:14Z" + "rfc3339": "2020-02-04T01:02:14Z", + "simple": "2020-02-04 01:02:14" }, "kind": "flag", "name": "A brand new flag", diff --git a/sample-context/flag/copy.json b/sample-context/flag/copy.json index 35c0db19..d7348cde 100644 --- a/sample-context/flag/copy.json +++ b/sample-context/flag/copy.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580778239748, "seconds": 1580778239, - "rfc3339": "2020-02-04T01:03:59Z" + "rfc3339": "2020-02-04T01:03:59Z", + "simple": "2020-02-04 01:03:59" }, "kind": "flag", "name": "Demo flag", diff --git a/sample-context/flag/create.json b/sample-context/flag/create.json index 1650f8a7..484a0cc6 100644 --- a/sample-context/flag/create.json +++ b/sample-context/flag/create.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580777968396, "seconds": 1580777968, - "rfc3339": "2020-02-04T00:59:28Z" + "rfc3339": "2020-02-04T00:59:28Z", + "simple": "2020-02-04 00:59:28" }, "kind": "flag", "name": "A brand new flag", diff --git a/sample-context/flag/targeting-rule-update.json b/sample-context/flag/targeting-rule-update.json index 8b4048da..f5c00610 100644 --- a/sample-context/flag/targeting-rule-update.json +++ b/sample-context/flag/targeting-rule-update.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580777685229, "seconds": 1580777685, - "rfc3339": "2020-02-04T00:54:45Z" + "rfc3339": "2020-02-04T00:54:45Z", + "simple": "2020-02-04 00:54:45" }, "kind": "flag", "name": "Demo flag", diff --git a/sample-context/flag/toggle.json b/sample-context/flag/toggle.json index d3aa5967..2f1b0f9f 100644 --- a/sample-context/flag/toggle.json +++ b/sample-context/flag/toggle.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580777319650, "seconds": 1580777319, - "rfc3339": "2020-02-04T00:48:39Z" + "rfc3339": "2020-02-04T00:48:39Z", + "simple": "2020-02-04 00:48:39" }, "kind": "flag", "name": "Demo flag", diff --git a/sample-context/flag/update-all-environments.json b/sample-context/flag/update-all-environments.json index d57d5f0c..f43aad90 100644 --- a/sample-context/flag/update-all-environments.json +++ b/sample-context/flag/update-all-environments.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580777778959, "seconds": 1580777778, - "rfc3339": "2020-02-04T00:56:18Z" + "rfc3339": "2020-02-04T00:56:18Z", + "simple": "2020-02-04 00:56:18" }, "kind": "flag", "name": "Demo flag", diff --git a/sample-context/other/metric.create.json b/sample-context/other/metric.create.json index 6d353207..0fae5188 100644 --- a/sample-context/other/metric.create.json +++ b/sample-context/other/metric.create.json @@ -23,7 +23,8 @@ "timestamp": { "milliseconds": 1580779125858, "seconds": 1580779125, - "rfc3339": "2020-02-04T00:56:18Z" + "rfc3339": "2020-02-04T00:56:18Z", + "simple": "2020-02-04 00:56:18" }, "kind": "metric", "name": "New metric", diff --git a/sample-context/other/segment.create.json b/sample-context/other/segment.create.json index 65fd86e7..b181421a 100644 --- a/sample-context/other/segment.create.json +++ b/sample-context/other/segment.create.json @@ -23,7 +23,8 @@ "timestamp": { "milliseconds": 1580778941643, "seconds": 1580778941, - "rfc3339": "2020-02-04T01:15:41Z" + "rfc3339": "2020-02-04T01:15:41Z", + "simple": "2020-02-04 01:15:41" }, "kind": "segment", "name": "New segment", diff --git a/sample-context/other/segment.update.json b/sample-context/other/segment.update.json index 40abecba..f78ce007 100644 --- a/sample-context/other/segment.update.json +++ b/sample-context/other/segment.update.json @@ -23,7 +23,8 @@ "timestamp": { "milliseconds": 1580779027718, "seconds": 1580779027, - "rfc3339": "2020-02-04T01:17:07Z" + "rfc3339": "2020-02-04T01:17:07Z", + "simple": "2020-02-04 01:17:07" }, "kind": "segment", "name": "New segment", diff --git a/sample-context/other/webhook.enable.json b/sample-context/other/webhook.enable.json index d7c29863..c49865f1 100644 --- a/sample-context/other/webhook.enable.json +++ b/sample-context/other/webhook.enable.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580779057946, "seconds": 1580779057, - "rfc3339": "2020-02-04T01:17:37Z" + "rfc3339": "2020-02-04T01:17:37Z", + "simple": "2020-02-04 01:17:37" }, "kind": "webhook", "name": "Test webhook", diff --git a/sample-context/project/create.json b/sample-context/project/create.json index 4878c35d..e9d2a90e 100644 --- a/sample-context/project/create.json +++ b/sample-context/project/create.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580778499615, "seconds": 1580778499, - "rfc3339": "2020-02-04T01:08:19Z" + "rfc3339": "2020-02-04T01:08:19Z", + "simple": "2020-02-04 01:08:19" }, "kind": "project", "name": "A new project", diff --git a/sample-context/project/delete.json b/sample-context/project/delete.json index b480d7d7..77106f76 100644 --- a/sample-context/project/delete.json +++ b/sample-context/project/delete.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580778556395, "seconds": 1580778556, - "rfc3339": "2020-02-04T01:09:16Z" + "rfc3339": "2020-02-04T01:09:16Z", + "simple": "2020-02-04 01:09:16" }, "kind": "project", "name": "A new project", diff --git a/sample-context/project/update.json b/sample-context/project/update.json index 39fef30d..baf9dc68 100644 --- a/sample-context/project/update.json +++ b/sample-context/project/update.json @@ -27,7 +27,8 @@ "timestamp": { "milliseconds": 1580778360145, "seconds": 1580778360, - "rfc3339": "2020-02-04T01:06:00Z" + "rfc3339": "2020-02-04T01:06:00Z", + "simple": "2020-02-04 01:06:00" }, "kind": "project", "name": "The big project", From dc552e34ef8500f6ac69a855643307a99a7c6305 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 28 Apr 2021 15:49:21 +0100 Subject: [PATCH 408/936] [ch105018] Use JSON body for ServiceNow creation request and set start and end dates (#250) * Use jsonBody for request * Include start and end date in creation request --- integrations/servicenow/manifest.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index f1890ede..779d81e8 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -48,7 +48,7 @@ ], "creationRequest": { "endpoint": { - "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}?short_description={{queryEncode context.title.plainText}}&justification={{queryEncode context._links.approval.href}}{{#if context.details.plainText}}%0A%0A{{queryEncode context.details.plainText}}{{/if}}&requested_by={{queryEncode context.member.externalId}}", + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/standard/{{environment.template}}", "method": "POST", "headers": [ { @@ -57,6 +57,7 @@ } ] }, + "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", \"justification\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{timestamp.simple}}\"}", "parser": { "approvalId": "/result/sys_id/value", "statusValue": "/result/state/value", From 7730281fb44ed640460dd345378c3756f2cbccad Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Mon, 10 May 2021 11:38:18 -0700 Subject: [PATCH 409/936] bump handlebars package due to vulnerability (#253) --- package-lock.json | 6604 +-------------------------------------------- package.json | 2 +- 2 files changed, 95 insertions(+), 6511 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3ec6e6d6..3571c69f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6465 +1,8 @@ { "name": "@launchdarkly/integration-framework", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "@launchdarkly/integration-framework", - "version": "1.0.0", - "license": "ISC", - "devDependencies": { - "@apidevtools/json-schema-ref-parser": "^8.0.0", - "ajv": "^6.10.2", - "handlebars": "^4.7.6", - "jest": "^26.6.3", - "jest-expect-message": "1.0.2", - "jest-junit": "^12.0.0", - "json-schema-to-typescript": "^10.0.0", - "jsonpointer": "^4.0.1", - "lodash": "^4.17.19", - "prettier": "^2.0.1" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", - "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.0", - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.10" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.7" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/types": "^7.12.5" - } - }, - "node_modules/@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, - "dependencies": { - "@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" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.10" - } - }, - "node_modules/@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 - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", - "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.12.7", - "@babel/helper-optimise-call-expression": "^7.12.10", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.11" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.12.11" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "node_modules/@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } - }, - "node_modules/@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/highlight/node_modules/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, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/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==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/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, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" - } - }, - "node_modules/@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@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 - }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, - "node_modules/@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, - "dependencies": { - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@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, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "node-notifier": "^8.0.0" - } - }, - "node_modules/@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, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@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, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" - }, - "node_modules/@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, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@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, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@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, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", - "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@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, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@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 - }, - "node_modules/@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, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@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, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@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==" - }, - "node_modules/@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" - }, - "node_modules/@types/node": { - "version": "14.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.6.tgz", - "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", - "dev": true - }, - "node_modules/@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 - }, - "node_modules/@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/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, - "dependencies": { - "type-fest": "^0.11.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/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=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/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, - "dependencies": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/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 - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/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, - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/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, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", - "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", - "dependencies": { - "ansi-regex": "^2.1.1", - "d": "^1.0.1", - "es5-ext": "^0.10.51", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.7" - } - }, - "node_modules/cli-color/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/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 - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/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 - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/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, - "optional": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/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, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/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, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/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=", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/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 - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/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 - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "node_modules/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==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/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, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/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, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/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, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/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, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "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" - } - }, - "node_modules/glob-promise": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", - "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", - "dependencies": { - "@types/glob": "*" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "glob": "*" - } - }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "node_modules/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 - }, - "node_modules/handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/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 - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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=", - "dev": true - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/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, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "dependencies": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/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, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-expect-message": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jest-expect-message/-/jest-expect-message-1.0.2.tgz", - "integrity": "sha512-WFiXMgwS2lOqQZt1iJMI/hOXpUm32X+ApsuzYcQpW5m16Pv6/Gd9kgC+Q+Q1YVNU04kYcAOv9NXMnjg6kKUy6Q==", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "fsevents": "^2.1.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-junit": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.0.0.tgz", - "integrity": "sha512-+8K35LlboWiPuCnXSyiid7rFdxNlpCWWM20WEYe6IZH6psfUWKZmSpSRQ5tk0C0cBeDsvsnIzcef5mYhyJsbug==", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^5.2.0", - "uuid": "^3.3.3", - "xml": "^1.0.1" - } - }, - "node_modules/jest-junit/node_modules/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 - }, - "node_modules/jest-junit/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "node_modules/jest-junit/node_modules/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, - "dependencies": { - "ansi-regex": "^4.1.0" - } - }, - "node_modules/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, - "dependencies": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/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, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "dependencies": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/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 - }, - "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "node_modules/jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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 - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "node_modules/json-schema-ref-parser": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", - "integrity": "sha512-z0JGv7rRD3CnJbZY/qCpscyArdtLJhr/wRBmFUdoZ8xMjsFyNdILSprG2degqRLjBjyhZHAEBpGOxniO9rKTxA==", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.6" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/json-schema-ref-parser/node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", - "integrity": "sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/json-schema-to-typescript": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.0.0.tgz", - "integrity": "sha512-G5RZlHchI9r/v31QhH5k57K+2kvYRBWKIGctJPsUuIkUIf3J3xXzvQZJGa16bhVjgs1fStaLamfFIti6K6V6wQ==", - "dependencies": { - "@types/json-schema": "^7.0.6", - "cli-color": "^2.0.0", - "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "is-glob": "^4.0.1", - "json-schema-ref-parser": "^9.0.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "mz": "^2.7.0", - "prettier": "^2.2.0", - "stdin": "0.0.1" - }, - "bin": { - "json2ts": "dist/src/cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/json-schema-to-typescript/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/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=" - }, - "node_modules/json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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 - }, - "node_modules/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, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "node_modules/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, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, - "node_modules/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, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "dependencies": { - "tmpl": "1.0.x" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dev": true, - "dependencies": { - "mime-db": "1.45.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/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/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-notifier": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", - "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", - "dev": true, - "optional": true, - "dependencies": { - "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" - } - }, - "node_modules/node-notifier/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-notifier/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/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, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/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, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/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, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/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 - }, - "node_modules/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, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/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==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native/node_modules/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==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/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==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true, - "engines": { - "node": "6.* || >= 7.*" - } - }, - "node_modules/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 - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "dependencies": { - "@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" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/sane/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/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 - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/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, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "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" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stdin": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", - "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=" - }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/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, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "node_modules/timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "node_modules/tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/uglify-js": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz", - "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==", - "dev": true, - "optional": true, - "dependencies": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", - "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/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, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "dependencies": { - "makeerror": "1.0.x" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/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, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", - "dev": true - }, - "node_modules/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==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - } - }, "dependencies": { "@apidevtools/json-schema-ref-parser": { "version": "8.0.0", @@ -7100,7 +643,8 @@ "@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true }, "@sinonjs/commons": { "version": "1.8.1", @@ -7165,6 +709,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, "requires": { "@types/minimatch": "*", "@types/node": "*" @@ -7206,17 +751,20 @@ "@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/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true }, "@types/node": { "version": "14.14.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", + "dev": true }, "@types/normalize-package-data": { "version": "2.4.0", @@ -7318,7 +866,8 @@ "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true }, "anymatch": { "version": "3.1.1", @@ -7334,6 +883,7 @@ "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" } @@ -7481,7 +1031,8 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base": { "version": "0.11.2", @@ -7522,6 +1073,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7577,7 +1129,8 @@ "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true }, "callsites": { "version": "3.1.0", @@ -7718,6 +1271,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "dev": true, "requires": { "ansi-regex": "^2.1.1", "d": "^1.0.1", @@ -7730,7 +1284,8 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true } } }, @@ -7791,13 +1346,6 @@ "delayed-stream": "~1.0.0" } }, - "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, - "optional": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -7807,7 +1355,8 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "convert-source-map": { "version": "1.7.0", @@ -7868,6 +1417,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, "requires": { "es5-ext": "^0.10.50", "type": "^1.0.1" @@ -8021,6 +1571,7 @@ "version": "0.10.53", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, "requires": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.3", @@ -8031,6 +1582,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, "requires": { "d": "1", "es5-ext": "^0.10.35", @@ -8041,6 +1593,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, "requires": { "d": "^1.0.1", "ext": "^1.1.2" @@ -8050,6 +1603,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, "requires": { "d": "1", "es5-ext": "^0.10.46", @@ -8079,7 +1633,8 @@ "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==", + "dev": true }, "estraverse": { "version": "4.3.0", @@ -8097,6 +1652,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, "requires": { "d": "1", "es5-ext": "~0.10.14" @@ -8262,6 +1818,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, "requires": { "type": "^2.0.0" }, @@ -8269,7 +1826,8 @@ "type": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true } } }, @@ -8418,7 +1976,8 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fsevents": { "version": "2.2.1", @@ -8479,6 +2038,7 @@ "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", "inflight": "^1.0.4", @@ -8492,6 +2052,7 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "dev": true, "requires": { "@types/glob": "*" } @@ -8516,9 +2077,9 @@ "optional": true }, "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { "minimist": "^1.2.5", @@ -8678,6 +2239,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -8686,7 +2248,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "ip-regex": { "version": "2.1.0", @@ -8772,7 +2335,8 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -8790,6 +2354,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -8818,7 +2383,8 @@ "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true }, "is-stream": { "version": "2.0.0", @@ -9210,8 +2776,7 @@ "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, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "26.0.0", @@ -9426,6 +2991,7 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -9493,6 +3059,7 @@ "version": "9.0.6", "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", "integrity": "sha512-z0JGv7rRD3CnJbZY/qCpscyArdtLJhr/wRBmFUdoZ8xMjsFyNdILSprG2degqRLjBjyhZHAEBpGOxniO9rKTxA==", + "dev": true, "requires": { "@apidevtools/json-schema-ref-parser": "9.0.6" }, @@ -9501,6 +3068,7 @@ "version": "9.0.6", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", "integrity": "sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==", + "dev": true, "requires": { "@jsdevtools/ono": "^7.1.3", "call-me-maybe": "^1.0.1", @@ -9513,6 +3081,7 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.0.0.tgz", "integrity": "sha512-G5RZlHchI9r/v31QhH5k57K+2kvYRBWKIGctJPsUuIkUIf3J3xXzvQZJGa16bhVjgs1fStaLamfFIti6K6V6wQ==", + "dev": true, "requires": { "@types/json-schema": "^7.0.6", "cli-color": "^2.0.0", @@ -9532,7 +3101,8 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true } } }, @@ -9545,7 +3115,8 @@ "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=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "json5": { "version": "2.1.3", @@ -9620,7 +3191,8 @@ "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true }, "lodash.sortby": { "version": "4.7.0", @@ -9641,6 +3213,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, "requires": { "es5-ext": "~0.10.2" } @@ -9690,6 +3263,7 @@ "version": "0.4.14", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "dev": true, "requires": { "d": "1", "es5-ext": "^0.10.45", @@ -9742,6 +3316,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -9749,7 +3324,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 }, "mixin-deep": { "version": "1.3.2", @@ -9771,6 +3347,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, "requires": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -9803,15 +3380,16 @@ "dev": true }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true }, "nice-try": { "version": "1.0.5", @@ -9907,7 +3485,8 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "object-copy": { "version": "0.1.0", @@ -9999,6 +3578,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -10095,7 +3675,8 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "3.1.1", @@ -10154,7 +3735,8 @@ "prettier": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==" + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true }, "pretty-format": { "version": "26.6.2", @@ -10996,7 +4578,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "sshpk": { "version": "1.16.1", @@ -11105,7 +4688,8 @@ "stdin": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", - "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=" + "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", + "dev": true }, "stealthy-require": { "version": "1.1.1", @@ -11211,6 +4795,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, "requires": { "any-promise": "^1.0.0" } @@ -11219,6 +4804,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, "requires": { "thenify": ">= 3.1.0 < 4" } @@ -11233,6 +4819,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, "requires": { "es5-ext": "~0.10.46", "next-tick": "1" @@ -11329,7 +4916,8 @@ "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true }, "type-check": { "version": "0.3.2", @@ -11362,15 +4950,11 @@ } }, "uglify-js": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz", - "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==", + "version": "3.13.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", + "integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", "dev": true, - "optional": true, - "requires": { - "commander": "~2.20.3", - "source-map": "~0.6.1" - } + "optional": true }, "union-value": { "version": "1.0.1", @@ -11599,7 +5183,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write-file-atomic": { "version": "3.0.3", @@ -11617,8 +5202,7 @@ "version": "7.4.2", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", - "dev": true, - "requires": {} + "dev": true }, "xml": { "version": "1.0.1", diff --git a/package.json b/package.json index 5414f10b..af251ea9 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "devDependencies": { "@apidevtools/json-schema-ref-parser": "^8.0.0", "ajv": "^6.10.2", - "handlebars": "^4.7.6", + "handlebars": "^4.7.7", "jest": "^26.6.3", "jest-expect-message": "1.0.2", "jest-junit": "^12.0.0", From 34f03691fb4fa3e460a3bdb41321878f0aa577d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 11:42:35 -0700 Subject: [PATCH 410/936] Bump hosted-git-info from 2.8.8 to 2.8.9 (#254) --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3571c69f..b3ae1d05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2173,9 +2173,9 @@ } }, "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==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "html-encoding-sniffer": { From 35a717b7c54c3d85975485031e15664bbf465ec8 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Mon, 10 May 2021 11:45:49 -0700 Subject: [PATCH 411/936] bump lodash (#256) --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3ae1d05..e4b1301c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3189,9 +3189,9 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.sortby": { diff --git a/package.json b/package.json index af251ea9..b0d35d0b 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "jest-junit": "^12.0.0", "json-schema-to-typescript": "^10.0.0", "jsonpointer": "^4.0.1", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "prettier": "^2.0.1" } } From e2c0f33891a8b1fd79c2a48716ae2c07047c3120 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 1 Jun 2021 13:08:32 +0100 Subject: [PATCH 412/936] [ch105018] Add ServiceNow C0 manifest (#251) * Use jsonBody for request * Update servicenow-c0 manifest --- .../assets/images/servicenow-horizontal.svg | 1 + .../assets/images/servicenow-icon.svg | 3 + integrations/servicenow-c0/manifest.json | 169 ++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 integrations/servicenow-c0/assets/images/servicenow-horizontal.svg create mode 100644 integrations/servicenow-c0/assets/images/servicenow-icon.svg create mode 100644 integrations/servicenow-c0/manifest.json diff --git a/integrations/servicenow-c0/assets/images/servicenow-horizontal.svg b/integrations/servicenow-c0/assets/images/servicenow-horizontal.svg new file mode 100644 index 00000000..4c76a79d --- /dev/null +++ b/integrations/servicenow-c0/assets/images/servicenow-horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/servicenow-c0/assets/images/servicenow-icon.svg b/integrations/servicenow-c0/assets/images/servicenow-icon.svg new file mode 100644 index 00000000..f676f2c1 --- /dev/null +++ b/integrations/servicenow-c0/assets/images/servicenow-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json new file mode 100644 index 00000000..5bfd6b3b --- /dev/null +++ b/integrations/servicenow-c0/manifest.json @@ -0,0 +1,169 @@ +{ + "name": "ServiceNow C0", + "version": "1.0.0", + "overview": "Create feature flag change requests in ServiceNow.", + "description": "Efficiently comply with company-wide change management policies by embedding LaunchDarkly approvals into existing ServiceNow workflows.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.servicenow.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/servicenow", + "privacyPolicy": "https://www.servicenow.com/privacy-statement.html" + }, + "categories": ["approval"], + "icons": { + "square": "assets/images/servicenow-icon.svg", + "horizontal": "assets/images/servicenow-horizontal.svg" + }, + "formVariables": [], + "capabilities": { + "approval": { + "environmentFormVariables": [ + { + "key": "username", + "name": "ServiceNow username", + "description": "Your ServiceNow integration user's username", + "type": "string" + }, + { + "key": "password", + "name": "ServiceNow password", + "description": "Your ServiceNow integration user's password", + "type": "string", + "isSecret": true + }, + { + "key": "host", + "name": "ServiceNow host", + "description": "Your ServiceNow host", + "type": "string" + }, + { + "key": "template", + "name": "Change request template", + "description": "The change request template to be utilized for all flag changes in this environment.", + "type": "string" + }, + { + "key": "assignment", + "name": "Assignment group", + "description": "TEMPORARY: The assignment group to be utilized for all flag changes in this environment.", + "type": "string" + }, + { + "key": "user", + "name": "Requesting user ID", + "description": "TEMPORARY: The requesting user for all flag changes in this environment.", + "type": "string" + } + ], + "creationRequest": { + "endpoint": { + "url": "{{environment.host}}/api/sn_chg_rest/change/standard/{{environment.template}}", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "{{{basicAuthHeaderValue environment.username environment.password}}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "jsonBody": "{\"assignment_group\": \"{{environmentFormVariables.assignment}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{environmentFormVariables.user}}\", \"requested_by\": \"{{environmentFormVariables.user}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{environmentFormVariables.assignment}}\", \"u_requesting_group\": \"{{environmentFormVariables.assignment}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"risk\": \"low\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{timestamp.simple}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\"}", + "parser": { + "approvalId": "/result/0/display_value", + "statusValue": "/result/0/status", + "statusDisplay": "/result/0/status", + "approvalMatcher": "inserted", + "rejectionMatcher": "error", + "urlTemplate": "{{environment.host}}/change_request.do?sys_id={{queryEncode context.approvalId}}" + } + }, + "statusRequest": { + "endpoint": { + "url": "https://launchdarkly.com/404", + "method": "GET", + "headers": [] + }, + "parser": { + "statusValue": "/result/0/status", + "statusDisplay": "/result/0/status", + "approvalMatcher": "inserted", + "rejectionMatcher": "error" + } + }, + "postApplyRequest": { + "endpoint": { + "url": "{{environment.host}}/api/now/import/u_update_change", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "{{{basicAuthHeaderValue environment.username environment.password}}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "jsonBody": "{ \"number\": \"{{approvalId}}\", \"requested_by\": \"{{environmentFormVariables.user}}\", \"state\": \"Closed Complete\", \"u_close_task_state\": \"Closed Complete,Closed Complete,Closed Complete,Closed Skipped\", \"u_closure_code\": \"Successful\", \"u_close_tasks\": \"TODO\", \"u_closure_comments\": \"Closed by LaunchDarkly\", \"u_uuid\": \"TODO\" }", + "parser": { + "statusValue": "/result/0/status", + "statusDisplay": "/result/0/status", + "approvalMatcher": "x", + "rejectionMatcher": "x" + } + }, + "deletionRequest": { + "endpoint": { + "url": "{{environment.host}}/api/now/import/u_update_change", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "{{{basicAuthHeaderValue environment.username environment.password}}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "jsonBody": "{ \"number\": \"{{approvalId}}\", \"requested_by\": \"{{environmentFormVariables.user}}\", \"state\": \"Closed Complete\", \"u_close_task_state\": \"Closed Complete,Closed Complete,Closed Complete,Closed Skipped\", \"u_closure_code\": \"Successful\", \"u_close_tasks\": \"TODO\", \"u_closure_comments\": \"Closed by LaunchDarkly\", \"u_uuid\": \"TODO\" }", + "parser": { + "statusValue": "/state", + "statusDisplay": "/state", + "approvalMatcher": "x", + "rejectionMatcher": "x" + } + }, + "memberListRequest": { + "endpoint": { + "url": "{environment.host}}/api/now/table/sys_user?active=true&sysparm_fields=email,user_name", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "{{{basicAuthHeaderValue environment.username environment.password}}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "parser": { + "memberArrayPath": "/result", + "memberItems": { + "memberId": "/user_name", + "email": "/email" + } + } + } + } + } +} From 927f566f2066ac2852ef106e2b2b34786ebb757e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Jun 2021 13:33:53 +0100 Subject: [PATCH 413/936] Bump ws from 7.4.2 to 7.4.6 (#257) Bumps [ws](https://github.com/websockets/ws) from 7.4.2 to 7.4.6. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.2...7.4.6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Henry Barrow --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index e4b1301c..105602a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5199,9 +5199,9 @@ } }, "ws": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", - "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true }, "xml": { From a1f2625e6ad33e852c9ec10fd260832e22f8aff4 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 1 Jun 2021 14:11:10 +0100 Subject: [PATCH 414/936] [ch105018] Update servicenow-c0 creation request path (#258) * Update servicenow-c0 creation request path * fix creation request url --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 5bfd6b3b..cadc1ea5 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -59,7 +59,7 @@ ], "creationRequest": { "endpoint": { - "url": "{{environment.host}}/api/sn_chg_rest/change/standard/{{environment.template}}", + "url": "{{environment.host}}/api/now/import/u_create_change", "method": "POST", "headers": [ { From af7afb6160fae737914fb15a367ba9f42ecd7dd5 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 1 Jun 2021 14:34:31 +0100 Subject: [PATCH 415/936] Temporarily use plaintext password for servicenow-c0 manifest (#259) --- integrations/servicenow-c0/manifest.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index cadc1ea5..1c0b6126 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -26,11 +26,10 @@ "type": "string" }, { - "key": "password", + "key": "pw", "name": "ServiceNow password", "description": "Your ServiceNow integration user's password", - "type": "string", - "isSecret": true + "type": "string" }, { "key": "host", @@ -64,7 +63,7 @@ "headers": [ { "name": "Authorization", - "value": "{{{basicAuthHeaderValue environment.username environment.password}}}" + "value": "{{{basicAuthHeaderValue environment.username environment.pw}}}" }, { "name": "Content-Type", From 279a9f4afed76434b5ad93eb0eea5606bb7edf6b Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 1 Jun 2021 14:58:15 +0100 Subject: [PATCH 416/936] Update servicenow-c0 urlTemplate based on provided information (#260) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 1c0b6126..0b919276 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -78,7 +78,7 @@ "statusDisplay": "/result/0/status", "approvalMatcher": "inserted", "rejectionMatcher": "error", - "urlTemplate": "{{environment.host}}/change_request.do?sys_id={{queryEncode context.approvalId}}" + "urlTemplate": "{{environment.host}}/itsmhome/?id=itsm_form&number={{queryEncode context.approvalId}}&table=change_request" } }, "statusRequest": { From 65c5dcc4c7e0e65afd23af8dc1b481b83590b543 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 3 Jun 2021 16:01:15 +0100 Subject: [PATCH 417/936] [ch105018] Update servicenow-c0 creation request based on feedback (#262) * Update servicenow-c0 to use isSecret for password * Update servicenow-c0 creation request based on feedback --- integrations/servicenow-c0/manifest.json | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 0b919276..e41f07df 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -26,10 +26,11 @@ "type": "string" }, { - "key": "pw", + "key": "password", "name": "ServiceNow password", "description": "Your ServiceNow integration user's password", - "type": "string" + "type": "string", + "isSecret": true }, { "key": "host", @@ -54,6 +55,12 @@ "name": "Requesting user ID", "description": "TEMPORARY: The requesting user for all flag changes in this environment.", "type": "string" + }, + { + "key": "appId", + "name": "App ID", + "description": "TEMPORARY: The App ID used for all flag changes in this environment.", + "type": "string" } ], "creationRequest": { @@ -63,7 +70,7 @@ "headers": [ { "name": "Authorization", - "value": "{{{basicAuthHeaderValue environment.username environment.pw}}}" + "value": "{{{basicAuthHeaderValue environment.username environment.password}}}" }, { "name": "Content-Type", @@ -71,14 +78,14 @@ } ] }, - "jsonBody": "{\"assignment_group\": \"{{environmentFormVariables.assignment}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{environmentFormVariables.user}}\", \"requested_by\": \"{{environmentFormVariables.user}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{environmentFormVariables.assignment}}\", \"u_requesting_group\": \"{{environmentFormVariables.assignment}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"risk\": \"low\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{timestamp.simple}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\"}", + "jsonBody": "{\"assignment_group\": \"{{environmentFormVariables.assignment}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{environmentFormVariables.user}}\", \"requested_by\": \"{{environmentFormVariables.user}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{environmentFormVariables.assignment}}\", \"u_requesting_group\": \"{{environmentFormVariables.assignment}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"risk\": \"low\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{timestamp.simple}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"state\": \"Closed Complete\", \"u_affected_ci\": \"{{environmentFormVariables.appId}}\"}", "parser": { - "approvalId": "/result/0/display_value", + "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", "statusDisplay": "/result/0/status", "approvalMatcher": "inserted", "rejectionMatcher": "error", - "urlTemplate": "{{environment.host}}/itsmhome/?id=itsm_form&number={{queryEncode context.approvalId}}&table=change_request" + "urlTemplate": "{{environment.host}}/itsmhome/?id=itsm_form&sys_id={{queryEncode context.approvalId}}&table=change_request" } }, "statusRequest": { From 8c4e6d99a57f7e7823fc610154e6729917eda4f1 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 9 Jun 2021 11:39:29 +0100 Subject: [PATCH 418/936] Add formatWithOffset helper (#263) --- docs/capabilities.md | 11 ++++++++++- helpers/index.js | 19 +++++++++++++++++++ .../templates/flag.json.hbs | 1 + package-lock.json | 5 +++++ package.json | 3 +++ 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index 12da5a07..b1484040 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -152,7 +152,8 @@ sends you a default JSON payload that looks like this: "timestamp": { "milliseconds": 1580778134028, "seconds": 1580778134, - "rfc3339": "2020-02-04T01:02:14Z" + "rfc3339": "2020-02-04T01:02:14Z", + "simple": "2020-02-04 01:02:14" }, "kind": "flag", "name": "Example test", @@ -213,6 +214,14 @@ Furthermore, the following custom helpers are supported: - `pathEncode` - URL path encodes the string version of the argument - `queryEncode` - URL query encodes the string version of the argument - `basicAuthHeaderValue` - transforms `username` and `password` arguments into the `Authorization` header value required for a basic auth (including the `Basic ` prefix). +- `formatWithOffset` - adds an offset in seconds to a unix milliseconds timestamp and formats the timestamp using one of the supported formats detailed below. + +The following timestamp formats are supported: + +- `milliseconds` - unix milliseconds +- `seconds` - unix seconds +- `rfc3339` - [RFC3339 format](https://datatracker.ietf.org/doc/html/rfc3339), e.g., `2020-02-04T01:02:14Z` +- `simple` - timestamp string formatted as `yyyy-mm-dd h:MM:ss`, e.g., `2020-02-04 01:03:59` To test your templates, you can run `npm run preview $INTEGRATION_NAME` or use the [Handlebars Sandbox](http://tryhandlebarsjs.com/). diff --git a/helpers/index.js b/helpers/index.js index c15da374..ccc740c3 100644 --- a/helpers/index.js +++ b/helpers/index.js @@ -1,4 +1,6 @@ const Handlebars = require('handlebars'); +const dateFormat = require('dateformat'); +const { flatMap } = require('lodash'); const registerHelpers = () => { Handlebars.registerHelper('equal', function (v1, v2, options) { @@ -21,6 +23,23 @@ const registerHelpers = () => { )}`; } ); + Handlebars.registerHelper( + 'formatWithOffset', + function (milliseconds, offset, format) { + const ts = new Date(milliseconds + 1000 * offset); + switch (format) { + case 'milliseconds': + return ts.getTime(); + case 'seconds': + return Math.round(ts.getTime() / 1000); + case 'rfc3339': + return ts.toISOString(); + case 'simple': + return dateFormat(ts, 'yyyy-mm-dd h:MM:ss'); + } + return ts.getTime(); + } + ); }; module.exports = { registerHelpers }; diff --git a/integrations/sample-integration/templates/flag.json.hbs b/integrations/sample-integration/templates/flag.json.hbs index f0434fe9..83d73ccc 100644 --- a/integrations/sample-integration/templates/flag.json.hbs +++ b/integrations/sample-integration/templates/flag.json.hbs @@ -2,6 +2,7 @@ "title": "{{title.markdown}}", "text": "{{details.plainText}}", "date_happened": "{{timestamp.seconds}}", + "offset_date": "{{formatWithOffset timestamp.milliseconds 3600 'simple'}}", "tags": ["any", "arbitrary", "tag"], "source_type_name": "example.com", "color": "{{formVariables.color}}", diff --git a/package-lock.json b/package-lock.json index 105602a7..9ad88b5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1443,6 +1443,11 @@ "whatwg-url": "^8.0.0" } }, + "dateformat": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.5.1.tgz", + "integrity": "sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==" + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", diff --git a/package.json b/package.json index b0d35d0b..7476d868 100644 --- a/package.json +++ b/package.json @@ -38,5 +38,8 @@ "jsonpointer": "^4.0.1", "lodash": "^4.17.21", "prettier": "^2.0.1" + }, + "dependencies": { + "dateformat": "^4.5.1" } } From 7c9f51dc678a2398567c25d88f91ec52d268218a Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 9 Jun 2021 11:50:02 +0100 Subject: [PATCH 419/936] Include timestamp offset in servicenow-c0 and add additional required field (#264) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index e41f07df..a54eb464 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -78,7 +78,7 @@ } ] }, - "jsonBody": "{\"assignment_group\": \"{{environmentFormVariables.assignment}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{environmentFormVariables.user}}\", \"requested_by\": \"{{environmentFormVariables.user}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{environmentFormVariables.assignment}}\", \"u_requesting_group\": \"{{environmentFormVariables.assignment}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"risk\": \"low\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{timestamp.simple}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"state\": \"Closed Complete\", \"u_affected_ci\": \"{{environmentFormVariables.appId}}\"}", + "jsonBody": "{\"assignment_group\": \"{{environmentFormVariables.assignment}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{environmentFormVariables.user}}\", \"requested_by\": \"{{environmentFormVariables.user}}\", \"assigned_to\": \"{{environmentFormVariables.user}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{environmentFormVariables.assignment}}\", \"u_requesting_group\": \"{{environmentFormVariables.assignment}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 60 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 60 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"state\": \"Closed Complete\", \"u_affected_ci\": \"{{environmentFormVariables.appId}}\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From e963801d8cd56a518bfcfb384678205290917891 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 10 Jun 2021 15:44:12 +0100 Subject: [PATCH 420/936] [ch111110] Use nvmrc file and node v14 (#266) * Use nvmrc file and node v14 * Update docs --- .nvm | 1 - .nvmrc | 1 + docs/getting-started.md | 2 ++ 3 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 .nvm create mode 100644 .nvmrc diff --git a/.nvm b/.nvm deleted file mode 100644 index b1bd38b6..00000000 --- a/.nvm +++ /dev/null @@ -1 +0,0 @@ -13 diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..8351c193 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +14 diff --git a/docs/getting-started.md b/docs/getting-started.md index 97547098..f2749693 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -59,6 +59,8 @@ To validate your integration: 1. Run `npm install` to install the validation dependencies. 2. Run `npm test` to run the validation suite. +**Note:** Please use Node.js v14 when running the above npm commands. + Additionally, we recommend you install [pre-commit hooks](https://pre-commit.com/#install) with `pre-commit install`. This will make the validation suite run before every commit, saving you time if you need to troubleshoot anything. From 0d4bd971243462d1a7eeee22a0cb2a37f0fbdc4a Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 10 Jun 2021 08:52:03 -0700 Subject: [PATCH 421/936] [ch111068] fake akamai integration (#265) --- integrations/akamai/assets/horizontal.svg | 151 ++++++++++++++++++ integrations/akamai/assets/square.svg | 151 ++++++++++++++++++ integrations/akamai/manifest.json | 55 +++++++ .../akamai/templates/default.json.hbs | 2 + 4 files changed, 359 insertions(+) create mode 100644 integrations/akamai/assets/horizontal.svg create mode 100644 integrations/akamai/assets/square.svg create mode 100644 integrations/akamai/manifest.json create mode 100644 integrations/akamai/templates/default.json.hbs diff --git a/integrations/akamai/assets/horizontal.svg b/integrations/akamai/assets/horizontal.svg new file mode 100644 index 00000000..49633d3a --- /dev/null +++ b/integrations/akamai/assets/horizontal.svg @@ -0,0 +1,151 @@ + + + +image/svg+xml diff --git a/integrations/akamai/assets/square.svg b/integrations/akamai/assets/square.svg new file mode 100644 index 00000000..2383d7fd --- /dev/null +++ b/integrations/akamai/assets/square.svg @@ -0,0 +1,151 @@ + + + +image/svg+xml diff --git a/integrations/akamai/manifest.json b/integrations/akamai/manifest.json new file mode 100644 index 00000000..7cc95377 --- /dev/null +++ b/integrations/akamai/manifest.json @@ -0,0 +1,55 @@ +{ + "name": "Akamai", + "version": "1.0.0", + "overview": "Evaluate LaunchDarkly feature flags in Akamai Edge Workers.", + "description": "Evaluate LaunchDarkly feature flags in Akamai Edge Workers for improved performance.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.akamai.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/akamai", + "privacyPolicy": "https://www.akamai.com/us/en/privacy-policies/" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + { + "key": "apiKey", + "name": "Akamai API key", + "type": "string", + "description": "Enter your Akamai API key.", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "http://example.com/path/to/nowhere", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "AKAMAI-API-KEY", + "value": "api-key-would-go-here" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/akamai/templates/default.json.hbs b/integrations/akamai/templates/default.json.hbs new file mode 100644 index 00000000..2c63c085 --- /dev/null +++ b/integrations/akamai/templates/default.json.hbs @@ -0,0 +1,2 @@ +{ +} From 5f83a26e723ca883176985243e896df31df67607 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 17 Jun 2021 14:15:27 -0500 Subject: [PATCH 422/936] Added zendesk goaltender card --- integrations/zendesk/LICENSE.md | 13 +++++++++++++ .../zendesk/assets/images/horizontal.svg | 1 + integrations/zendesk/assets/images/square.svg | 6 ++++++ integrations/zendesk/manifest.json | 19 +++++++++++++++++++ manifest.schema.d.ts | 6 ++++++ manifest.schema.json | 1 + schemas/base.json | 1 + 7 files changed, 47 insertions(+) create mode 100644 integrations/zendesk/LICENSE.md create mode 100644 integrations/zendesk/assets/images/horizontal.svg create mode 100644 integrations/zendesk/assets/images/square.svg create mode 100644 integrations/zendesk/manifest.json diff --git a/integrations/zendesk/LICENSE.md b/integrations/zendesk/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/zendesk/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/zendesk/assets/images/horizontal.svg b/integrations/zendesk/assets/images/horizontal.svg new file mode 100644 index 00000000..e5bc80fe --- /dev/null +++ b/integrations/zendesk/assets/images/horizontal.svg @@ -0,0 +1 @@ +golion-z-sourcefile-algae diff --git a/integrations/zendesk/assets/images/square.svg b/integrations/zendesk/assets/images/square.svg new file mode 100644 index 00000000..cd110b75 --- /dev/null +++ b/integrations/zendesk/assets/images/square.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/integrations/zendesk/manifest.json b/integrations/zendesk/manifest.json new file mode 100644 index 00000000..581f09cf --- /dev/null +++ b/integrations/zendesk/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "Zendesk", + "version": "1.0.0", + "overview": "View flag variations served to your customers from Zendesk.", + "description": "Zendesk is a service-first CRM company that builds software designed to improve customer relationships. Our Zendesk app gives you and your team members a read-only view of flag variations served to your customers without leaving Zendesk, thus dramatically shortening the time to close tickets.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.zendesk.com", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/zendesk", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["customer-support"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "otherCapabilities": ["external"] +} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index c48ae73b..a8b72b8f 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -59,6 +59,7 @@ export type Categories = | "authentication" | "automation" | "code-references" + | "customer-support" | "data" | "developer-tools" | "infrastructure" @@ -75,6 +76,7 @@ export type Categories = | "authentication" | "automation" | "code-references" + | "customer-support" | "data" | "developer-tools" | "infrastructure" @@ -90,6 +92,7 @@ export type Categories = | "authentication" | "automation" | "code-references" + | "customer-support" | "data" | "developer-tools" | "infrastructure" @@ -107,6 +110,7 @@ export type Categories = | "authentication" | "automation" | "code-references" + | "customer-support" | "data" | "developer-tools" | "infrastructure" @@ -122,6 +126,7 @@ export type Categories = | "authentication" | "automation" | "code-references" + | "customer-support" | "data" | "developer-tools" | "infrastructure" @@ -137,6 +142,7 @@ export type Categories = | "authentication" | "automation" | "code-references" + | "customer-support" | "data" | "developer-tools" | "infrastructure" diff --git a/manifest.schema.json b/manifest.schema.json index adb6e6af..d74db817 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -157,6 +157,7 @@ "authentication", "automation", "code-references", + "customer-support", "data", "developer-tools", "infrastructure", diff --git a/schemas/base.json b/schemas/base.json index a71bc465..98411601 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -145,6 +145,7 @@ "authentication", "automation", "code-references", + "customer-support", "data", "developer-tools", "infrastructure", From ffb6664b44f830fd150fbf29af0633c53aa675f3 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 17 Jun 2021 14:18:26 -0500 Subject: [PATCH 423/936] Removed unused license file for zendesk --- integrations/zendesk/LICENSE.md | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 integrations/zendesk/LICENSE.md diff --git a/integrations/zendesk/LICENSE.md b/integrations/zendesk/LICENSE.md deleted file mode 100644 index 9dcbe896..00000000 --- a/integrations/zendesk/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2020 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. From dd7ef33bb044069f8e0373ebe9c09615e917a81b Mon Sep 17 00:00:00 2001 From: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Date: Thu, 17 Jun 2021 14:42:30 -0500 Subject: [PATCH 424/936] Update integrations/zendesk/manifest.json nice, looks good to me Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> --- integrations/zendesk/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/zendesk/manifest.json b/integrations/zendesk/manifest.json index 581f09cf..74e28243 100644 --- a/integrations/zendesk/manifest.json +++ b/integrations/zendesk/manifest.json @@ -1,7 +1,7 @@ { "name": "Zendesk", "version": "1.0.0", - "overview": "View flag variations served to your customers from Zendesk.", + "overview": "View flag variations served to Zendesk ticket reporters without ever leaving Zendesk.", "description": "Zendesk is a service-first CRM company that builds software designed to improve customer relationships. Our Zendesk app gives you and your team members a read-only view of flag variations served to your customers without leaving Zendesk, thus dramatically shortening the time to close tickets.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", From 4388ba949be910d5a8f1460496434dae5d5c12f9 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 22 Jun 2021 16:30:23 +0100 Subject: [PATCH 425/936] [ch110701] Utilize reserved custom properties for servicenow-c0 manifest" (#268) * start using custom properties in servicenow-c0 manifest * remove environment form variables --- integrations/servicenow-c0/manifest.json | 34 +++++++++++------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index a54eb464..86e90017 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -17,6 +17,20 @@ }, "formVariables": [], "capabilities": { + "reservedCustomProperties": [ + { + "name": "ServiceNow App ID", + "key": "servicenowAppId" + }, + { + "name": "ServiceNow user ID", + "key": "servicenowUserId" + }, + { + "name": "ServiceNow assignment group", + "key": "servicenowAssignmentGroup" + } + ], "approval": { "environmentFormVariables": [ { @@ -43,24 +57,6 @@ "name": "Change request template", "description": "The change request template to be utilized for all flag changes in this environment.", "type": "string" - }, - { - "key": "assignment", - "name": "Assignment group", - "description": "TEMPORARY: The assignment group to be utilized for all flag changes in this environment.", - "type": "string" - }, - { - "key": "user", - "name": "Requesting user ID", - "description": "TEMPORARY: The requesting user for all flag changes in this environment.", - "type": "string" - }, - { - "key": "appId", - "name": "App ID", - "description": "TEMPORARY: The App ID used for all flag changes in this environment.", - "type": "string" } ], "creationRequest": { @@ -78,7 +74,7 @@ } ] }, - "jsonBody": "{\"assignment_group\": \"{{environmentFormVariables.assignment}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{environmentFormVariables.user}}\", \"requested_by\": \"{{environmentFormVariables.user}}\", \"assigned_to\": \"{{environmentFormVariables.user}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{environmentFormVariables.assignment}}\", \"u_requesting_group\": \"{{environmentFormVariables.assignment}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 60 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 60 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"state\": \"Closed Complete\", \"u_affected_ci\": \"{{environmentFormVariables.appId}}\"}", + "jsonBody": "{\"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 60 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 60 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From 22f020b65cd7de496c100d282812acd7276ed434 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 1 Jul 2021 15:53:26 +0100 Subject: [PATCH 426/936] servicenow-c0 ensure end_date is after start_date (#269) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 86e90017..22a49f44 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -74,7 +74,7 @@ } ] }, - "jsonBody": "{\"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 60 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 60 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", + "jsonBody": "{\"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 60 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 61 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From 54f973d1d196381ef17bfc7ace5627f02abc28c8 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Wed, 7 Jul 2021 11:19:00 -0400 Subject: [PATCH 427/936] fake fastly integration (#270) --- integrations/fastly/assets/horizontal.svg | 36 ++++++++++++ integrations/fastly/assets/square.svg | 1 + integrations/fastly/manifest.json | 55 +++++++++++++++++++ .../fastly/templates/default.json.hbs | 2 + 4 files changed, 94 insertions(+) create mode 100644 integrations/fastly/assets/horizontal.svg create mode 100644 integrations/fastly/assets/square.svg create mode 100644 integrations/fastly/manifest.json create mode 100644 integrations/fastly/templates/default.json.hbs diff --git a/integrations/fastly/assets/horizontal.svg b/integrations/fastly/assets/horizontal.svg new file mode 100644 index 00000000..ab886ee0 --- /dev/null +++ b/integrations/fastly/assets/horizontal.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/integrations/fastly/assets/square.svg b/integrations/fastly/assets/square.svg new file mode 100644 index 00000000..ef542f9f --- /dev/null +++ b/integrations/fastly/assets/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/fastly/manifest.json b/integrations/fastly/manifest.json new file mode 100644 index 00000000..cbc61e23 --- /dev/null +++ b/integrations/fastly/manifest.json @@ -0,0 +1,55 @@ +{ + "name": "Fastly", + "version": "1.0.0", + "overview": "Evaluate LaunchDarkly feature flags in Fastly's Compute@Edge offering.", + "description": "Evaluate LaunchDarkly feature flags in Fastly's Compute@Edge offering by storing flag rules in Fastly's edge dictionary.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.fastly.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/fastly", + "privacyPolicy": "https://www.fastly.com/privacy/" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + { + "key": "apiKey", + "name": "Fastly API key", + "type": "string", + "description": "Enter your Fastly API key.", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "http://example.com/path/to/nowhere", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "FASTLY-API-KEY", + "value": "api-key-would-go-here" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/fastly/templates/default.json.hbs b/integrations/fastly/templates/default.json.hbs new file mode 100644 index 00000000..2c63c085 --- /dev/null +++ b/integrations/fastly/templates/default.json.hbs @@ -0,0 +1,2 @@ +{ +} From e6c016e7688b0cc8b9aa70cb3a9ca50159e24639 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 8 Jul 2021 12:41:06 +0100 Subject: [PATCH 428/936] Update servicenow-c0 to use custom properties in postApply and deletion requests (#271) --- integrations/servicenow-c0/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 22a49f44..79b7cb29 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -112,7 +112,7 @@ } ] }, - "jsonBody": "{ \"number\": \"{{approvalId}}\", \"requested_by\": \"{{environmentFormVariables.user}}\", \"state\": \"Closed Complete\", \"u_close_task_state\": \"Closed Complete,Closed Complete,Closed Complete,Closed Skipped\", \"u_closure_code\": \"Successful\", \"u_close_tasks\": \"TODO\", \"u_closure_comments\": \"Closed by LaunchDarkly\", \"u_uuid\": \"TODO\" }", + "jsonBody": "{ \"number\": \"{{{creationResponseBody.result.[0].display_value}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"state\": \"Closed Complete\", \"u_close_task_state\": \"Closed Complete,Closed Complete,Closed Complete,Closed Skipped\", \"u_closure_code\": \"Successful\", \"u_close_tasks\": \"{{{creationResponseBody.result.[0].AllTasks}}}\", \"u_closure_comments\": \"Closed by LaunchDarkly: {{{comment}}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\" }", "parser": { "statusValue": "/result/0/status", "statusDisplay": "/result/0/status", @@ -122,7 +122,7 @@ }, "deletionRequest": { "endpoint": { - "url": "{{environment.host}}/api/now/import/u_update_change", + "url": "{{environment.host}}/api/now/change/cancel_change_request", "method": "POST", "headers": [ { @@ -135,7 +135,7 @@ } ] }, - "jsonBody": "{ \"number\": \"{{approvalId}}\", \"requested_by\": \"{{environmentFormVariables.user}}\", \"state\": \"Closed Complete\", \"u_close_task_state\": \"Closed Complete,Closed Complete,Closed Complete,Closed Skipped\", \"u_closure_code\": \"Successful\", \"u_close_tasks\": \"TODO\", \"u_closure_comments\": \"Closed by LaunchDarkly\", \"u_uuid\": \"TODO\" }", + "jsonBody": "{ \"number\": \"{{{creationResponseBody.result.[0].display_value}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"closure_comments\": \"The approval request was deleted in LaunchDarkly. No changes were made.\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\" }", "parser": { "statusValue": "/state", "statusDisplay": "/state", From 4f3b6e0d788cc4008645543244fbeee401735d96 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 8 Jul 2021 13:14:04 +0100 Subject: [PATCH 429/936] Descrease timestamp offset (#272) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 79b7cb29..8ad2e8b8 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -74,7 +74,7 @@ } ] }, - "jsonBody": "{\"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 60 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 61 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", + "jsonBody": "{\"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 25 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 26 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From b49635ee65e502c93d31d251af9eb4c9f7693459 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 8 Jul 2021 13:56:15 -0500 Subject: [PATCH 430/936] Added description to reserved custom properties and updated datadog reserved custom property to have description --- integrations/datadog/manifest.json | 1 + manifest.schema.d.ts | 5 +++++ manifest.schema.json | 10 +++++++++- schemas/capabilities/reservedCustomProperties.json | 9 ++++++++- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 93b3f863..f45155a7 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -40,6 +40,7 @@ "reservedCustomProperties": [ { "name": "Datadog tags", + "description": "Tags are a way of adding additional dimension to LaunchDarkly change events in Datadog so they can be filtered, aggregated, and compared in visualizations.", "key": "datadog" } ], diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index a8b72b8f..98494cfc 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -300,12 +300,17 @@ export type Name2 = string; * The custom property's API response key. */ export type Key1 = string; +/** + * The custom property's description. + */ +export type Description2 = string; /** * This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/advanced/custom-properties for more information on custom properties */ export type ReservedCustomProperties = { name: Name2; key: Key1; + description?: Description2; [k: string]: unknown; }[]; /** diff --git a/manifest.schema.json b/manifest.schema.json index d74db817..d9b028f0 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -811,7 +811,8 @@ "propertyNames": { "enum": [ "name", - "key" + "key", + "description" ] }, "properties": { @@ -828,6 +829,13 @@ "type": "string", "description": "The custom property's API response key.", "maxLength": 64 + }, + "description": { + "$id": "#/properties/capability/reserved-custom-properties/items/description", + "title": "Description", + "type": "string", + "description": "The custom property's description.", + "maxLength": 250 } }, "required": [ diff --git a/schemas/capabilities/reservedCustomProperties.json b/schemas/capabilities/reservedCustomProperties.json index a254bdda..e396889c 100644 --- a/schemas/capabilities/reservedCustomProperties.json +++ b/schemas/capabilities/reservedCustomProperties.json @@ -8,7 +8,7 @@ "items": { "$id": "#/properties/capability/reserved-custom-properties/items", "type": "object", - "propertyNames": { "enum": ["name", "key"] }, + "propertyNames": { "enum": ["name", "key", "description"] }, "properties": { "name": { "$id": "#/properties/capability/reserved-custom-properties/items/name", @@ -23,6 +23,13 @@ "type": "string", "description": "The custom property's API response key.", "maxLength": 64 + }, + "description": { + "$id": "#/properties/capability/reserved-custom-properties/items/description", + "title": "Description", + "type": "string", + "description": "The custom property's description.", + "maxLength": 250 } }, "required": ["name", "key"] From 545d5ef0840d1165decf69e75772306e88f20df9 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 8 Jul 2021 14:03:19 -0500 Subject: [PATCH 431/936] Updated sample reserved custom property in docs --- docs/capabilities.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index b1484040..1d7b6231 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -293,7 +293,7 @@ To learn more, read [Custom properties](https://docs.launchdarkly.com/home/advan By default, users must specify a custom property name and key when they attach the custom property value to a feature flag. This step introduces the possibility of user error. To prevent this, developers can _reserve_ a custom property for their integration, which makes it much easier for users to correctly add the property's value to feature flags. -Reserved custom properties are simple to define. Their only requirements are a `name` and `key`. +Reserved custom properties are simple to define. Their only requirements are a `name` and `key`, adding a `description` is optional. After your integration is configured by a user, the custom property starts appearing in the dropdown on the flag's Settings page. @@ -303,6 +303,7 @@ Here is a sample `reservedCustomProperties` capability: "reservedCustomProperties": [ { "name": "Foobar Entities", + "description": "Foobar Description", "key": "foobar" } ], From eb86c2b3a1a269ad7928b6a692c8b594ef6d9dcd Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 15 Jul 2021 15:01:32 +0100 Subject: [PATCH 432/936] [ch113600] Update servicenow-c0 description, short_desription, start_date, and end_date (#274) * Update servicenow-c0 description, short_desription, start_date, and end_date * Use double brackets when possible --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 8ad2e8b8..58b5a11f 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -74,7 +74,7 @@ } ] }, - "jsonBody": "{\"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"short_description\": \"{{{title.plainText}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 25 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 26 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", + "jsonBody": "{\"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"description\": \"Business Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 6 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From c56e06eb75cfc2dfe5939094984837446ad0f11d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 16 Jul 2021 16:30:24 +0100 Subject: [PATCH 433/936] Add leading \n to serivenow-c0 justification (#275) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 58b5a11f..8f378637 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -74,7 +74,7 @@ } ] }, - "jsonBody": "{\"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"description\": \"Business Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 6 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", + "jsonBody": "{\"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 6 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From d765e6a2dbb594e0d04075b35e90f03b1e2ace10 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 4 Aug 2021 17:52:59 +0100 Subject: [PATCH 434/936] [ch110172] Add flag form variables to manifest schema (#276) * Add flag form variables to manifest schema * Fix grammar --- manifest.schema.d.ts | 9 +- manifest.schema.json | 281 ++++++++++++++++++++++++++++- schemas/capabilities/approval.json | 11 ++ schemas/definitions.json | 4 +- 4 files changed, 297 insertions(+), 8 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 98494cfc..cf0a87e5 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -205,11 +205,11 @@ export type IsThisVariableASecret = boolean; */ export type IsThisVariableOptional = boolean; /** - * Default value for variable. Can be overridden by user in the UI + * Default value for variable. Can be overridden by the user in the UI */ export type DefaultValue = boolean | string; /** - * allowed string values for enum-type formVariables + * Allowed string values for enum-type formVariables */ export type AllowedValues = string[]; /** @@ -361,6 +361,10 @@ export type MemberID = string; * Environment-specific form variables that render on the environment approval settings modal */ export type EnvironmentFormVariables = FormVariable[]; +/** + * Flag-specific form variables that render on the approval request creation modal + */ +export type FlagFormVariables = FormVariable[]; /** * Externally-created approval entity ID */ @@ -553,6 +557,7 @@ export interface TriggerParser { export interface Approval { memberListRequest: MemberListRequest; environmentFormVariables?: EnvironmentFormVariables; + flagFormVariables?: FlagFormVariables; creationRequest: CreationRequest; statusRequest: StatusRequest; postApplyRequest: PostApplyRequest; diff --git a/manifest.schema.json b/manifest.schema.json index d9b028f0..593ad497 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -343,13 +343,13 @@ "boolean", "string" ], - "description": "Default value for variable. Can be overridden by user in the UI" + "description": "Default value for variable. Can be overridden by the user in the UI" }, "allowedValues": { "$id": "#/definitions/form-variable/allowed-values", "title": "Allowed values", "type": "array", - "description": "allowed string values for enum-type formVariables", + "description": "Allowed string values for enum-type formVariables", "items": { "type": "string" } @@ -938,6 +938,7 @@ "propertyNames": { "enum": [ "environmentFormVariables", + "flagFormVariables", "creationRequest", "statusRequest", "postApplyRequest", @@ -1210,13 +1211,285 @@ "boolean", "string" ], - "description": "Default value for variable. Can be overridden by user in the UI" + "description": "Default value for variable. Can be overridden by the user in the UI" }, "allowedValues": { "$id": "#/definitions/form-variable/allowed-values", "title": "Allowed values", "type": "array", - "description": "allowed string values for enum-type formVariables", + "description": "Allowed string values for enum-type formVariables", + "items": { + "type": "string" + } + }, + "dynamicOptions": { + "$id": "#/definitions/form-variable/dynamic-options", + "title": "Dynamic options", + "type": "object", + "description": "Parser and endpoint for handling dynamicEnum", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/definitions/form-variable/dynamic-options/parser", + "title": "Dynamic options parser", + "description": "Mapping of property names to location in JSON response", + "type": "object", + "required": [ + "optionsPath", + "optionsItems" + ], + "propertyNames": { + "enum": [ + "optionsPath", + "optionsItems" + ] + }, + "properties": { + "optionsPath": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-path", + "title": "Options array path", + "description": "JSON path to the array containing options for parsing", + "type": "string" + }, + "optionsItems": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items", + "title": "Options array", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/label", + "title": "Label", + "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", + "type": "string" + }, + "value": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/value", + "title": "Value", + "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", + "type": "string" + } + } + } + } + } + } + } + }, + "required": [ + "key", + "name", + "type", + "description" + ] + }, + "default": [] + }, + "flagFormVariables": { + "$id": "#/capabilities/approval/flag-form-variables", + "title": "Flag form variables", + "description": "Flag-specific form variables that render on the approval request creation modal", + "type": "array", + "items": { + "$id": "#/definitions/form-variable", + "title": "Form variable", + "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "description", + "placeholder", + "isSecret", + "isOptional", + "defaultValue", + "allowedValues", + "dynamicOptions" + ] + }, + "properties": { + "key": { + "$id": "#/definitions/form-variable/key", + "title": "Key", + "type": "string", + "description": "A key will be used as the token name when the variable is substituted", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "name": { + "$id": "#/definitions/form-variable/name", + "title": "Name", + "type": "string", + "description": "A descriptive name that will be used as the form label on the UI", + "maxLength": 50 + }, + "type": { + "$id": "#/definitions/form-variable/type", + "title": "Type", + "type": "string", + "description": "The type of the variable", + "enum": [ + "string", + "boolean", + "uri", + "enum", + "oauth", + "dynamicEnum" + ] + }, + "description": { + "$id": "#/definitions/form-variable/description", + "title": "Description", + "type": "string", + "description": "Describes the variable in the UI. Markdown links allowed.", + "maxLength": 250 + }, + "placeholder": { + "$id": "#/definitions/form-variable/placeholder", + "title": "Description", + "type": "string", + "description": "Placeholder value to use in the form element if applicable" + }, + "isSecret": { + "$id": "#/definitions/form-variable/is-secret", + "title": "Is this variable a secret?", + "type": "boolean", + "description": "Secret variables will be masked in the UI", + "default": false + }, + "isOptional": { + "$id": "#/definitions/form-variable/is-optional", + "title": "Is this variable optional?", + "type": "boolean", + "description": "Variables marked as optional won't be required on the UI", + "default": false + }, + "defaultValue": { + "$id": "#/definitions/form-variable/default-value", + "title": "Default value", + "type": [ + "boolean", + "string" + ], + "description": "Default value for variable. Can be overridden by the user in the UI" + }, + "allowedValues": { + "$id": "#/definitions/form-variable/allowed-values", + "title": "Allowed values", + "type": "array", + "description": "Allowed string values for enum-type formVariables", "items": { "type": "string" } diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index 66a5599b..6dbf73bc 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -8,6 +8,7 @@ "propertyNames": { "enum": [ "environmentFormVariables", + "flagFormVariables", "creationRequest", "statusRequest", "postApplyRequest", @@ -53,6 +54,16 @@ }, "default": [] }, + "flagFormVariables": { + "$id": "#/capabilities/approval/flag-form-variables", + "title": "Flag form variables", + "description": "Flag-specific form variables that render on the approval request creation modal", + "type": "array", + "items": { + "$ref": "../definitions.json#/formVariable" + }, + "default": [] + }, "creationRequest": { "$id": "#/capabilities/approval/creation-request", "title": "Creation request", diff --git a/schemas/definitions.json b/schemas/definitions.json index a749144e..1a4663bb 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -173,13 +173,13 @@ "$id": "#/definitions/form-variable/default-value", "title": "Default value", "type": ["boolean", "string"], - "description": "Default value for variable. Can be overridden by user in the UI" + "description": "Default value for variable. Can be overridden by the user in the UI" }, "allowedValues": { "$id": "#/definitions/form-variable/allowed-values", "title": "Allowed values", "type": "array", - "description": "allowed string values for enum-type formVariables", + "description": "Allowed string values for enum-type formVariables", "items": { "type": "string" } From 80fbc3e0e27e8b05f3e1a6fe8e897af38e3a3a2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Aug 2021 17:04:59 -0700 Subject: [PATCH 435/936] Bump path-parse from 1.0.6 to 1.0.7 (#277) Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9ad88b5c..f40c03d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3690,9 +3690,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "performance-now": { From 5468b49007b81f60388f75387654d02f93e87716 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 12 Aug 2021 09:53:38 +0100 Subject: [PATCH 436/936] [ch109967] Add flagFormVariables to servicenow-c0 manifest (#279) * Add flagFormVariables to servicenow-c0 manifest * Add userID to postApply and deletion requests --- integrations/servicenow-c0/manifest.json | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 8f378637..974eb0e3 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -32,6 +32,22 @@ } ], "approval": { + "flagFormVariables": [ + { + "key": "assignmentGroup", + "name": "ServiceNow Assignment Group", + "description": "Your ServiceNow assignment group", + "type": "string", + "isOptional": true + }, + { + "key": "userID", + "name": "ServiceNow user ID", + "description": "Your ServiceNow user ID", + "type": "string", + "isOptional": true + } + ], "environmentFormVariables": [ { "key": "username", @@ -74,7 +90,7 @@ } ] }, - "jsonBody": "{\"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 6 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", + "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} {{#if flagFormVariables.userID}}\"opened_by\": \"{{{flagFormVariables.userID}}}\", \"requested_by\": \"{{{flagFormVariables.userID}}}\", \"assigned_to\": \"{{{flagFormVariables.userID}}}\",{{else}} \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\",{{/if}} \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 6 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", @@ -112,7 +128,7 @@ } ] }, - "jsonBody": "{ \"number\": \"{{{creationResponseBody.result.[0].display_value}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"state\": \"Closed Complete\", \"u_close_task_state\": \"Closed Complete,Closed Complete,Closed Complete,Closed Skipped\", \"u_closure_code\": \"Successful\", \"u_close_tasks\": \"{{{creationResponseBody.result.[0].AllTasks}}}\", \"u_closure_comments\": \"Closed by LaunchDarkly: {{{comment}}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\" }", + "jsonBody": "{ \"number\": \"{{{creationResponseBody.result.[0].display_value}}}\", {{#if flagFormVariables.userID}}\"requested_by\": \"{{{flagFormVariables.userID}}}\", {{else}} \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", {{/if}} \"state\": \"Closed Complete\", \"u_close_task_state\": \"Closed Complete,Closed Complete,Closed Complete,Closed Skipped\", \"u_closure_code\": \"Successful\", \"u_close_tasks\": \"{{{creationResponseBody.result.[0].AllTasks}}}\", \"u_closure_comments\": \"Closed by LaunchDarkly: {{{comment}}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\" }", "parser": { "statusValue": "/result/0/status", "statusDisplay": "/result/0/status", @@ -135,7 +151,7 @@ } ] }, - "jsonBody": "{ \"number\": \"{{{creationResponseBody.result.[0].display_value}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"closure_comments\": \"The approval request was deleted in LaunchDarkly. No changes were made.\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\" }", + "jsonBody": "{ \"number\": \"{{{creationResponseBody.result.[0].display_value}}}\", {{#if flagFormVariables.userID}}\"requested_by\": \"{{{flagFormVariables.userID}}}\", {{else}} \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", {{/if}} \"closure_comments\": \"The approval request was deleted in LaunchDarkly. No changes were made.\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\" }", "parser": { "statusValue": "/state", "statusDisplay": "/state", From 08ad091e48698da9932cf71470db0888d531c41e Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 12 Aug 2021 11:00:35 +0100 Subject: [PATCH 437/936] Add emailLocalPart to all sample context (#280) --- sample-context/environment/create.json | 1 + sample-context/environment/delete.json | 1 + sample-context/environment/update.json | 1 + sample-context/flag/archive.json | 1 + sample-context/flag/copy.json | 1 + sample-context/flag/create.json | 1 + sample-context/flag/targeting-rule-update.json | 1 + sample-context/flag/toggle.json | 1 + sample-context/flag/update-all-environments.json | 1 + sample-context/other/metric.create.json | 1 + sample-context/other/segment.create.json | 1 + sample-context/other/segment.update.json | 1 + sample-context/other/webhook.enable.json | 1 + sample-context/project/create.json | 1 + sample-context/project/delete.json | 1 + sample-context/project/update.json | 1 + 16 files changed, 16 insertions(+) diff --git a/sample-context/environment/create.json b/sample-context/environment/create.json index af924946..56237e46 100644 --- a/sample-context/environment/create.json +++ b/sample-context/environment/create.json @@ -62,6 +62,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/environment/delete.json b/sample-context/environment/delete.json index a452e9be..9ea47aea 100644 --- a/sample-context/environment/delete.json +++ b/sample-context/environment/delete.json @@ -62,6 +62,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/environment/update.json b/sample-context/environment/update.json index 530e0bd3..ff6ba419 100644 --- a/sample-context/environment/update.json +++ b/sample-context/environment/update.json @@ -62,6 +62,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/flag/archive.json b/sample-context/flag/archive.json index cfcb0727..94d95a99 100644 --- a/sample-context/flag/archive.json +++ b/sample-context/flag/archive.json @@ -63,6 +63,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/flag/copy.json b/sample-context/flag/copy.json index d7348cde..7d5fde56 100644 --- a/sample-context/flag/copy.json +++ b/sample-context/flag/copy.json @@ -63,6 +63,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/flag/create.json b/sample-context/flag/create.json index 484a0cc6..1645effe 100644 --- a/sample-context/flag/create.json +++ b/sample-context/flag/create.json @@ -62,6 +62,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/flag/targeting-rule-update.json b/sample-context/flag/targeting-rule-update.json index f5c00610..049a26d1 100644 --- a/sample-context/flag/targeting-rule-update.json +++ b/sample-context/flag/targeting-rule-update.json @@ -77,6 +77,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/flag/toggle.json b/sample-context/flag/toggle.json index 2f1b0f9f..7fd51cba 100644 --- a/sample-context/flag/toggle.json +++ b/sample-context/flag/toggle.json @@ -77,6 +77,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/flag/update-all-environments.json b/sample-context/flag/update-all-environments.json index f43aad90..5b535ebc 100644 --- a/sample-context/flag/update-all-environments.json +++ b/sample-context/flag/update-all-environments.json @@ -77,6 +77,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/other/metric.create.json b/sample-context/other/metric.create.json index 0fae5188..56deb899 100644 --- a/sample-context/other/metric.create.json +++ b/sample-context/other/metric.create.json @@ -58,6 +58,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/other/segment.create.json b/sample-context/other/segment.create.json index b181421a..12a41c79 100644 --- a/sample-context/other/segment.create.json +++ b/sample-context/other/segment.create.json @@ -58,6 +58,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/other/segment.update.json b/sample-context/other/segment.update.json index f78ce007..ca187605 100644 --- a/sample-context/other/segment.update.json +++ b/sample-context/other/segment.update.json @@ -59,6 +59,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/other/webhook.enable.json b/sample-context/other/webhook.enable.json index c49865f1..a43f8296 100644 --- a/sample-context/other/webhook.enable.json +++ b/sample-context/other/webhook.enable.json @@ -61,6 +61,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/project/create.json b/sample-context/project/create.json index e9d2a90e..aa2a6b5e 100644 --- a/sample-context/project/create.json +++ b/sample-context/project/create.json @@ -62,6 +62,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/project/delete.json b/sample-context/project/delete.json index 77106f76..53a96358 100644 --- a/sample-context/project/delete.json +++ b/sample-context/project/delete.json @@ -62,6 +62,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" diff --git a/sample-context/project/update.json b/sample-context/project/update.json index baf9dc68..bd1e3201 100644 --- a/sample-context/project/update.json +++ b/sample-context/project/update.json @@ -62,6 +62,7 @@ }, "_id": "569f514183f2164430000002", "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", "firstName": "Henrietta", "lastName": "Powell", "displayName": "Henrietta Powell" From 9a3709fbaaa2ebe76e1a4274af05568b0d26f4a7 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Thu, 12 Aug 2021 09:11:25 -0700 Subject: [PATCH 438/936] Updating heap and pendo doc URLs (#278) --- integrations/heap/manifest.json | 2 +- integrations/pendo/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index 7838e1d5..76a41654 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -9,7 +9,7 @@ "links": { "supportWebsite": "https://help.heap.io/", "site": "https://heap.io/", - "launchdarklyDocs": "https://help.heap.io/integrations/testing-and-personalization/launchdarkly/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/heap", "privacyPolicy": "https://heap.io/privacy" }, "categories": ["analytics"], diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index 1666b725..a086f30d 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -9,7 +9,7 @@ "links": { "supportWebsite": "https://support.pendo.io/hc/en-us/articles/360032592312-LaunchDarkly-Recipe-Automate-the-feature-release-process", "site": "https://www.pendo.io/", - "launchdarklyDocs": "https://launchdarkly.com/blog/launched-pendo-integration-with-launchdarkly/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/pendo", "privacyPolicy": "https://www.pendo.io/legal/privacy-policy/" }, "categories": ["analytics"], From f10632a1cf7c227be7aa5ed85ebabde9ee404f30 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 19 Aug 2021 22:28:11 +0100 Subject: [PATCH 439/936] Update servicenow-c0 manifest to use emailLocalPart as serviceNow username (#281) --- integrations/servicenow-c0/manifest.json | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 974eb0e3..04897643 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -19,13 +19,9 @@ "capabilities": { "reservedCustomProperties": [ { - "name": "ServiceNow App ID", + "name": "ServiceNow app ID", "key": "servicenowAppId" }, - { - "name": "ServiceNow user ID", - "key": "servicenowUserId" - }, { "name": "ServiceNow assignment group", "key": "servicenowAssignmentGroup" @@ -35,15 +31,8 @@ "flagFormVariables": [ { "key": "assignmentGroup", - "name": "ServiceNow Assignment Group", - "description": "Your ServiceNow assignment group", - "type": "string", - "isOptional": true - }, - { - "key": "userID", - "name": "ServiceNow user ID", - "description": "Your ServiceNow user ID", + "name": "ServiceNow assignment group (override)", + "description": "Your ServiceNow assignment group. This value will override the flag's ServiceNow assignment group custom property.", "type": "string", "isOptional": true } @@ -90,7 +79,7 @@ } ] }, - "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} {{#if flagFormVariables.userID}}\"opened_by\": \"{{{flagFormVariables.userID}}}\", \"requested_by\": \"{{{flagFormVariables.userID}}}\", \"assigned_to\": \"{{{flagFormVariables.userID}}}\",{{else}} \"opened_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", \"assigned_to\": \"{{{customProperties.servicenowUserId.values.[0]}}}\",{{/if}} \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 6 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", + "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 6 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", @@ -128,7 +117,7 @@ } ] }, - "jsonBody": "{ \"number\": \"{{{creationResponseBody.result.[0].display_value}}}\", {{#if flagFormVariables.userID}}\"requested_by\": \"{{{flagFormVariables.userID}}}\", {{else}} \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", {{/if}} \"state\": \"Closed Complete\", \"u_close_task_state\": \"Closed Complete,Closed Complete,Closed Complete,Closed Skipped\", \"u_closure_code\": \"Successful\", \"u_close_tasks\": \"{{{creationResponseBody.result.[0].AllTasks}}}\", \"u_closure_comments\": \"Closed by LaunchDarkly: {{{comment}}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\" }", + "jsonBody": "{ \"number\": \"{{{creationResponseBody.result.[0].display_value}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"state\": \"Closed Complete\", \"u_close_task_state\": \"Closed Complete,Closed Complete,Closed Complete,Closed Skipped\", \"u_closure_code\": \"Successful\", \"u_close_tasks\": \"{{{creationResponseBody.result.[0].AllTasks}}}\", \"u_closure_comments\": \"Closed by LaunchDarkly: {{{comment}}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\" }", "parser": { "statusValue": "/result/0/status", "statusDisplay": "/result/0/status", @@ -151,7 +140,7 @@ } ] }, - "jsonBody": "{ \"number\": \"{{{creationResponseBody.result.[0].display_value}}}\", {{#if flagFormVariables.userID}}\"requested_by\": \"{{{flagFormVariables.userID}}}\", {{else}} \"requested_by\": \"{{{customProperties.servicenowUserId.values.[0]}}}\", {{/if}} \"closure_comments\": \"The approval request was deleted in LaunchDarkly. No changes were made.\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\" }", + "jsonBody": "{ \"number\": \"{{{creationResponseBody.result.[0].display_value}}}\",\"requested_by\": \"{{{member.emailLocalPart}}}\", \"closure_comments\": \"The approval request was deleted in LaunchDarkly. No changes were made.\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\" }", "parser": { "statusValue": "/state", "statusDisplay": "/state", From 74d3c94decdaa2e222c2f91f6c5c2ea5b82a8da7 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 23 Aug 2021 13:51:37 +0100 Subject: [PATCH 440/936] Reduce start and end date offest for servicenow-c0 (#283) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 04897643..db4b2805 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -79,7 +79,7 @@ } ] }, - "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 6 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", + "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 1 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 2 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From ab5a8b970d8125c214c558e708ec40154c13a945 Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Tue, 24 Aug 2021 11:38:06 -0700 Subject: [PATCH 441/936] Use git gatsby tray docs link (#282) --- integrations/tray/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/tray/manifest.json b/integrations/tray/manifest.json index 6a811e0b..fe372bdf 100644 --- a/integrations/tray/manifest.json +++ b/integrations/tray/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@tray.io", "links": { "site": "https://tray.io/", - "launchdarklyDocs": "https://tray.io/documentation/platform/connectors/docs/service/launchdarkly/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/tray", "privacyPolicy": "https://tray.io/privacy" }, "categories": ["automation"], From 4a13633c14c79f5e1496582bd8d3ecef71400711 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 26 Aug 2021 16:32:49 +0100 Subject: [PATCH 442/936] Remove state parameter form servicenow-c0 creation request (#285) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index db4b2805..4aa96463 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -79,7 +79,7 @@ } ] }, - "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 1 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 2 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\",\"state\": \"Closed Complete\"}", + "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 1 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 2 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From 6f0025f9427465a0ad83bf20610737da06f2cb3d Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Fri, 27 Aug 2021 11:18:36 -0700 Subject: [PATCH 443/936] Updating ansible docs link (#284) --- integrations/ansible/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json index 5d0ff492..28f01437 100644 --- a/integrations/ansible/manifest.json +++ b/integrations/ansible/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://galaxy.ansible.com/launchdarkly_labs/collection", - "launchdarklyDocs": "https://launchdarkly-labs.github.io/ansible-launchdarkly-collection/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/ansible", "supportWebsite": "https://github.com/launchdarkly-labs/ansible-launchdarkly-collection/issues", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, From 226258af3a069c35edfec9ec2047d8e61a610ab7 Mon Sep 17 00:00:00 2001 From: carmenquan Date: Mon, 13 Sep 2021 13:08:17 -0700 Subject: [PATCH 444/936] [ch120153] Add support for new feature store capability (#286) * add new manifest for featureStore and cloudflare * fixing typo * update svg, update description * run prettier * removing period * fix newline * fixing whitespace, removing placeholders --- integrations/cloudflare/assets/horizontal.svg | 31 ++ integrations/cloudflare/assets/square.svg | 1 + integrations/cloudflare/manifest.json | 45 +++ manifest.schema.d.ts | 12 + manifest.schema.json | 291 +++++++++++++++++- schemas/base.json | 6 +- schemas/capabilities/featureStore.json | 25 ++ 7 files changed, 409 insertions(+), 2 deletions(-) create mode 100644 integrations/cloudflare/assets/horizontal.svg create mode 100644 integrations/cloudflare/assets/square.svg create mode 100644 integrations/cloudflare/manifest.json create mode 100644 schemas/capabilities/featureStore.json diff --git a/integrations/cloudflare/assets/horizontal.svg b/integrations/cloudflare/assets/horizontal.svg new file mode 100644 index 00000000..b4909ae0 --- /dev/null +++ b/integrations/cloudflare/assets/horizontal.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/cloudflare/assets/square.svg b/integrations/cloudflare/assets/square.svg new file mode 100644 index 00000000..5638be82 --- /dev/null +++ b/integrations/cloudflare/assets/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/cloudflare/manifest.json b/integrations/cloudflare/manifest.json new file mode 100644 index 00000000..1cbd6851 --- /dev/null +++ b/integrations/cloudflare/manifest.json @@ -0,0 +1,45 @@ +{ + "name": "Cloudflare", + "version": "1.0.0", + "overview": "Evaluate LaunchDarkly feature flags in Cloudflare Workers.", + "description": "Evaluate LaunchDarkly feature flags in Cloudflare Workers by storing flag data in Cloudflare's KV offering.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.cloudflare.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/cloudflare", + "privacyPolicy": "https://www.cloudflare.com/privacypolicy/" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "featureStore": { + "formVariables": [ + { + "key": "accountId", + "name": "Account ID", + "description": "Enter your Cloudflare account ID", + "type": "string", + "isSecret": false + }, + { + "key": "namespaceId", + "name": "KV Namespace", + "description": "Enter the KV namespace associated with your Worker", + "type": "string", + "isSecret": false + }, + { + "key": "apiToken", + "name": "API Token", + "description": "Enter the API token generated from Cloudflare", + "type": "string", + "isSecret": true + } + ] + } + } +} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index cf0a87e5..e1918bde 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -389,6 +389,10 @@ export type RejectionMatcher = string; * expected format for the external creation request URL. Values can be substituted in using {{value}} */ export type URLTemplate = string; +/** + * Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store + */ +export type ProviderFormVariables = FormVariable[]; /** * Describes the capabilities and intent of a LaunchDarkly integration @@ -498,6 +502,7 @@ export interface Capabilities { reservedCustomProperties?: ReservedCustomProperties; trigger?: Trigger; approval?: Approval; + featureStore?: FeatureStore; [k: string]: unknown; } /** @@ -634,3 +639,10 @@ export interface DeletionRequest { parser: ApprovalParser; [k: string]: unknown; } +/** + * This capability allows LaunchDarkly to write feature flag data to a given provider + */ +export interface FeatureStore { + formVariables: ProviderFormVariables; + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index 593ad497..5c361faf 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -537,7 +537,8 @@ "auditLogEventsHook", "reservedCustomProperties", "trigger", - "approval" + "approval", + "featureStore" ] }, "properties": { @@ -2367,6 +2368,294 @@ } } } + }, + "featureStore": { + "$id": "#/properties/capability/feature-store", + "title": "Feature store", + "description": "This capability allows LaunchDarkly to write feature flag data to a given provider", + "type": "object", + "propertyNames": { + "enum": [ + "formVariables" + ] + }, + "required": [ + "formVariables" + ], + "properties": { + "formVariables": { + "$id": "#/capabilities/feature-store/form-variables", + "title": "Provider form variables", + "description": "Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store", + "type": "array", + "items": { + "$id": "#/definitions/form-variable", + "title": "Form variable", + "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "description", + "placeholder", + "isSecret", + "isOptional", + "defaultValue", + "allowedValues", + "dynamicOptions" + ] + }, + "properties": { + "key": { + "$id": "#/definitions/form-variable/key", + "title": "Key", + "type": "string", + "description": "A key will be used as the token name when the variable is substituted", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "name": { + "$id": "#/definitions/form-variable/name", + "title": "Name", + "type": "string", + "description": "A descriptive name that will be used as the form label on the UI", + "maxLength": 50 + }, + "type": { + "$id": "#/definitions/form-variable/type", + "title": "Type", + "type": "string", + "description": "The type of the variable", + "enum": [ + "string", + "boolean", + "uri", + "enum", + "oauth", + "dynamicEnum" + ] + }, + "description": { + "$id": "#/definitions/form-variable/description", + "title": "Description", + "type": "string", + "description": "Describes the variable in the UI. Markdown links allowed.", + "maxLength": 250 + }, + "placeholder": { + "$id": "#/definitions/form-variable/placeholder", + "title": "Description", + "type": "string", + "description": "Placeholder value to use in the form element if applicable" + }, + "isSecret": { + "$id": "#/definitions/form-variable/is-secret", + "title": "Is this variable a secret?", + "type": "boolean", + "description": "Secret variables will be masked in the UI", + "default": false + }, + "isOptional": { + "$id": "#/definitions/form-variable/is-optional", + "title": "Is this variable optional?", + "type": "boolean", + "description": "Variables marked as optional won't be required on the UI", + "default": false + }, + "defaultValue": { + "$id": "#/definitions/form-variable/default-value", + "title": "Default value", + "type": [ + "boolean", + "string" + ], + "description": "Default value for variable. Can be overridden by the user in the UI" + }, + "allowedValues": { + "$id": "#/definitions/form-variable/allowed-values", + "title": "Allowed values", + "type": "array", + "description": "Allowed string values for enum-type formVariables", + "items": { + "type": "string" + } + }, + "dynamicOptions": { + "$id": "#/definitions/form-variable/dynamic-options", + "title": "Dynamic options", + "type": "object", + "description": "Parser and endpoint for handling dynamicEnum", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/definitions/form-variable/dynamic-options/parser", + "title": "Dynamic options parser", + "description": "Mapping of property names to location in JSON response", + "type": "object", + "required": [ + "optionsPath", + "optionsItems" + ], + "propertyNames": { + "enum": [ + "optionsPath", + "optionsItems" + ] + }, + "properties": { + "optionsPath": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-path", + "title": "Options array path", + "description": "JSON path to the array containing options for parsing", + "type": "string" + }, + "optionsItems": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items", + "title": "Options array", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/label", + "title": "Label", + "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", + "type": "string" + }, + "value": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/value", + "title": "Value", + "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", + "type": "string" + } + } + } + } + } + } + } + }, + "required": [ + "key", + "name", + "type", + "description" + ] + }, + "default": [] + } + } } } } diff --git a/schemas/base.json b/schemas/base.json index 98411601..30fd3047 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -246,7 +246,8 @@ "auditLogEventsHook", "reservedCustomProperties", "trigger", - "approval" + "approval", + "featureStore" ] }, "properties": { @@ -261,6 +262,9 @@ }, "approval": { "$ref": "schemas/capabilities/approval.json#/approval" + }, + "featureStore": { + "$ref": "schemas/capabilities/featureStore.json#/featureStore" } } } diff --git a/schemas/capabilities/featureStore.json b/schemas/capabilities/featureStore.json new file mode 100644 index 00000000..9a9fec42 --- /dev/null +++ b/schemas/capabilities/featureStore.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "featureStore": { + "$id": "#/properties/capability/feature-store", + "title": "Feature store", + "description": "This capability allows LaunchDarkly to write feature flag data to a given provider", + "type": "object", + "propertyNames": { + "enum": ["formVariables"] + }, + "required": ["formVariables"], + "properties": { + "formVariables": { + "$id": "#/capabilities/feature-store/form-variables", + "title": "Provider form variables", + "description": "Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store", + "type": "array", + "items": { + "$ref": "../definitions.json#/formVariable" + }, + "default": [] + } + } + } +} From 948d5e810ec2ee3bfcde88b7e6992f17c7451030 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 14 Sep 2021 10:23:29 -0500 Subject: [PATCH 445/936] Added includeErrorResponseBody property in autiLogEventHook capability --- docs/capabilities.md | 15 +++++++++++++++ manifest.schema.d.ts | 5 +++++ manifest.schema.json | 10 +++++++++- schemas/capabilities/auditLogEventsHook.json | 14 +++++++++++++- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index 1d7b6231..b670f31f 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -32,6 +32,7 @@ events in a LaunchDarkly account: ```json "capabilities": { "auditLogEventsHook": { + "includeErrorResponseBody": false, "endpoint": { "url": "{{endpointUrl}}", "method": "POST", @@ -247,6 +248,20 @@ Here is the policy: ] ``` +### Include error response body (`includeErrorResponseBody`) + +For endpoints defined with static domains - where the domain part of the endpoint isn't a template url (see example below), you have the option to specify an optional property `includeErrorResponseBody` in your `auditLogEventsHook` configuration to view any errors LaunchDarkly receives when it sends events to your endpoint. This is particularly useful for users troubleshooting issues with their integration. + +Heres the example: + +```json + "includeErrorResponseBody": true, + "endpoint": { + "url": "https://static-domian.com/apiToken?={{apiToken}}", + "method": "POST" + }, +``` + ### Validation To preview your integration's templates with sample data, run `npm run preview INTEGRATION_NAME`. diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 98494cfc..6c8dc284 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -292,6 +292,10 @@ export type NotResources = string[]; * A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. */ export type Resources = string[]; +/** + * Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI + */ +export type IncludeErrorResponseBody = boolean; /** * The reserved custom property's display name. */ @@ -503,6 +507,7 @@ export interface AuditLogEventsHook { endpoint: Endpoint; templates: WebhookBodyTemplate; defaultPolicy?: DefaultPolicy; + includeErrorResponseBody?: IncludeErrorResponseBody; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index d9b028f0..72df857b 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -550,7 +550,8 @@ "enum": [ "endpoint", "templates", - "defaultPolicy" + "defaultPolicy", + "includeErrorResponseBody" ] }, "properties": { @@ -793,6 +794,13 @@ } } } + }, + "includeErrorResponseBody": { + "$id": "#/properties/include-error-response-body", + "title": "Include error response body", + "type": "boolean", + "description": "Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI", + "default": false } }, "required": [ diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index be5b2888..f4a23a3e 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -6,7 +6,12 @@ "description": "This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint.", "type": "object", "propertyNames": { - "enum": ["endpoint", "templates", "defaultPolicy"] + "enum": [ + "endpoint", + "templates", + "defaultPolicy", + "includeErrorResponseBody" + ] }, "properties": { "endpoint": { @@ -133,6 +138,13 @@ } } } + }, + "includeErrorResponseBody": { + "$id": "#/properties/include-error-response-body", + "title": "Include error response body", + "type": "boolean", + "description": "Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI", + "default": false } }, "required": ["endpoint", "templates"] From 0f91b2f86af42c8e5f0fc9fa70208e0b4a214d6c Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 14 Sep 2021 10:25:43 -0500 Subject: [PATCH 446/936] Fixed typo --- docs/capabilities.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index b670f31f..1485577c 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -250,7 +250,7 @@ Here is the policy: ### Include error response body (`includeErrorResponseBody`) -For endpoints defined with static domains - where the domain part of the endpoint isn't a template url (see example below), you have the option to specify an optional property `includeErrorResponseBody` in your `auditLogEventsHook` configuration to view any errors LaunchDarkly receives when it sends events to your endpoint. This is particularly useful for users troubleshooting issues with their integration. +For endpoints defined with static domains - where the domain part of the endpoint isn't a template variable (see example below), you have the option to specify an optional property `includeErrorResponseBody` in your `auditLogEventsHook` configuration to view any errors LaunchDarkly receives when it sends events to your endpoint. This is particularly useful for users troubleshooting issues with their integration. Heres the example: From da9f4494991463c3bd68cb99f687368b6f2a30df Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 15 Sep 2021 17:46:20 +0100 Subject: [PATCH 447/936] [ch122281] Only include error response body for integrations that do not have customizable domains (#288) * Whitelist including error response body for integrations that do not have customizable domains * Remove feature from signalFX --- integrations/datadog/manifest.json | 1 + integrations/honeycomb/manifest.json | 1 + integrations/logdna/manifest.json | 1 + integrations/new-relic-apm/manifest.json | 1 + integrations/new-relic/manifest.json | 1 + integrations/sample-integration/manifest.json | 1 + 6 files changed, 6 insertions(+) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index f45155a7..d6ffb9ab 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -45,6 +45,7 @@ } ], "auditLogEventsHook": { + "includeErrorResponseBody": true, "endpoint": { "url": "{{hostURL}}/api/v1/events", "method": "POST", diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 332e4313..e77487f1 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -34,6 +34,7 @@ ], "capabilities": { "auditLogEventsHook": { + "includeErrorResponseBody": true, "endpoint": { "url": "https://api.honeycomb.io/1/markers/{{datasetName}}", "method": "POST", diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 0eb14252..15dfc0fd 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -36,6 +36,7 @@ ], "capabilities": { "auditLogEventsHook": { + "includeErrorResponseBody": true, "endpoint": { "url": "https://logs.logdna.com/logs/ingest?hostname=launchdarkly", "method": "POST", diff --git a/integrations/new-relic-apm/manifest.json b/integrations/new-relic-apm/manifest.json index 05ae4e55..a745e653 100644 --- a/integrations/new-relic-apm/manifest.json +++ b/integrations/new-relic-apm/manifest.json @@ -33,6 +33,7 @@ ], "capabilities": { "auditLogEventsHook": { + "includeErrorResponseBody": true, "endpoint": { "url": "https://api.newrelic.com/v2/applications/{{applicationId}}/deployments.json", "method": "POST", diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index c3b8ef26..9bef6396 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -33,6 +33,7 @@ ], "capabilities": { "auditLogEventsHook": { + "includeErrorResponseBody": true, "endpoint": { "url": "https://insights-collector.newrelic.com/v1/accounts/{{accountId}}/events", "method": "POST", diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 96c6f270..1992497c 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -93,6 +93,7 @@ ], "capabilities": { "auditLogEventsHook": { + "includeErrorResponseBody": true, "endpoint": { "url": "https://example.com/webhookin?color={{color}}", "method": "POST", From 8f8164a7df15318d2dedb1fbaaaf11730645aea9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 18:12:10 +0100 Subject: [PATCH 448/936] Bump tmpl from 1.0.4 to 1.0.5 (#289) Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5. - [Release notes](https://github.com/daaku/nodejs-tmpl/releases) - [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5) --- updated-dependencies: - dependency-name: tmpl dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f40c03d2..a680dfe1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4831,9 +4831,9 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-fast-properties": { From 81ab998d8bf2635f91e2002508bb99246b8ddebc Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 27 Sep 2021 13:39:53 +0100 Subject: [PATCH 449/936] Add cache control headers to integrations svgs (#290) --- scripts/copy_to_s3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh index 82cfe17d..94e6b0ff 100755 --- a/scripts/copy_to_s3.sh +++ b/scripts/copy_to_s3.sh @@ -2,6 +2,6 @@ export REV=$(git rev-parse HEAD | cut -c1-8) python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV -aws s3 cp --recursive --exclude "*" --include "*.svg" integrations s3://launchdarkly-static/integrations/$REV +aws s3 cp --recursive --exclude "*" --include "*.svg" integrations s3://launchdarkly-static/integrations/$REV --cache-control max-age=31536000 aws s3 cp manifest.schema.json s3://$BUCKET_NAME/integrations/$REV/manifest.schema.json --metadata-directive REPLACE --content-type "application/json" aws s3 cp latest s3://$BUCKET_NAME/latest.json --metadata-directive REPLACE --content-type "application/json" From d93f1e58314a8f497a2569a35414125d80cc3322 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 27 Sep 2021 15:14:46 +0100 Subject: [PATCH 450/936] Remove unused copy_to_s3.sh (#291) --- scripts/copy_to_s3.sh | 7 ------- 1 file changed, 7 deletions(-) delete mode 100755 scripts/copy_to_s3.sh diff --git a/scripts/copy_to_s3.sh b/scripts/copy_to_s3.sh deleted file mode 100755 index 94e6b0ff..00000000 --- a/scripts/copy_to_s3.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -export REV=$(git rev-parse HEAD | cut -c1-8) -python -c 'import glob, json, os; print json.dumps({"sha": os.environ["REV"], "integrations": [dir.split("/")[1] for dir in glob.glob("**/*/manifest.json")]})' > latest -aws s3 cp --recursive integrations s3://$BUCKET_NAME/integrations/$REV -aws s3 cp --recursive --exclude "*" --include "*.svg" integrations s3://launchdarkly-static/integrations/$REV --cache-control max-age=31536000 -aws s3 cp manifest.schema.json s3://$BUCKET_NAME/integrations/$REV/manifest.schema.json --metadata-directive REPLACE --content-type "application/json" -aws s3 cp latest s3://$BUCKET_NAME/latest.json --metadata-directive REPLACE --content-type "application/json" From db5b065468d9bc5f2b032d3b0f894d30f55cc06a Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 28 Sep 2021 14:38:55 +0100 Subject: [PATCH 451/936] [sc-123860] Clubouse GH action -> Shortcut (#292) * Clubouse GH action -> Shortcut * Update name of action --- .github/workflows/pull_request.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 708d8125..bac1bb31 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -1,14 +1,15 @@ on: pull_request name: Pull request jobs: - setClubhouseLinkInPR: + setShortcutLinkInPR: if: github.repository == 'launchdarkly/integration-framework-private' - name: Set Clubhouse Link in PR + name: Set Shortcut Link in PR runs-on: ubuntu-latest steps: - - name: Set Clubhouse Link in PR - uses: launchdarkly/ld-gh-actions-clubhouse/set-ch-link@master + - uses: actions/checkout@v2 + - name: Set Shortcut Link in PR + uses: launchdarkly-labs/ld-gh-actions-shortcut/set-link@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - STORY_BASE_URL: https://app.clubhouse.io/launchdarkly/story - CREATE_STORY_URL: https://app.clubhouse.io/launchdarkly/stories/new?template_id=5f3fbdce-dfa0-446b-91c5-0cf6e01f5045 + AUTOLINK_PREFIX: 'SC-' + CREATE_STORY_URL: https://app.shortcut.com/launchdarkly/stories/new?template_id=5f3fbdce-dfa0-446b-91c5-0cf6e01f5045 From 26942531d6f754153cd4505922ca4dc0c146f3ec Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 6 Oct 2021 10:22:41 -0400 Subject: [PATCH 452/936] [sc-122283] add test to check domain is static when includeErrorResponseBody is set to true (#293) * this should work * account for dynamic subdomains * check for multiple substrings in hostname --- __tests__/validateIntegrationManifests.js | 50 +++++++++++++++++++++++ package-lock.json | 19 +++++++++ package.json | 3 +- 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 2a6929da..047cbcc7 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -12,6 +12,8 @@ const environmentContext = require('../sample-context/environment/update'); const OAUTH_INTEGRATIONS = ['appdynamics', 'servicenow']; // add oauth integrations here +var parse = require('url-parse'); + registerHelpers(); const getDirectories = source => @@ -157,6 +159,54 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'includeErrorResponseBody is only true if endpoint domain is static for %s', + (key, manifest) => { + const includeErrorResponseBody = _.get( + manifest, + 'capabilities.auditLogEventsHook.includeErrorResponseBody', + null + ); + if (includeErrorResponseBody) { + // if there is no host domain replacement in the `endpoint` field then we are fine + const endpointUrlTemplate = _.get( + manifest, + 'capabilities.auditLogEventsHook.endpoint.url', + null + ); + if (endpointUrlTemplate.startsWith('{{')) { + const varName = endpointUrlTemplate.substring( + 2, + endpointUrlTemplate.indexOf('}') + ); + // if there is and that variable is an enum or has some form of validation, we are fine + const formVariables = _.get(manifest, 'formVariables', null); + for (let i = 0; i < formVariables.length; i++) { + if (formVariables[i].key == varName) { + expect(formVariables[i].type).toBe('enum'); + expect(formVariables[i].allowedValues).not.toBe(null); + } + } + } + // we also want to check that there are no dynamic subdomains, ex. signalfx + const hostname = parse(endpointUrlTemplate, true).hostname; + if (hostname.includes('{{')) { + const regexp = /{{(\w+)}}/g; + const dynamicHostVars = [...hostname.matchAll(regexp)]; + const formVariables = _.get(manifest, 'formVariables', null); + for (let i = 0; i < formVariables.length; i++) { + for (let j = 0; j < dynamicHostVars.length; j++) { + if (formVariables[i].key.lower() == dynamicHostVars[j][1]) { + expect(formVariables[i].type).toBe('enum'); + expect(formVariables[i].allowedValues).not.toBe(null); + } + } + } + } + } + } + ); + test.each(manifests)( 'defaultValue types match the type of the formVariable for %s', (key, manifest) => { diff --git a/package-lock.json b/package-lock.json index a680dfe1..675ef657 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3793,6 +3793,11 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "react-is": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", @@ -3950,6 +3955,11 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -5036,6 +5046,15 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", diff --git a/package.json b/package.json index 7476d868..3cc2400e 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "prettier": "^2.0.1" }, "dependencies": { - "dateformat": "^4.5.1" + "dateformat": "^4.5.1", + "url-parse": "^1.5.3" } } From 0351773719fc82f226734807842688d5e33d4ff7 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 6 Oct 2021 15:04:39 -0400 Subject: [PATCH 453/936] [sc-124497] add connector ui blocks to prelim capability schema (#294) * add connector ui blocks to prelim capability schema * forgot to commit parser * update description --- schemas/capabilities/externalReferences.json | 71 ++++++++++++++++++++ schemas/capabilities/parser/parser.json | 22 ++++++ 2 files changed, 93 insertions(+) create mode 100644 schemas/capabilities/externalReferences.json diff --git a/schemas/capabilities/externalReferences.json b/schemas/capabilities/externalReferences.json new file mode 100644 index 00000000..784456d0 --- /dev/null +++ b/schemas/capabilities/externalReferences.json @@ -0,0 +1,71 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "externalReferences": { + "$id": "#/properties/capability/external-references", + "title": "External Flag References", + "description": "This capability is used to manage inbound flag reference webhooks", + "type": "object", + "propertyNames": { + "enum": ["connector", "parser"] + }, + "properties": { + "connector": { + "$id": "#/properties/capability/external-references/connector", + "title": "External Flag References Connector", + "description": "Receiver configuration for inbound flag reference", + "type": "object", + "properties": { + "uiBlocks": { + "$id": "#/properties/capability/external-references/connector/ui-blocks", + "title": "Flag References UI Blocks", + "description": "List of UI display details corresponding to properties on the LaunchDarkly Flag References tab", + "type": "array", + "items": { + "type": "object" + }, + "propertyNames": { + "enum": ["key", "name", "type", "path"] + }, + "properties": { + "key": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/key", + "title": "Key", + "type": "string", + "description": "The unique key corresponding to the property to be displayed", + "maxLength": 50 + }, + "name": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/name", + "title": "Name", + "type": "string", + "description": "The display name of the property", + "maxLength": 50 + }, + "type": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/type", + "title": "Type", + "type": "enum", + "allowedValues": [ + "context", + "avatar", + "message", + "codeSnippet" + ], + "description": "The type of the information this UI block will display" + }, + "path": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/path", + "title": "Path", + "type": "string", + "description": "The JSON path corresponding to where the information can be found in the incoming payload" + } + } + } + } + }, + "parser": { + "$ref": "parser/parser.json#/externalReferencesParser" + } + } + } +} diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index 0b804a6b..2b520c9c 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -123,5 +123,27 @@ } } } + }, + "externalReferencesParser": { + "$id": "#/external-references-parser", + "title": "External references parser", + "description": "Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": ["uiBlocks"] + }, + "properties": { + "uiBlocks": { + "$id": "#/external-references-parser/ui-blocks", + "title": "UI block pointers", + "description": "An array of JSON pointers to UI block items", + "type": "array", + "items": { + "$id": "#/external-references-parser/ui-blocks/items", + "title": "UI block pointer items", + "type": "string" + } + } + } } } From 12de292ca9342b3dc94f620d92bf45bc908bebd3 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 6 Oct 2021 16:37:07 -0400 Subject: [PATCH 454/936] forgot to actually add to base.json (#295) --- manifest.schema.d.ts | 34 +++++++ manifest.schema.json | 94 +++++++++++++++++++- schemas/base.json | 6 +- schemas/capabilities/externalReferences.json | 8 +- 4 files changed, 133 insertions(+), 9 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index a1387e47..85fcafda 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -397,6 +397,17 @@ export type URLTemplate = string; * Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store */ export type ProviderFormVariables = FormVariable[]; +/** + * List of UI display details corresponding to properties on the LaunchDarkly Flag References tab + */ +export type FlagReferencesUIBlocks = { + [k: string]: unknown; +}[]; +export type UIBlockPointerItems = string; +/** + * An array of JSON pointers to UI block items + */ +export type UIBlockPointers = UIBlockPointerItems[]; /** * Describes the capabilities and intent of a LaunchDarkly integration @@ -507,6 +518,7 @@ export interface Capabilities { trigger?: Trigger; approval?: Approval; featureStore?: FeatureStore; + externalReferences?: ExternalFlagReferences; [k: string]: unknown; } /** @@ -651,3 +663,25 @@ export interface FeatureStore { formVariables: ProviderFormVariables; [k: string]: unknown; } +/** + * This capability is used to manage inbound flag reference webhooks + */ +export interface ExternalFlagReferences { + connector?: ExternalFlagReferencesConnector; + parser?: ExternalReferencesParser; + [k: string]: unknown; +} +/** + * Receiver configuration for inbound flag reference + */ +export interface ExternalFlagReferencesConnector { + uiBlocks?: FlagReferencesUIBlocks; + [k: string]: unknown; +} +/** + * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer + */ +export interface ExternalReferencesParser { + uiBlocks?: UIBlockPointers; + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index 36d2f1af..4a04369e 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -538,7 +538,8 @@ "reservedCustomProperties", "trigger", "approval", - "featureStore" + "featureStore", + "externalReferences" ] }, "properties": { @@ -2664,6 +2665,97 @@ "default": [] } } + }, + "externalReferences": { + "$id": "#/properties/capability/external-references", + "title": "External Flag References", + "description": "This capability is used to manage inbound flag reference webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "connector", + "parser" + ] + }, + "properties": { + "connector": { + "$id": "#/properties/capability/external-references/connector", + "title": "External Flag References Connector", + "description": "Receiver configuration for inbound flag reference", + "type": "object", + "properties": { + "uiBlocks": { + "$id": "#/properties/capability/external-references/connector/ui-blocks", + "title": "Flag References UI Blocks", + "description": "List of UI display details corresponding to properties on the LaunchDarkly Flag References tab", + "type": "array", + "items": { + "type": "object" + }, + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "path" + ] + }, + "properties": { + "key": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/key", + "title": "Key", + "type": "string", + "description": "The unique key corresponding to the property to be displayed", + "maxLength": 50 + }, + "name": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/name", + "title": "Name", + "type": "string", + "description": "The display name of the property", + "maxLength": 50 + }, + "type": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/type", + "title": "Type", + "type": "array", + "description": "The type of the information this UI block will display" + }, + "path": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/path", + "title": "Path", + "type": "string", + "description": "The JSON path corresponding to where the information can be found in the incoming payload" + } + } + } + } + }, + "parser": { + "$id": "#/external-references-parser", + "title": "External references parser", + "description": "Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": [ + "uiBlocks" + ] + }, + "properties": { + "uiBlocks": { + "$id": "#/external-references-parser/ui-blocks", + "title": "UI block pointers", + "description": "An array of JSON pointers to UI block items", + "type": "array", + "items": { + "$id": "#/external-references-parser/ui-blocks/items", + "title": "UI block pointer items", + "type": "string" + } + } + } + } + } } } } diff --git a/schemas/base.json b/schemas/base.json index 30fd3047..b72e9935 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -247,7 +247,8 @@ "reservedCustomProperties", "trigger", "approval", - "featureStore" + "featureStore", + "externalReferences" ] }, "properties": { @@ -265,6 +266,9 @@ }, "featureStore": { "$ref": "schemas/capabilities/featureStore.json#/featureStore" + }, + "externalReferences": { + "$ref": "schemas/capabilities/externalReferences.json#/externalReferences" } } } diff --git a/schemas/capabilities/externalReferences.json b/schemas/capabilities/externalReferences.json index 784456d0..76faca3a 100644 --- a/schemas/capabilities/externalReferences.json +++ b/schemas/capabilities/externalReferences.json @@ -44,13 +44,7 @@ "type": { "$id": "#/properties/capability/external-references/connector/ui-blocks/type", "title": "Type", - "type": "enum", - "allowedValues": [ - "context", - "avatar", - "message", - "codeSnippet" - ], + "type": "array", "description": "The type of the information this UI block will display" }, "path": { From e9c28cfe493e9f15baa0cbef1cb41949648f12cd Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 11 Oct 2021 15:04:47 -0400 Subject: [PATCH 455/936] a few small edits (#296) * forgot brace * some updates --- manifest.schema.d.ts | 33 +++--- manifest.schema.json | 100 ++++++++----------- schemas/capabilities/externalReferences.json | 64 ++++++------ schemas/capabilities/parser/parser.json | 22 ---- 4 files changed, 92 insertions(+), 127 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 85fcafda..989c7159 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -397,17 +397,32 @@ export type URLTemplate = string; * Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store */ export type ProviderFormVariables = FormVariable[]; +/** + * The unique key corresponding to the property to be displayed + */ +export type Key2 = string; +/** + * The display name of the property + */ +export type Name3 = string; +/** + * The type of the information this UI block will display + */ +export type Type1 = "context" | "avatar" | "message" | "codeSnippet"; +/** + * The JSON path corresponding to where the information can be found in the incoming payload + */ +export type Path = string; /** * List of UI display details corresponding to properties on the LaunchDarkly Flag References tab */ export type FlagReferencesUIBlocks = { + key?: Key2; + name?: Name3; + type?: Type1; + path?: Path; [k: string]: unknown; }[]; -export type UIBlockPointerItems = string; -/** - * An array of JSON pointers to UI block items - */ -export type UIBlockPointers = UIBlockPointerItems[]; /** * Describes the capabilities and intent of a LaunchDarkly integration @@ -668,7 +683,6 @@ export interface FeatureStore { */ export interface ExternalFlagReferences { connector?: ExternalFlagReferencesConnector; - parser?: ExternalReferencesParser; [k: string]: unknown; } /** @@ -678,10 +692,3 @@ export interface ExternalFlagReferencesConnector { uiBlocks?: FlagReferencesUIBlocks; [k: string]: unknown; } -/** - * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer - */ -export interface ExternalReferencesParser { - uiBlocks?: UIBlockPointers; - [k: string]: unknown; -} diff --git a/manifest.schema.json b/manifest.schema.json index 4a04369e..33fa37bd 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2690,70 +2690,52 @@ "description": "List of UI display details corresponding to properties on the LaunchDarkly Flag References tab", "type": "array", "items": { - "type": "object" - }, - "propertyNames": { - "enum": [ - "key", - "name", - "type", - "path" - ] - }, - "properties": { - "key": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/key", - "title": "Key", - "type": "string", - "description": "The unique key corresponding to the property to be displayed", - "maxLength": 50 - }, - "name": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/name", - "title": "Name", - "type": "string", - "description": "The display name of the property", - "maxLength": 50 - }, - "type": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/type", - "title": "Type", - "type": "array", - "description": "The type of the information this UI block will display" + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "path" + ] }, - "path": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/path", - "title": "Path", - "type": "string", - "description": "The JSON path corresponding to where the information can be found in the incoming payload" + "properties": { + "key": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/key", + "title": "Key", + "type": "string", + "description": "The unique key corresponding to the property to be displayed", + "maxLength": 50 + }, + "name": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/name", + "title": "Name", + "type": "string", + "description": "The display name of the property", + "maxLength": 50 + }, + "type": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/type", + "title": "Type", + "type": "string", + "enum": [ + "context", + "avatar", + "message", + "codeSnippet" + ], + "description": "The type of the information this UI block will display" + }, + "path": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/path", + "title": "Path", + "type": "string", + "description": "The JSON path corresponding to where the information can be found in the incoming payload" + } } } } } - }, - "parser": { - "$id": "#/external-references-parser", - "title": "External references parser", - "description": "Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer", - "type": "object", - "propertyNames": { - "enum": [ - "uiBlocks" - ] - }, - "properties": { - "uiBlocks": { - "$id": "#/external-references-parser/ui-blocks", - "title": "UI block pointers", - "description": "An array of JSON pointers to UI block items", - "type": "array", - "items": { - "$id": "#/external-references-parser/ui-blocks/items", - "title": "UI block pointer items", - "type": "string" - } - } - } } } } diff --git a/schemas/capabilities/externalReferences.json b/schemas/capabilities/externalReferences.json index 76faca3a..8d8a5d0c 100644 --- a/schemas/capabilities/externalReferences.json +++ b/schemas/capabilities/externalReferences.json @@ -21,44 +21,42 @@ "description": "List of UI display details corresponding to properties on the LaunchDarkly Flag References tab", "type": "array", "items": { - "type": "object" - }, - "propertyNames": { - "enum": ["key", "name", "type", "path"] - }, - "properties": { - "key": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/key", - "title": "Key", - "type": "string", - "description": "The unique key corresponding to the property to be displayed", - "maxLength": 50 + "type": "object", + "propertyNames": { + "enum": ["key", "name", "type", "path"] }, - "name": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/name", - "title": "Name", - "type": "string", - "description": "The display name of the property", - "maxLength": 50 - }, - "type": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/type", - "title": "Type", - "type": "array", - "description": "The type of the information this UI block will display" - }, - "path": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/path", - "title": "Path", - "type": "string", - "description": "The JSON path corresponding to where the information can be found in the incoming payload" + "properties": { + "key": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/key", + "title": "Key", + "type": "string", + "description": "The unique key corresponding to the property to be displayed", + "maxLength": 50 + }, + "name": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/name", + "title": "Name", + "type": "string", + "description": "The display name of the property", + "maxLength": 50 + }, + "type": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/type", + "title": "Type", + "type": "string", + "enum": ["context", "avatar", "message", "codeSnippet"], + "description": "The type of the information this UI block will display" + }, + "path": { + "$id": "#/properties/capability/external-references/connector/ui-blocks/path", + "title": "Path", + "type": "string", + "description": "The JSON path corresponding to where the information can be found in the incoming payload" + } } } } } - }, - "parser": { - "$ref": "parser/parser.json#/externalReferencesParser" } } } diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index 2b520c9c..0b804a6b 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -123,27 +123,5 @@ } } } - }, - "externalReferencesParser": { - "$id": "#/external-references-parser", - "title": "External references parser", - "description": "Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer", - "type": "object", - "propertyNames": { - "enum": ["uiBlocks"] - }, - "properties": { - "uiBlocks": { - "$id": "#/external-references-parser/ui-blocks", - "title": "UI block pointers", - "description": "An array of JSON pointers to UI block items", - "type": "array", - "items": { - "$id": "#/external-references-parser/ui-blocks/items", - "title": "UI block pointer items", - "type": "string" - } - } - } } } From 951cf6c15196c8a8221a83f1530eaf36e1264dea Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 11 Oct 2021 16:16:36 -0400 Subject: [PATCH 456/936] naming updates and add new types (#297) --- manifest.schema.d.ts | 10 +++++----- manifest.schema.json | 16 ++++++++-------- schemas/capabilities/externalReferences.json | 12 ++++++------ 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 989c7159..1ca0a593 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -406,17 +406,17 @@ export type Key2 = string; */ export type Name3 = string; /** - * The type of the information this UI block will display + * The data type of the information this metadata block will display */ -export type Type1 = "context" | "avatar" | "message" | "codeSnippet"; +export type Type1 = "avatar" | "codeSnippet" | "string" | "multilineText"; /** * The JSON path corresponding to where the information can be found in the incoming payload */ export type Path = string; /** - * List of UI display details corresponding to properties on the LaunchDarkly Flag References tab + * List of metadata blocks corresponding to information on the LaunchDarkly External References tab */ -export type FlagReferencesUIBlocks = { +export type FlagReferencesMetadata = { key?: Key2; name?: Name3; type?: Type1; @@ -689,6 +689,6 @@ export interface ExternalFlagReferences { * Receiver configuration for inbound flag reference */ export interface ExternalFlagReferencesConnector { - uiBlocks?: FlagReferencesUIBlocks; + metadata?: FlagReferencesMetadata; [k: string]: unknown; } diff --git a/manifest.schema.json b/manifest.schema.json index 33fa37bd..54e6e194 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2684,10 +2684,10 @@ "description": "Receiver configuration for inbound flag reference", "type": "object", "properties": { - "uiBlocks": { - "$id": "#/properties/capability/external-references/connector/ui-blocks", - "title": "Flag References UI Blocks", - "description": "List of UI display details corresponding to properties on the LaunchDarkly Flag References tab", + "metadata": { + "$id": "#/properties/capability/external-references/connector/metadata", + "title": "Flag References Metadata", + "description": "List of metadata blocks corresponding to information on the LaunchDarkly External References tab", "type": "array", "items": { "type": "object", @@ -2719,12 +2719,12 @@ "title": "Type", "type": "string", "enum": [ - "context", "avatar", - "message", - "codeSnippet" + "codeSnippet", + "string", + "multilineText" ], - "description": "The type of the information this UI block will display" + "description": "The data type of the information this metadata block will display" }, "path": { "$id": "#/properties/capability/external-references/connector/ui-blocks/path", diff --git a/schemas/capabilities/externalReferences.json b/schemas/capabilities/externalReferences.json index 8d8a5d0c..0fa893ce 100644 --- a/schemas/capabilities/externalReferences.json +++ b/schemas/capabilities/externalReferences.json @@ -15,10 +15,10 @@ "description": "Receiver configuration for inbound flag reference", "type": "object", "properties": { - "uiBlocks": { - "$id": "#/properties/capability/external-references/connector/ui-blocks", - "title": "Flag References UI Blocks", - "description": "List of UI display details corresponding to properties on the LaunchDarkly Flag References tab", + "metadata": { + "$id": "#/properties/capability/external-references/connector/metadata", + "title": "Flag References Metadata", + "description": "List of metadata blocks corresponding to information on the LaunchDarkly External References tab", "type": "array", "items": { "type": "object", @@ -44,8 +44,8 @@ "$id": "#/properties/capability/external-references/connector/ui-blocks/type", "title": "Type", "type": "string", - "enum": ["context", "avatar", "message", "codeSnippet"], - "description": "The type of the information this UI block will display" + "enum": ["avatar", "codeSnippet", "string", "multilineText"], + "description": "The data type of the information this metadata block will display" }, "path": { "$id": "#/properties/capability/external-references/connector/ui-blocks/path", From 3246e507c4cca6575c2554b77237ac8ae8763787 Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Tue, 12 Oct 2021 11:34:05 -0400 Subject: [PATCH 457/936] small updates for cloudflare --- integrations/cloudflare/manifest.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/cloudflare/manifest.json b/integrations/cloudflare/manifest.json index 1cbd6851..adff4a29 100644 --- a/integrations/cloudflare/manifest.json +++ b/integrations/cloudflare/manifest.json @@ -1,8 +1,8 @@ { "name": "Cloudflare", "version": "1.0.0", - "overview": "Evaluate LaunchDarkly feature flags in Cloudflare Workers.", - "description": "Evaluate LaunchDarkly feature flags in Cloudflare Workers by storing flag data in Cloudflare's KV offering.", + "overview": "Evaluate feature flags and bootstrap the LaunchDarkly Javascript SDK from Cloudflare Workers.", + "description": "Evaluate feature flags and bootstrap the LaunchDarkly Javascript SDK from Cloudflare Workers by storing flag data in Cloudflare's KV offering.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { @@ -21,21 +21,21 @@ { "key": "accountId", "name": "Account ID", - "description": "Enter your Cloudflare account ID", + "description": "Enter your Cloudflare account ID. This can be found on your Workers Dashboard or using [Wrangler CLI](https://developers.cloudflare.com/workers/get-started/guide)", "type": "string", "isSecret": false }, { "key": "namespaceId", "name": "KV Namespace", - "description": "Enter the KV namespace associated with your Worker", + "description": "You must have a KV namespace available for flag updates. Enter the KV namespace associated with your Worker", "type": "string", "isSecret": false }, { "key": "apiToken", "name": "API Token", - "description": "Enter the API token generated from Cloudflare", + "description": "Enter the API token generated from Cloudflare. Instructions for generating a [Cloudflare API token](https://developers.cloudflare.com/api/tokens/create)", "type": "string", "isSecret": true } From cf3f75c7ec9b462994d33c6625e6f26cbff8fe5a Mon Sep 17 00:00:00 2001 From: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Date: Mon, 18 Oct 2021 12:35:03 -0700 Subject: [PATCH 458/936] updating doc links (#299) --- docs/capabilities.md | 6 +- integrations/adfs/manifest.json | 2 +- integrations/azure-event-hubs/manifest.json | 2 +- integrations/azure-sso/manifest.json | 4 +- integrations/bitbucket-flags/manifest.json | 6 +- integrations/bitbucket/manifest.json | 2 +- integrations/circleci-coderefs/manifest.json | 2 +- integrations/datadog/manifest.json | 2 +- integrations/elastic/README.md | 2 +- integrations/generic-trigger/README.md | 2 +- integrations/generic-trigger/manifest.json | 4 +- integrations/git/manifest.json | 2 +- integrations/github/manifest.json | 2 +- integrations/gitlab-coderefs/manifest.json | 2 +- integrations/google-pubsub/manifest.json | 2 +- integrations/googleapps-sso/manifest.json | 2 +- integrations/honeycomb/manifest.json | 2 +- integrations/jira/manifest.json | 2 +- integrations/kinesis/manifest.json | 2 +- integrations/mparticle/manifest.json | 2 +- integrations/msteams/manifest.json | 4 +- integrations/new-relic-apm/manifest.json | 2 +- integrations/okta/manifest.json | 2 +- integrations/onelogin/manifest.json | 2 +- integrations/segment/manifest.json | 2 +- integrations/signalfx/README.md | 2 +- integrations/splunk/manifest.json | 2 +- integrations/terraform/manifest.json | 2 +- integrations/vscode/manifest.json | 2 +- integrations/webhooks/manifest.json | 4 +- manifest.schema.d.ts | 14 +- manifest.schema.json | 14 +- package-lock.json | 6598 ++++++++++++++++- schemas/capabilities/auditLogEventsHook.json | 12 +- .../reservedCustomProperties.json | 2 +- 35 files changed, 6654 insertions(+), 62 deletions(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index 1485577c..caa370d1 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -23,7 +23,7 @@ The `auditLogEventsHook` has three properties: A map of template paths relative to your integration's directory. You can use templates to transform the raw audit log events to a format that your integration expects. These templates can be any file type. 3. [`defaultPolicy`](#default-policy): An array of [LaunchDarkly - policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) that + policies](https://docs.launchdarkly.com/home/members/role-policies) that act as a filter determining which events to send to your webhook endpoint. Here's an example of an audit log events hook capability that subscribes to flag @@ -230,7 +230,7 @@ Sandbox](http://tryhandlebarsjs.com/). ### Default policy When you configure your integration, customers can specify an array of [LaunchDarkly -policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) filter which events to send to your webhook endpoint. +policies](https://docs.launchdarkly.com/home/members/role-policies) filter which events to send to your webhook endpoint. To simplify onboarding your integration, you can specify a default policy which follows best practices for your integration's use case. @@ -304,7 +304,7 @@ Here is a sample `trigger` capability including all optional properties: Custom properties allow you to store data in LaunchDarkly alongside a feature flag. For example, you can use custom properties to indicate flag-level associations with data on your service. If you don't have any flag-level associations or configurations, you don't need to use this capability. -To learn more, read [Custom properties](https://docs.launchdarkly.com/home/advanced/custom-properties). +To learn more, read [Custom properties](https://docs.launchdarkly.com/home/connecting/custom-properties). By default, users must specify a custom property name and key when they attach the custom property value to a feature flag. This step introduces the possibility of user error. To prevent this, developers can _reserve_ a custom property for their integration, which makes it much easier for users to correctly add the property's value to feature flags. diff --git a/integrations/adfs/manifest.json b/integrations/adfs/manifest.json index cd4c0ba4..a1c46048 100644 --- a/integrations/adfs/manifest.json +++ b/integrations/adfs/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.microsoft.com/en-us/windows-server/identity/active-directory-federation-services", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/adfs", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/account-security/adfs", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/azure-event-hubs/manifest.json b/integrations/azure-event-hubs/manifest.json index 03c688b8..b86c3cb1 100644 --- a/integrations/azure-event-hubs/manifest.json +++ b/integrations/azure-event-hubs/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://azure.microsoft.com/en-us/services/event-hubs/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/event-hub", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/event-hub", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/azure-sso/manifest.json b/integrations/azure-sso/manifest.json index 5210a0be..dcc9af9f 100644 --- a/integrations/azure-sso/manifest.json +++ b/integrations/azure-sso/manifest.json @@ -7,8 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/docs/azure", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/azure", + "site": "https://docs.launchdarkly.com/home/account-security/azure", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/account-security/azure", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/bitbucket-flags/manifest.json b/integrations/bitbucket-flags/manifest.json index f73bec19..3ea82e12 100644 --- a/integrations/bitbucket-flags/manifest.json +++ b/integrations/bitbucket-flags/manifest.json @@ -8,9 +8,9 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://bitbucket.org/product/features/pipelines", - "supportWebsite": "https://docs.launchdarkly.com/docs/bitbucket-pipelines", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/bitbucket-pipelines", - "privacyPolicy": "https://docs.launchdarkly.com/docs/git-code-references#section-configuring-context-lines" + "supportWebsite": "https://docs.launchdarkly.com/integrations/bitbucket-pipelines", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/bitbucket-pipelines", + "privacyPolicy": "https://docs.launchdarkly.com/home/code/code-references#configuring-context-lines" }, "categories": ["automation", "developer-tools"], "icons": { diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json index 52f76eba..e891addc 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://bitbucket.org/product/features/pipelines", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/code-references/bitbucket-pipes", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/code/bitbucket", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json index d27a7e38..1c599c11 100644 --- a/integrations/circleci-coderefs/manifest.json +++ b/integrations/circleci-coderefs/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://circleci.com/orbs/", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/circleci-orbs", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/code/circleci", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index d6ffb9ab..bba27fa6 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -75,7 +75,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/datadog/triggers#connecting-a-trigger-to-datadog", + "documentation": "https://docs.launchdarkly.com/integrations/datadog/triggers#connecting-a-flag-trigger-to-datadog", "testEventNameRegexp": ".+ \\[TEST\\].+", "parser": { "eventName": "/title", diff --git a/integrations/elastic/README.md b/integrations/elastic/README.md index e77816a4..96b0831a 100644 --- a/integrations/elastic/README.md +++ b/integrations/elastic/README.md @@ -1,6 +1,6 @@ # The Elastic (ELK) Stack Integration -[User documentation](https://docs.launchdarkly.com/integrations/elastic) +[User documentation](https://docs.launchdarkly.com/integrations/elastic-stack) [API documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) diff --git a/integrations/generic-trigger/README.md b/integrations/generic-trigger/README.md index d549b73f..ec669a56 100644 --- a/integrations/generic-trigger/README.md +++ b/integrations/generic-trigger/README.md @@ -1,3 +1,3 @@ # Generic trigger -This integration allows for *any* tool with outbound webhook capabilities to utilize LaunchDarkly's triggers functionality. See https://docs.launchdarkly.com/integrations/triggers#creating-a-new-trigger for more information. +This integration allows for *any* tool with outbound webhook capabilities to utilize LaunchDarkly's triggers functionality. See https://docs.launchdarkly.com/home/feature-workflows/triggers#creating-a-new-flag-trigger for more information. diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json index 598025e2..c94237fe 100644 --- a/integrations/generic-trigger/manifest.json +++ b/integrations/generic-trigger/manifest.json @@ -7,7 +7,7 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/triggers", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/feature-workflows/triggers", "site": "https://launchdarkly.com", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, @@ -18,7 +18,7 @@ }, "capabilities": { "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/triggers#creating-a-new-trigger", + "documentation": "https://docs.launchdarkly.com/home/feature-workflows/triggers#creating-a-new-flag-trigger", "defaultEventName": "An event", "parser": { "eventName": "/eventName", diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json index c8e292a9..b95ec0a9 100644 --- a/integrations/git/manifest.json +++ b/integrations/git/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://github.com/launchdarkly/ld-find-code-refs/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/git-code-references", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/code/code-references", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index 85c933a9..3fc69cea 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://github.com/features/actions", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/code-references/github-actions", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/code/github-actions", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab-coderefs/manifest.json index 4e07e09d..9919392c 100644 --- a/integrations/gitlab-coderefs/manifest.json +++ b/integrations/gitlab-coderefs/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/gitlab-ci", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/code/gitlab", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/google-pubsub/manifest.json b/integrations/google-pubsub/manifest.json index 712ee696..83c6e71b 100644 --- a/integrations/google-pubsub/manifest.json +++ b/integrations/google-pubsub/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://cloud.google.com/pubsub", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/google-pubsub", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/google-pubsub", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/googleapps-sso/manifest.json b/integrations/googleapps-sso/manifest.json index 22a04ea1..8b6ca8c0 100644 --- a/integrations/googleapps-sso/manifest.json +++ b/integrations/googleapps-sso/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://cloud.google.com/identity/sso", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/google-apps", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/account-security/google", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index e77487f1..a1cf20f0 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -62,7 +62,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/honeycomb/triggers#connecting-a-launchdarkly-trigger-to-honeycomb", + "documentation": "https://docs.launchdarkly.com/integrations/honeycomb/triggers#connecting-a-flag-trigger-to-honeycomb", "parser": { "eventName": "/name", "url": "/result_url" diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 76fea4df..c0c65103 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.atlassian.com/software/jira", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/jira", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/jira", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["issue-tracking"], diff --git a/integrations/kinesis/manifest.json b/integrations/kinesis/manifest.json index c85f652b..914cbe89 100644 --- a/integrations/kinesis/manifest.json +++ b/integrations/kinesis/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://aws.amazon.com/kinesis/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/kinesis", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/kinesis", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/mparticle/manifest.json b/integrations/mparticle/manifest.json index afe3d426..5916c8c1 100644 --- a/integrations/mparticle/manifest.json +++ b/integrations/mparticle/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.mparticle.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/mparticle", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/mparticle", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index e1fee7e7..d3931f14 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.microsoft.com/microsoft-365/microsoft-teams/group-chat-software", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/msteams", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/microsoft-teams", "privacyPolicy": "https://privacy.microsoft.com/en-us" }, "categories": ["messaging"], @@ -20,7 +20,7 @@ "key": "url", "name": "Incoming webhook URL", "type": "uri", - "description": "Enter your Microsoft Teams [incoming webhook URL](https://docs.launchdarkly.com/docs/microsoft-teams#section-setting-up-a-connector-in-microsoft-teams).", + "description": "Enter your Microsoft Teams [incoming webhook URL](https://docs.launchdarkly.com/integrations/microsoft-teams#setting-up-a-connector-in-microsoft-teams).", "isSecret": false } ], diff --git a/integrations/new-relic-apm/manifest.json b/integrations/new-relic-apm/manifest.json index a745e653..bf944b02 100644 --- a/integrations/new-relic-apm/manifest.json +++ b/integrations/new-relic-apm/manifest.json @@ -61,7 +61,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/new-relic/triggers#connecting-a-launchdarkly-trigger-to-new-relic-one", + "documentation": "https://docs.launchdarkly.com/integrations/new-relic/triggers#connecting-a-flag-trigger-to-new-relic-one", "testEventNameRegexp": "^New Relic Alert - Test Condition$", "parser": { "eventName": "/condition_name", diff --git a/integrations/okta/manifest.json b/integrations/okta/manifest.json index beff4bce..28e2f901 100644 --- a/integrations/okta/manifest.json +++ b/integrations/okta/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.okta.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/okta", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/account-security/okta", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/onelogin/manifest.json b/integrations/onelogin/manifest.json index ea93daee..631763ab 100644 --- a/integrations/onelogin/manifest.json +++ b/integrations/onelogin/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.onelogin.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/onelogin", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/account-security/onelogin", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json index eaaad783..1bb9dada 100644 --- a/integrations/segment/manifest.json +++ b/integrations/segment/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://segment.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/data-export/segment", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/segment", "supportWebsite": "https://segment.com/docs/connections/sources/catalog/cloud-apps/launchdarkly/", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, diff --git a/integrations/signalfx/README.md b/integrations/signalfx/README.md index f9e4e0ac..1e0fdd4d 100644 --- a/integrations/signalfx/README.md +++ b/integrations/signalfx/README.md @@ -1,6 +1,6 @@ # SignalFx -[User documentation](https://docs.launchdarkly.com/docs/signalfx) +[User documentation](https://docs.launchdarkly.com/integrations/signalfx) [API documentation](https://developers.signalfx.com/ingest_data_reference.html#operation/Send%20Custom%20Events) diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 0eb55426..303d8a1c 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.splunk.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/splunk", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/splunk", "privacyPolicy": "https://www.splunk.com/en_us/legal/splunk-data-security-and-privacy.html" }, "categories": ["monitoring"], diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index b876e556..36361726 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -7,7 +7,7 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/terraform", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/terraform", "supportWebsite": "https://www.terraform.io/docs/providers/launchdarkly/index.html", "site": "https://www.terraform.io/docs/providers/launchdarkly/index.html", "privacyPolicy": "https://app.terraform.io/pages/privacy" diff --git a/integrations/vscode/manifest.json b/integrations/vscode/manifest.json index 317dc795..c0371853 100644 --- a/integrations/vscode/manifest.json +++ b/integrations/vscode/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://marketplace.visualstudio.com/items?itemName=LaunchDarklyOfficial.launchdarkly", - "launchdarklyDocs": "https://docs.launchdarkly.com/docs/visual-studio-code", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/vscode", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["developer-tools"], diff --git a/integrations/webhooks/manifest.json b/integrations/webhooks/manifest.json index a2ce754e..322656f7 100644 --- a/integrations/webhooks/manifest.json +++ b/integrations/webhooks/manifest.json @@ -6,8 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations/webhooks", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/webhooks", + "site": "https://docs.launchdarkly.com/home/connecting/webhooks", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/connecting/webhooks", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["notifications"], diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 1ca0a593..4a517e1f 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -269,11 +269,11 @@ export type DefaultTemplate = string; */ export type ValidationTemplate = string; /** - * LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. + * LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/home/members/role-policies for more information. */ export type DefaultPolicy = [Policy, ...Policy[]]; /** - * A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. + * A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/home/members/role-actions for more information. */ export type Actions = string[]; /** @@ -281,15 +281,15 @@ export type Actions = string[]; */ export type Effect = "allow" | "deny"; /** - * A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information. + * A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/home/members/role-actions for more information. */ export type NotActions = string[]; /** - * A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. + * A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/home/members/role-resources for more information. */ export type NotResources = string[]; /** - * A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information. + * A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/home/members/role-resources for more information. */ export type Resources = string[]; /** @@ -309,7 +309,7 @@ export type Key1 = string; */ export type Description2 = string; /** - * This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/advanced/custom-properties for more information on custom properties + * This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/connecting/custom-properties for more information on custom properties */ export type ReservedCustomProperties = { name: Name2; @@ -558,7 +558,7 @@ export interface WebhookBodyTemplate { [k: string]: unknown; } /** - * A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information. + * A LaunchDarkly policy. See https://docs.launchdarkly.com/home/members/role-policies for more information. */ export interface Policy { actions?: Actions; diff --git a/manifest.schema.json b/manifest.schema.json index 54e6e194..e6c6fe7f 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -700,13 +700,13 @@ "defaultPolicy": { "$id": "#/properties/capability/audit-log-events-hook/default-policy", "title": "Default Policy", - "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/home/members/role-policies for more information.", "type": "array", "minItems": 1, "items": { "$id": "#/properties/capability/audit-log-events-hook/policy", "title": "Policy", - "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/home/members/role-policies for more information.", "type": "object", "propertyNames": { "enum": [ @@ -721,7 +721,7 @@ "actions": { "$id": "#/properties/capability/audit-log-events-hook/policy/actions", "title": "Actions", - "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/home/members/role-actions for more information.", "default": [ "*" ], @@ -750,7 +750,7 @@ "notActions": { "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", "title": "Not actions", - "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/home/members/role-actions for more information.", "default": [ "*" ], @@ -767,7 +767,7 @@ "notResources": { "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", "title": "Not resources", - "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/home/members/role-resources for more information.", "default": [ "*" ], @@ -782,7 +782,7 @@ "resources": { "$id": "#/properties/capability/audit-log-events-hook/policy/resources", "title": "Resources", - "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/home/members/role-resources for more information.", "default": [ "*" ], @@ -813,7 +813,7 @@ "reservedCustomProperties": { "$id": "#/properties/capability/reserved-custom-properties", "title": "Reserved custom properties", - "description": "This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/advanced/custom-properties for more information on custom properties", + "description": "This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/connecting/custom-properties for more information on custom properties", "type": "array", "items": { "$id": "#/properties/capability/reserved-custom-properties/items", diff --git a/package-lock.json b/package-lock.json index 675ef657..20c04a9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,6598 @@ { "name": "@launchdarkly/integration-framework", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "@launchdarkly/integration-framework", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "dateformat": "^4.5.1", + "url-parse": "^1.5.3" + }, + "devDependencies": { + "@apidevtools/json-schema-ref-parser": "^8.0.0", + "ajv": "^6.10.2", + "handlebars": "^4.7.7", + "jest": "^26.6.3", + "jest-expect-message": "1.0.2", + "jest-junit": "^12.0.0", + "json-schema-to-typescript": "^10.0.0", + "jsonpointer": "^4.0.1", + "lodash": "^4.17.21", + "prettier": "^2.0.1" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", + "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.0", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.11", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.10" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.7" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/types": "^7.12.5" + } + }, + "node_modules/@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, + "dependencies": { + "@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" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.10" + } + }, + "node_modules/@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 + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.11" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "node_modules/@babel/traverse": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@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 + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@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, + "dependencies": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/environment": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", + "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "jest-mock": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@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, + "dependencies": { + "@jest/environment": "^26.6.2", + "@jest/types": "^26.6.2", + "expect": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@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, + "dependencies": { + "@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", + "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" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/@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, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@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, + "dependencies": { + "@jest/console": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "node_modules/@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, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@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, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", + "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", + "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@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, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@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 + }, + "node_modules/@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, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@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, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@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==", + "dev": true + }, + "node_modules/@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 + }, + "node_modules/@types/node": { + "version": "14.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "node_modules/@types/prettier": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.6.tgz", + "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", + "dev": true + }, + "node_modules/@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 + }, + "node_modules/@types/yargs": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", + "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", + "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/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=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/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, + "dependencies": { + "babel-plugin-jest-hoist": "^26.6.2", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/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 + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", + "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.1.1", + "d": "^1.0.1", + "es5-ext": "^0.10.51", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.14", + "timers-ext": "^0.1.7" + } + }, + "node_modules/cli-color/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/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 + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/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 + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/dateformat": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.5.1.tgz", + "integrity": "sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/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=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emittery": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/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 + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/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 + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/expect": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", + "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/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, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/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, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/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, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "dev": true, + "dependencies": { + "@types/glob": "*" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "glob": "*" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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 + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "dev": true + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/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, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", + "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "dev": true, + "dependencies": { + "@jest/core": "^26.6.3", + "import-local": "^3.0.2", + "jest-cli": "^26.6.3" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@jest/types": "^26.6.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/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, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-expect-message": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jest-expect-message/-/jest-expect-message-1.0.2.tgz", + "integrity": "sha512-WFiXMgwS2lOqQZt1iJMI/hOXpUm32X+ApsuzYcQpW5m16Pv6/Gd9kgC+Q+Q1YVNU04kYcAOv9NXMnjg6kKUy6Q==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "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", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-junit": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.0.0.tgz", + "integrity": "sha512-+8K35LlboWiPuCnXSyiid7rFdxNlpCWWM20WEYe6IZH6psfUWKZmSpSRQ5tk0C0cBeDsvsnIzcef5mYhyJsbug==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^3.3.3", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest-junit/node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-junit/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-junit/node_modules/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, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.6.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@jest/types": "^26.6.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/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, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@jest/types": "^26.6.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.6.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "@jest/test-result": "^26.6.2", + "@jest/types": "^26.6.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.6.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/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 + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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 + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-ref-parser": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", + "integrity": "sha512-z0JGv7rRD3CnJbZY/qCpscyArdtLJhr/wRBmFUdoZ8xMjsFyNdILSprG2degqRLjBjyhZHAEBpGOxniO9rKTxA==", + "dev": true, + "dependencies": { + "@apidevtools/json-schema-ref-parser": "9.0.6" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/json-schema-ref-parser/node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", + "integrity": "sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, + "node_modules/json-schema-to-typescript": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.0.0.tgz", + "integrity": "sha512-G5RZlHchI9r/v31QhH5k57K+2kvYRBWKIGctJPsUuIkUIf3J3xXzvQZJGa16bhVjgs1fStaLamfFIti6K6V6wQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "cli-color": "^2.0.0", + "glob": "^7.1.6", + "glob-promise": "^3.4.0", + "is-glob": "^4.0.1", + "json-schema-ref-parser": "^9.0.6", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.20", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "mz": "^2.7.0", + "prettier": "^2.2.0", + "stdin": "0.0.1" + }, + "bin": { + "json2ts": "dist/src/cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/json-schema-to-typescript/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/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, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/memoizee": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.45", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dev": true, + "dependencies": { + "mime-db": "1.45.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/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/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", + "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", + "dev": true, + "optional": true, + "dependencies": { + "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" + } + }, + "node_modules/node-notifier/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/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, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-each-series": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", + "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/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, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/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==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native/node_modules/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==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/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==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/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 + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "dev": true, + "dependencies": { + "@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" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/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 + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/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, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stdin": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", + "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", + "dev": true + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uglify-js": { + "version": "3.13.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", + "integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", + "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/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, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + }, "dependencies": { "@apidevtools/json-schema-ref-parser": { "version": "8.0.0", @@ -2781,7 +9371,8 @@ "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 + "dev": true, + "requires": {} }, "jest-regex-util": { "version": "26.0.0", @@ -5226,7 +11817,8 @@ "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true + "dev": true, + "requires": {} }, "xml": { "version": "1.0.1", diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index f4a23a3e..b8ccc0cd 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -61,13 +61,13 @@ "defaultPolicy": { "$id": "#/properties/capability/audit-log-events-hook/default-policy", "title": "Default Policy", - "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "description": "LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/home/members/role-policies for more information.", "type": "array", "minItems": 1, "items": { "$id": "#/properties/capability/audit-log-events-hook/policy", "title": "Policy", - "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/docs/policies-in-custom-roles for more information.", + "description": "A LaunchDarkly policy. See https://docs.launchdarkly.com/home/members/role-policies for more information.", "type": "object", "propertyNames": { "enum": [ @@ -82,7 +82,7 @@ "actions": { "$id": "#/properties/capability/audit-log-events-hook/policy/actions", "title": "Actions", - "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "description": "A list of action specifiers defining the actions to which the statement applies. See https://docs.launchdarkly.com/home/members/role-actions for more information.", "default": ["*"], "examples": [ "updateOn", @@ -106,7 +106,7 @@ "notActions": { "$id": "#/properties/capability/audit-log-events-hook/policy/not-actions", "title": "Not actions", - "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/docs/actions-in-custom-roles for more information.", + "description": "A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/home/members/role-actions for more information.", "default": ["*"], "examples": ["createFlag", "deleteFlag", "cloneFlag"], "type": "array", @@ -117,7 +117,7 @@ "notResources": { "$id": "#/properties/capability/audit-log-events-hook/policy/not-resources", "title": "Not resources", - "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "description": "A list of resource specifiers defining the resources to which the statement does not apply. See https://docs.launchdarkly.com/home/members/role-resources for more information.", "default": ["*"], "examples": ["proj/*:env/production:flag/*"], "type": "array", @@ -128,7 +128,7 @@ "resources": { "$id": "#/properties/capability/audit-log-events-hook/policy/resources", "title": "Resources", - "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/docs/resources-in-custom-roles for more information.", + "description": "A list of resource specifiers defining the resources to which the statement applies. See https://docs.launchdarkly.com/home/members/role-resources for more information.", "default": ["*"], "examples": ["proj/*:env/production:flag/*"], "type": "array", diff --git a/schemas/capabilities/reservedCustomProperties.json b/schemas/capabilities/reservedCustomProperties.json index e396889c..28caf42b 100644 --- a/schemas/capabilities/reservedCustomProperties.json +++ b/schemas/capabilities/reservedCustomProperties.json @@ -3,7 +3,7 @@ "reservedCustomProperties": { "$id": "#/properties/capability/reserved-custom-properties", "title": "Reserved custom properties", - "description": "This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/advanced/custom-properties for more information on custom properties", + "description": "This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/connecting/custom-properties for more information on custom properties", "type": "array", "items": { "$id": "#/properties/capability/reserved-custom-properties/items", From bd91b9fb9b5c4215ed442e198441eac558d2b176 Mon Sep 17 00:00:00 2001 From: Jaz White Date: Mon, 25 Oct 2021 09:28:51 -0400 Subject: [PATCH 459/936] [sc-128309] Update labels for Clouflare KV ID form field (#300) Also adds missing periods to description text. --- integrations/cloudflare/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/cloudflare/manifest.json b/integrations/cloudflare/manifest.json index adff4a29..530c83af 100644 --- a/integrations/cloudflare/manifest.json +++ b/integrations/cloudflare/manifest.json @@ -27,15 +27,15 @@ }, { "key": "namespaceId", - "name": "KV Namespace", - "description": "You must have a KV namespace available for flag updates. Enter the KV namespace associated with your Worker", + "name": "KV Namespace ID", + "description": "You must have a KV namespace available for flag updates. Enter the KV namespace ID associated with your Worker.", "type": "string", "isSecret": false }, { "key": "apiToken", "name": "API Token", - "description": "Enter the API token generated from Cloudflare. Instructions for generating a [Cloudflare API token](https://developers.cloudflare.com/api/tokens/create)", + "description": "Enter the API token generated from Cloudflare. Instructions for generating a [Cloudflare API token](https://developers.cloudflare.com/api/tokens/create).", "type": "string", "isSecret": true } From fce1827254b058b7e950019ea5f3d14ddb4b21f3 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 26 Oct 2021 19:27:51 +0200 Subject: [PATCH 460/936] [sc-126368] add external references to slack-app (#301) * remove lingering redundant parser property from externalReferences * update metadata block paths and add hyperlink type --- integrations/slack-app/manifest.json | 32 ++++++++++++++++++++ manifest.schema.d.ts | 2 +- manifest.schema.json | 4 +-- schemas/capabilities/externalReferences.json | 10 ++++-- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index e4800bee..e90238e3 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -18,5 +18,37 @@ "legacy": { "kind": "webhooks" }, + "capabilities": { + "externalReferences": { + "connector": { + "metadata": [ + { + "key": "user-avatar", + "name": "User Avatar", + "type": "avatar", + "path": "/user_profile/image_original" + }, + { + "key": "timestamp", + "name": "Timestamp", + "type": "string", + "path": "/message_ts" + }, + { + "key": "message-permalink", + "name": "Message Permalink", + "type": "hyperlink", + "path": "/message_permalink" + }, + { + "key": "channel", + "name": "Channel Name", + "type": "string", + "path": "/channel_info/name" + } + ] + } + } + }, "otherCapabilities": ["webhooks"] } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 4a517e1f..3704020c 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -408,7 +408,7 @@ export type Name3 = string; /** * The data type of the information this metadata block will display */ -export type Type1 = "avatar" | "codeSnippet" | "string" | "multilineText"; +export type Type1 = "avatar" | "codeSnippet" | "hyperlink" | "string" | "multilineText"; /** * The JSON path corresponding to where the information can be found in the incoming payload */ diff --git a/manifest.schema.json b/manifest.schema.json index e6c6fe7f..bd77b147 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2673,8 +2673,7 @@ "type": "object", "propertyNames": { "enum": [ - "connector", - "parser" + "connector" ] }, "properties": { @@ -2721,6 +2720,7 @@ "enum": [ "avatar", "codeSnippet", + "hyperlink", "string", "multilineText" ], diff --git a/schemas/capabilities/externalReferences.json b/schemas/capabilities/externalReferences.json index 0fa893ce..70deb61b 100644 --- a/schemas/capabilities/externalReferences.json +++ b/schemas/capabilities/externalReferences.json @@ -6,7 +6,7 @@ "description": "This capability is used to manage inbound flag reference webhooks", "type": "object", "propertyNames": { - "enum": ["connector", "parser"] + "enum": ["connector"] }, "properties": { "connector": { @@ -44,7 +44,13 @@ "$id": "#/properties/capability/external-references/connector/ui-blocks/type", "title": "Type", "type": "string", - "enum": ["avatar", "codeSnippet", "string", "multilineText"], + "enum": [ + "avatar", + "codeSnippet", + "hyperlink", + "string", + "multilineText" + ], "description": "The data type of the information this metadata block will display" }, "path": { From 3bb6ec6de46aea44fa0ee9c79a947ebb86f5fab0 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 4 Nov 2021 23:42:04 -0500 Subject: [PATCH 461/936] Added definitions and schema for UI block and elements for external flag refs capability --- integrations/jira/manifest.json | 56 ++++- integrations/slack-app/manifest.json | 32 --- manifest.schema.d.ts | 106 ++++++++- manifest.schema.json | 231 ++++++++++++++++++- schemas/capabilities/externalReferences.json | 128 +++++++++- schemas/definitions.json | 38 +++ 6 files changed, 553 insertions(+), 38 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index c0c65103..7574ba4e 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -16,5 +16,59 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, - "otherCapabilities": ["external"] + "otherCapabilities": ["external"], + "capabilities": { + "externalReferences": { + "header": "JIRA issues", + "emptyState": { + "title": "There are no JIRA issues that link to this flag.", + "leadText": "JIRA tickets connected to this feature flag will automatically appear here. To connect a ticket to a feature flag [read our documentation](https://docs.launchdarkly.com/integrations/jira)" + }, + "connector": { + "metadata": [ + { + "key": "creator", + "path": "/creator/name", + "name": "Creator", + "type": "string" + }, + { + "key": "iconUrl", + "path": "/issue/iconUrl", + "name": "Issue Icon URL", + "type": "string" + }, + { + "key": "issueKey", + "path": "/issue/key", + "name": "Issue Key", + "type": "string" + }, + { + "key": "issueTitle", + "path": "/issue/title", + "name": "Title", + "type": "string" + } + ] + }, + "uiBlocks": { + "iconUrl": "{{_metadata.iconUrl}}", + "title": { + "linkToReference": true, + "elements": [ + { "text": "{{_metadata.issueKey}}: {{_metadata.issueTitle}}" } + ] + }, + "context": { + "elements": [ + { "text": "Created by" }, + { "text": "{{_metadata.creator}}", "isBold": true }, + { "text": "on" }, + { "type": "timestamp" } + ] + } + } + } + } } diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index e90238e3..e4800bee 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -18,37 +18,5 @@ "legacy": { "kind": "webhooks" }, - "capabilities": { - "externalReferences": { - "connector": { - "metadata": [ - { - "key": "user-avatar", - "name": "User Avatar", - "type": "avatar", - "path": "/user_profile/image_original" - }, - { - "key": "timestamp", - "name": "Timestamp", - "type": "string", - "path": "/message_ts" - }, - { - "key": "message-permalink", - "name": "Message Permalink", - "type": "hyperlink", - "path": "/message_permalink" - }, - { - "key": "channel", - "name": "Channel Name", - "type": "string", - "path": "/channel_info/name" - } - ] - } - } - }, "otherCapabilities": ["webhooks"] } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 3704020c..0d2b96ce 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -397,6 +397,18 @@ export type URLTemplate = string; * Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store */ export type ProviderFormVariables = FormVariable[]; +/** + * Title to show for all references for this integration + */ +export type ReferenceGroupHeader = string; +/** + * Title of the message + */ +export type Title = string; +/** + * Text or markup content describing how references can be created for this integration + */ +export type LeadText = string; /** * The unique key corresponding to the property to be displayed */ @@ -408,7 +420,7 @@ export type Name3 = string; /** * The data type of the information this metadata block will display */ -export type Type1 = "avatar" | "codeSnippet" | "hyperlink" | "string" | "multilineText"; +export type Type1 = "avatar" | "codeSnippet" | "hyperlink" | "string" | "multilineText" | "timestamp"; /** * The JSON path corresponding to where the information can be found in the incoming payload */ @@ -423,6 +435,50 @@ export type FlagReferencesMetadata = { path?: Path; [k: string]: unknown; }[]; +/** + * Template string used to render a visual block in LaunchDarkly UI to display an icon for a reference + */ +export type IconURL = string; +/** + * Template string used to render a visual block in LaunchDarkly UI to display an avatar for a reference + */ +export type AvatarURL = string; +/** + * Template string used to render a visual block in LaunchDarkly UI to display a name + */ +export type Name4 = string; +/** + * The type of element + */ +export type Type2 = "text" | "timestamp"; +/** + * Text to be displayed for the element. The text can contain template variables + */ +export type Text = string; +/** + * Indicates whether the element should be bolded + */ +export type IsBold = boolean; +/** + * URL to be set for the element which also indicates the element should be rendered as a hyperlink + */ +export type Url = string; +/** + * An array of elements to be combined to create a title block + */ +export type Elements = UIBlockElement[]; +/** + * Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI + */ +export type LinkToReference = boolean; +/** + * Markdown string used to render a visual block in LaunchDarkly UI to display a reference description + */ +export type Description3 = string; +/** + * An array of elements to be combined to create a context block + */ +export type Elements1 = UIBlockElement[]; /** * Describes the capabilities and intent of a LaunchDarkly integration @@ -682,7 +738,18 @@ export interface FeatureStore { * This capability is used to manage inbound flag reference webhooks */ export interface ExternalFlagReferences { + header?: ReferenceGroupHeader; + emptyState?: EmptyState; connector?: ExternalFlagReferencesConnector; + uiBlocks: UIBlocks; + [k: string]: unknown; +} +/** + * Content to display when there are no references to display for this integration + */ +export interface EmptyState { + title?: Title; + leadText?: LeadText; [k: string]: unknown; } /** @@ -692,3 +759,40 @@ export interface ExternalFlagReferencesConnector { metadata?: FlagReferencesMetadata; [k: string]: unknown; } +/** + * UI blocks are visual components that represents a section of the view layout for a reference displayed in LaunchDarkly + */ +export interface UIBlocks { + iconUrl?: IconURL; + avatarUrl?: AvatarURL; + name?: Name4; + title?: Title1; + description?: Description3; + context?: ReferenceContext; + [k: string]: unknown; +} +/** + * Object with visual elements used to display a reference title in LaunchDarkly UI + */ +export interface Title1 { + elements: Elements; + linkToReference?: LinkToReference; + [k: string]: unknown; +} +/** + * A sub component of a UI block that can be combined with other elements to form a UI block + */ +export interface UIBlockElement { + type?: Type2; + text?: Text; + isBold?: IsBold; + url?: Url; + [k: string]: unknown; +} +/** + * Object with visual elements used to display context information for a reference in LaunchDarkly UI + */ +export interface ReferenceContext { + elements: Elements1; + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index bd77b147..593b4f43 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2673,10 +2673,48 @@ "type": "object", "propertyNames": { "enum": [ - "connector" + "connector", + "uiBlocks", + "emptyState", + "header" ] }, + "required": [ + "uiBlocks" + ], "properties": { + "header": { + "$id": "#/properties/capability/external-references/header", + "title": "Reference group header", + "description": "Title to show for all references for this integration", + "type": "string" + }, + "emptyState": { + "$id": "#/properties/capability/external-references/empty-state", + "title": "Empty state", + "description": "Content to display when there are no references to display for this integration ", + "type": "object", + "propertyNames": { + "enum": [ + "title", + "leadText" + ] + }, + "properties": { + "title": { + "$id": "#/properties/capability/external-references/empty-state/title", + "title": "Title", + "type": "string", + "description": "Title of the message" + }, + "leadText": { + "$id": "#/properties/capability/external-references/empty-state/lead-text", + "title": "Lead text", + "type": "string", + "description": "Text or markup content describing how references can be created for this integration" + } + } + }, "connector": { "$id": "#/properties/capability/external-references/connector", "title": "External Flag References Connector", @@ -2722,7 +2760,8 @@ "codeSnippet", "hyperlink", "string", - "multilineText" + "multilineText", + "timestamp" ], "description": "The data type of the information this metadata block will display" }, @@ -2736,6 +2775,194 @@ } } } + }, + "uiBlocks": { + "$id": "#/properties/capability/external-references/ui-blocks", + "title": "UI Blocks", + "description": "UI blocks are visual components that represents a section of the view layout for a reference displayed in LaunchDarkly", + "type": "object", + "propertyNames": { + "enum": [ + "iconUrl", + "avatarUrl", + "name", + "title", + "context", + "description" + ] + }, + "properties": { + "iconUrl": { + "$id": "#/properties/capability/external-references/ui-blocks/icon-url", + "title": "Icon URL", + "type": "string", + "description": "Template string used to render a visual block in LaunchDarkly UI to display an icon for a reference" + }, + "avatarUrl": { + "$id": "#/properties/capability/external-references/ui-blocks/avatar-url", + "title": "Avatar URL", + "type": "string", + "description": "Template string used to render a visual block in LaunchDarkly UI to display an avatar for a reference" + }, + "name": { + "$id": "#/properties/capability/external-references/ui-blocks/name", + "title": "Name", + "type": "string", + "description": "Template string used to render a visual block in LaunchDarkly UI to display a name" + }, + "title": { + "$id": "#/properties/capability/external-references/ui-blocks/title", + "title": "Title", + "type": "object", + "description": "Object with visual elements used to display a reference title in LaunchDarkly UI", + "propertyNames": { + "enum": [ + "elements", + "linkToReference" + ] + }, + "required": [ + "elements" + ], + "properties": { + "elements": { + "$id": "#/properties/capability/external-references/ui-blocks/title/elements", + "title": "Elements", + "description": "An array of elements to be combined to create a title block", + "type": "array", + "items": { + "$id": "#/definitions/ui-block-element", + "title": "UI Block Element", + "description": "A sub component of a UI block that can be combined with other elements to form a UI block", + "type": "object", + "propertyNames": { + "enum": [ + "type", + "text", + "isBold", + "url" + ] + }, + "properties": { + "type": { + "$id": "#/definitions/ui-block-element/type", + "title": "Type", + "description": "The type of element", + "type": "string", + "enum": [ + "text", + "timestamp" + ], + "default": "text" + }, + "text": { + "$id": "#/definitions/ui-block-element/text", + "title": "Text", + "description": "Text to be displayed for the element. The text can contain template variables", + "type": "string" + }, + "isBold": { + "$id": "#/definitions/ui-block-element/text", + "title": "Is bold", + "description": "Indicates whether the element should be bolded", + "type": "boolean", + "default": false + }, + "url": { + "$id": "#/definitions/ui-block-element/url", + "title": "Url", + "description": "URL to be set for the element which also indicates the element should be rendered as a hyperlink", + "type": "string" + } + } + }, + "minLength": 1 + }, + "linkToReference": { + "$id": "#/properties/capability/external-references/ui-blocks/title/link-to-reference", + "title": "Link to reference", + "description": "Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI", + "type": "boolean", + "default": false + } + } + }, + "description": { + "$id": "#/properties/capability/external-references/ui-blocks/description", + "title": "Description", + "type": "string", + "description": "Markdown string used to render a visual block in LaunchDarkly UI to display a reference description" + }, + "context": { + "$id": "#/properties/capability/external-references/ui-blocks/reference-context", + "title": "Reference Context", + "type": "object", + "description": "Object with visual elements used to display context information for a reference in LaunchDarkly UI", + "propertyNames": { + "enum": [ + "elements" + ] + }, + "required": [ + "elements" + ], + "properties": { + "elements": { + "$id": "#/properties/capability/external-references/ui-blocks/context/elements", + "description": "An array of elements to be combined to create a context block", + "title": "Elements", + "type": "array", + "items": { + "$id": "#/definitions/ui-block-element", + "title": "UI Block Element", + "description": "A sub component of a UI block that can be combined with other elements to form a UI block", + "type": "object", + "propertyNames": { + "enum": [ + "type", + "text", + "isBold", + "url" + ] + }, + "properties": { + "type": { + "$id": "#/definitions/ui-block-element/type", + "title": "Type", + "description": "The type of element", + "type": "string", + "enum": [ + "text", + "timestamp" + ], + "default": "text" + }, + "text": { + "$id": "#/definitions/ui-block-element/text", + "title": "Text", + "description": "Text to be displayed for the element. The text can contain template variables", + "type": "string" + }, + "isBold": { + "$id": "#/definitions/ui-block-element/text", + "title": "Is bold", + "description": "Indicates whether the element should be bolded", + "type": "boolean", + "default": false + }, + "url": { + "$id": "#/definitions/ui-block-element/url", + "title": "Url", + "description": "URL to be set for the element which also indicates the element should be rendered as a hyperlink", + "type": "string" + } + } + }, + "minLength": 1 + } + } + } + } } } } diff --git a/schemas/capabilities/externalReferences.json b/schemas/capabilities/externalReferences.json index 70deb61b..3e096a7f 100644 --- a/schemas/capabilities/externalReferences.json +++ b/schemas/capabilities/externalReferences.json @@ -6,9 +6,39 @@ "description": "This capability is used to manage inbound flag reference webhooks", "type": "object", "propertyNames": { - "enum": ["connector"] + "enum": ["connector", "uiBlocks", "emptyState", "header"] }, + "required": ["uiBlocks"], "properties": { + "header": { + "$id": "#/properties/capability/external-references/header", + "title": "Reference group header", + "description": "Title to show for all references for this integration", + "type": "string" + }, + "emptyState": { + "$id": "#/properties/capability/external-references/empty-state", + "title": "Empty state", + "description": "Content to display when there are no references to display for this integration ", + "type": "object", + "propertyNames": { + "enum": ["title", "leadText"] + }, + "properties": { + "title": { + "$id": "#/properties/capability/external-references/empty-state/title", + "title": "Title", + "type": "string", + "description": "Title of the message" + }, + "leadText": { + "$id": "#/properties/capability/external-references/empty-state/lead-text", + "title": "Lead text", + "type": "string", + "description": "Text or markup content describing how references can be created for this integration" + } + } + }, "connector": { "$id": "#/properties/capability/external-references/connector", "title": "External Flag References Connector", @@ -49,7 +79,8 @@ "codeSnippet", "hyperlink", "string", - "multilineText" + "multilineText", + "timestamp" ], "description": "The data type of the information this metadata block will display" }, @@ -63,6 +94,99 @@ } } } + }, + "uiBlocks": { + "$id": "#/properties/capability/external-references/ui-blocks", + "title": "UI Blocks", + "description": "UI blocks are visual components that represents a section of the view layout for a reference displayed in LaunchDarkly", + "type": "object", + "propertyNames": { + "enum": [ + "iconUrl", + "avatarUrl", + "name", + "title", + "context", + "description" + ] + }, + "properties": { + "iconUrl": { + "$id": "#/properties/capability/external-references/ui-blocks/icon-url", + "title": "Icon URL", + "type": "string", + "description": "Template string used to render a visual block in LaunchDarkly UI to display an icon for a reference" + }, + "avatarUrl": { + "$id": "#/properties/capability/external-references/ui-blocks/avatar-url", + "title": "Avatar URL", + "type": "string", + "description": "Template string used to render a visual block in LaunchDarkly UI to display an avatar for a reference" + }, + "name": { + "$id": "#/properties/capability/external-references/ui-blocks/name", + "title": "Name", + "type": "string", + "description": "Template string used to render a visual block in LaunchDarkly UI to display a name" + }, + "title": { + "$id": "#/properties/capability/external-references/ui-blocks/title", + "title": "Title", + "type": "object", + "description": "Object with visual elements used to display a reference title in LaunchDarkly UI", + "propertyNames": { + "enum": ["elements", "linkToReference"] + }, + "required": ["elements"], + "properties": { + "elements": { + "$id": "#/properties/capability/external-references/ui-blocks/title/elements", + "title": "Elements", + "description": "An array of elements to be combined to create a title block", + "type": "array", + "items": { + "$ref": "../definitions.json#/uiBlockElement" + }, + "minLength": 1 + }, + "linkToReference": { + "$id": "#/properties/capability/external-references/ui-blocks/title/link-to-reference", + "title": "Link to reference", + "description": "Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI", + "type": "boolean", + "default": false + } + } + }, + "description": { + "$id": "#/properties/capability/external-references/ui-blocks/description", + "title": "Description", + "type": "string", + "description": "Markdown string used to render a visual block in LaunchDarkly UI to display a reference description" + }, + "context": { + "$id": "#/properties/capability/external-references/ui-blocks/reference-context", + "title": "Reference Context", + "type": "object", + "description": "Object with visual elements used to display context information for a reference in LaunchDarkly UI", + "propertyNames": { + "enum": ["elements"] + }, + "required": ["elements"], + "properties": { + "elements": { + "$id": "#/properties/capability/external-references/ui-blocks/context/elements", + "description": "An array of elements to be combined to create a context block", + "title": "Elements", + "type": "array", + "items": { + "$ref": "../definitions.json#/uiBlockElement" + }, + "minLength": 1 + } + } + } + } } } } diff --git a/schemas/definitions.json b/schemas/definitions.json index 1a4663bb..665e12cd 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -241,5 +241,43 @@ } }, "required": ["key", "name", "type", "description"] + }, + "uiBlockElement": { + "$id": "#/definitions/ui-block-element", + "title": "UI Block Element", + "description": "A sub component of a UI block that can be combined with other elements to form a UI block", + "type": "object", + "propertyNames": { + "enum": ["type", "text", "isBold", "url"] + }, + "properties": { + "type": { + "$id": "#/definitions/ui-block-element/type", + "title": "Type", + "description": "The type of element", + "type": "string", + "enum": ["text", "timestamp"], + "default": "text" + }, + "text": { + "$id": "#/definitions/ui-block-element/text", + "title": "Text", + "description": "Text to be displayed for the element. The text can contain template variables", + "type": "string" + }, + "isBold": { + "$id": "#/definitions/ui-block-element/text", + "title": "Is bold", + "description": "Indicates whether the element should be bolded", + "type": "boolean", + "default": false + }, + "url": { + "$id": "#/definitions/ui-block-element/url", + "title": "Url", + "description": "URL to be set for the element which also indicates the element should be rendered as a hyperlink", + "type": "string" + } + } } } From 5139beef4be35ae444bce0338739a7ea8958f542 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 5 Nov 2021 10:03:56 -0500 Subject: [PATCH 462/936] Updated with PR feedback and replaced timestamp type with isTimestamp boolean boolean --- integrations/jira/manifest.json | 7 +- manifest.schema.d.ts | 38 +++++--- manifest.schema.json | 99 ++++++++++++-------- schemas/capabilities/externalReferences.json | 53 ++++++----- schemas/definitions.json | 17 ++-- 5 files changed, 128 insertions(+), 86 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 7574ba4e..7df7de22 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -53,7 +53,10 @@ ] }, "uiBlocks": { - "iconUrl": "{{_metadata.iconUrl}}", + "image": { + "sourceUrl": "{{_metadata.iconUrl}}", + "isIcon": true + }, "title": { "linkToReference": true, "elements": [ @@ -65,7 +68,7 @@ { "text": "Created by" }, { "text": "{{_metadata.creator}}", "isBold": true }, { "text": "on" }, - { "type": "timestamp" } + { "isTimestamp": true } ] } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 0d2b96ce..4b782a44 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -436,21 +436,21 @@ export type FlagReferencesMetadata = { [k: string]: unknown; }[]; /** - * Template string used to render a visual block in LaunchDarkly UI to display an icon for a reference + * Url of the image */ -export type IconURL = string; +export type SourceUrl = string; /** - * Template string used to render a visual block in LaunchDarkly UI to display an avatar for a reference + * Indicates whether the image should be rendered as an icon */ -export type AvatarURL = string; +export type IsIcon = boolean; /** - * Template string used to render a visual block in LaunchDarkly UI to display a name + * Indicates whether the image should be rendered as an avatar */ -export type Name4 = string; +export type IsAvatar = boolean; /** - * The type of element + * Template string used to render a visual block in LaunchDarkly UI to display a name */ -export type Type2 = "text" | "timestamp"; +export type Name4 = string; /** * Text to be displayed for the element. The text can contain template variables */ @@ -459,6 +459,10 @@ export type Text = string; * Indicates whether the element should be bolded */ export type IsBold = boolean; +/** + * Indicates whether the element should be rendered as a timestamp + */ +export type IsTimestamp = boolean; /** * URL to be set for the element which also indicates the element should be rendered as a hyperlink */ @@ -738,8 +742,8 @@ export interface FeatureStore { * This capability is used to manage inbound flag reference webhooks */ export interface ExternalFlagReferences { - header?: ReferenceGroupHeader; - emptyState?: EmptyState; + header: ReferenceGroupHeader; + emptyState: EmptyState; connector?: ExternalFlagReferencesConnector; uiBlocks: UIBlocks; [k: string]: unknown; @@ -763,14 +767,22 @@ export interface ExternalFlagReferencesConnector { * UI blocks are visual components that represents a section of the view layout for a reference displayed in LaunchDarkly */ export interface UIBlocks { - iconUrl?: IconURL; - avatarUrl?: AvatarURL; + image?: Image; name?: Name4; title?: Title1; description?: Description3; context?: ReferenceContext; [k: string]: unknown; } +/** + * A visual block used to render an image in LaunchDarkly UI + */ +export interface Image { + sourceUrl: SourceUrl; + isIcon?: IsIcon; + isAvatar?: IsAvatar; + [k: string]: unknown; +} /** * Object with visual elements used to display a reference title in LaunchDarkly UI */ @@ -783,9 +795,9 @@ export interface Title1 { * A sub component of a UI block that can be combined with other elements to form a UI block */ export interface UIBlockElement { - type?: Type2; text?: Text; isBold?: IsBold; + isTimestamp?: IsTimestamp; url?: Url; [k: string]: unknown; } diff --git a/manifest.schema.json b/manifest.schema.json index 593b4f43..f6dbe406 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2680,7 +2680,9 @@ ] }, "required": [ - "uiBlocks" + "uiBlocks", + "header", + "emptyState" ], "properties": { "header": { @@ -2692,7 +2694,7 @@ "emptyState": { "$id": "#/properties/capability/external-references/empty-state", "title": "Empty state", - "description": "Content to display when there are no references to display for this integration ", + "description": "Content to display when there are no references to display for this integration", "type": "object", "propertyNames": { "enum": [ @@ -2783,8 +2785,7 @@ "type": "object", "propertyNames": { "enum": [ - "iconUrl", - "avatarUrl", + "image", "name", "title", "context", @@ -2792,17 +2793,41 @@ ] }, "properties": { - "iconUrl": { - "$id": "#/properties/capability/external-references/ui-blocks/icon-url", - "title": "Icon URL", - "type": "string", - "description": "Template string used to render a visual block in LaunchDarkly UI to display an icon for a reference" - }, - "avatarUrl": { - "$id": "#/properties/capability/external-references/ui-blocks/avatar-url", - "title": "Avatar URL", - "type": "string", - "description": "Template string used to render a visual block in LaunchDarkly UI to display an avatar for a reference" + "image": { + "$id": "#/properties/capability/external-references/ui-blocks/image", + "title": "Image", + "type": "object", + "description": "A visual block used to render an image in LaunchDarkly UI", + "propertyNames": { + "enum": [ + "sourceUrl", + "isIcon", + "isAvatar" + ] + }, + "required": [ + "sourceUrl" + ], + "properties": { + "sourceUrl": { + "$id": "#/properties/capability/external-references/ui-blocks/image/source-url", + "title": "Source Url", + "description": "Url of the image", + "type": "string" + }, + "isIcon": { + "$id": "#/properties/capability/external-references/ui-blocks/image/is-icon", + "title": "Is icon", + "description": "Indicates whether the image should be rendered as an icon", + "type": "boolean" + }, + "isAvatar": { + "$id": "#/properties/capability/external-references/ui-blocks/image/is-avatar", + "title": "Is avatar", + "description": "Indicates whether the image should be rendered as an avatar", + "type": "boolean" + } + } }, "name": { "$id": "#/properties/capability/external-references/ui-blocks/name", @@ -2837,24 +2862,13 @@ "type": "object", "propertyNames": { "enum": [ - "type", "text", "isBold", - "url" + "url", + "isTimestamp" ] }, "properties": { - "type": { - "$id": "#/definitions/ui-block-element/type", - "title": "Type", - "description": "The type of element", - "type": "string", - "enum": [ - "text", - "timestamp" - ], - "default": "text" - }, "text": { "$id": "#/definitions/ui-block-element/text", "title": "Text", @@ -2868,6 +2882,13 @@ "type": "boolean", "default": false }, + "isTimestamp": { + "$id": "#/definitions/ui-block-element/is-timestamp", + "title": "Is timestamp", + "description": "Indicates whether the element should be rendered as a timestamp", + "type": "boolean", + "default": false + }, "url": { "$id": "#/definitions/ui-block-element/url", "title": "Url", @@ -2919,24 +2940,13 @@ "type": "object", "propertyNames": { "enum": [ - "type", "text", "isBold", - "url" + "url", + "isTimestamp" ] }, "properties": { - "type": { - "$id": "#/definitions/ui-block-element/type", - "title": "Type", - "description": "The type of element", - "type": "string", - "enum": [ - "text", - "timestamp" - ], - "default": "text" - }, "text": { "$id": "#/definitions/ui-block-element/text", "title": "Text", @@ -2950,6 +2960,13 @@ "type": "boolean", "default": false }, + "isTimestamp": { + "$id": "#/definitions/ui-block-element/is-timestamp", + "title": "Is timestamp", + "description": "Indicates whether the element should be rendered as a timestamp", + "type": "boolean", + "default": false + }, "url": { "$id": "#/definitions/ui-block-element/url", "title": "Url", diff --git a/schemas/capabilities/externalReferences.json b/schemas/capabilities/externalReferences.json index 3e096a7f..5234b8de 100644 --- a/schemas/capabilities/externalReferences.json +++ b/schemas/capabilities/externalReferences.json @@ -8,7 +8,7 @@ "propertyNames": { "enum": ["connector", "uiBlocks", "emptyState", "header"] }, - "required": ["uiBlocks"], + "required": ["uiBlocks", "header", "emptyState"], "properties": { "header": { "$id": "#/properties/capability/external-references/header", @@ -19,7 +19,7 @@ "emptyState": { "$id": "#/properties/capability/external-references/empty-state", "title": "Empty state", - "description": "Content to display when there are no references to display for this integration ", + "description": "Content to display when there are no references to display for this integration", "type": "object", "propertyNames": { "enum": ["title", "leadText"] @@ -101,27 +101,38 @@ "description": "UI blocks are visual components that represents a section of the view layout for a reference displayed in LaunchDarkly", "type": "object", "propertyNames": { - "enum": [ - "iconUrl", - "avatarUrl", - "name", - "title", - "context", - "description" - ] + "enum": ["image", "name", "title", "context", "description"] }, "properties": { - "iconUrl": { - "$id": "#/properties/capability/external-references/ui-blocks/icon-url", - "title": "Icon URL", - "type": "string", - "description": "Template string used to render a visual block in LaunchDarkly UI to display an icon for a reference" - }, - "avatarUrl": { - "$id": "#/properties/capability/external-references/ui-blocks/avatar-url", - "title": "Avatar URL", - "type": "string", - "description": "Template string used to render a visual block in LaunchDarkly UI to display an avatar for a reference" + "image": { + "$id": "#/properties/capability/external-references/ui-blocks/image", + "title": "Image", + "type": "object", + "description": "A visual block used to render an image in LaunchDarkly UI", + "propertyNames": { + "enum": ["sourceUrl", "isIcon", "isAvatar"] + }, + "required": ["sourceUrl"], + "properties": { + "sourceUrl": { + "$id": "#/properties/capability/external-references/ui-blocks/image/source-url", + "title": "Source Url", + "description": "Url of the image", + "type": "string" + }, + "isIcon": { + "$id": "#/properties/capability/external-references/ui-blocks/image/is-icon", + "title": "Is icon", + "description": "Indicates whether the image should be rendered as an icon", + "type": "boolean" + }, + "isAvatar": { + "$id": "#/properties/capability/external-references/ui-blocks/image/is-avatar", + "title": "Is avatar", + "description": "Indicates whether the image should be rendered as an avatar", + "type": "boolean" + } + } }, "name": { "$id": "#/properties/capability/external-references/ui-blocks/name", diff --git a/schemas/definitions.json b/schemas/definitions.json index 665e12cd..9387f38c 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -248,17 +248,9 @@ "description": "A sub component of a UI block that can be combined with other elements to form a UI block", "type": "object", "propertyNames": { - "enum": ["type", "text", "isBold", "url"] + "enum": ["text", "isBold", "url", "isTimestamp"] }, "properties": { - "type": { - "$id": "#/definitions/ui-block-element/type", - "title": "Type", - "description": "The type of element", - "type": "string", - "enum": ["text", "timestamp"], - "default": "text" - }, "text": { "$id": "#/definitions/ui-block-element/text", "title": "Text", @@ -272,6 +264,13 @@ "type": "boolean", "default": false }, + "isTimestamp": { + "$id": "#/definitions/ui-block-element/is-timestamp", + "title": "Is timestamp", + "description": "Indicates whether the element should be rendered as a timestamp", + "type": "boolean", + "default": false + }, "url": { "$id": "#/definitions/ui-block-element/url", "title": "Url", From 8e605f481b7172c1408a47dec222f9355a1fb135 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 5 Nov 2021 13:45:05 -0500 Subject: [PATCH 463/936] Made ui block text required and updated jira ui block template string --- integrations/jira/manifest.json | 8 ++++---- manifest.schema.d.ts | 2 +- manifest.schema.json | 6 ++++++ schemas/definitions.json | 1 + 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 7df7de22..be5bebb2 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -54,21 +54,21 @@ }, "uiBlocks": { "image": { - "sourceUrl": "{{_metadata.iconUrl}}", + "sourceUrl": "{{metadata.iconUrl}}", "isIcon": true }, "title": { "linkToReference": true, "elements": [ - { "text": "{{_metadata.issueKey}}: {{_metadata.issueTitle}}" } + { "text": "{{metadata.issueKey}}: {{metadata.issueTitle}}" } ] }, "context": { "elements": [ { "text": "Created by" }, - { "text": "{{_metadata.creator}}", "isBold": true }, + { "text": "{{metadata.creator}}", "isBold": true }, { "text": "on" }, - { "isTimestamp": true } + { "text": "{{timestamp.milliseconds}}", "isTimestamp": true } ] } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 4b782a44..a2c396d3 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -795,7 +795,7 @@ export interface Title1 { * A sub component of a UI block that can be combined with other elements to form a UI block */ export interface UIBlockElement { - text?: Text; + text: Text; isBold?: IsBold; isTimestamp?: IsTimestamp; url?: Url; diff --git a/manifest.schema.json b/manifest.schema.json index f6dbe406..3d4a5eb9 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2868,6 +2868,9 @@ "isTimestamp" ] }, + "required": [ + "text" + ], "properties": { "text": { "$id": "#/definitions/ui-block-element/text", @@ -2946,6 +2949,9 @@ "isTimestamp" ] }, + "required": [ + "text" + ], "properties": { "text": { "$id": "#/definitions/ui-block-element/text", diff --git a/schemas/definitions.json b/schemas/definitions.json index 9387f38c..19799b78 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -250,6 +250,7 @@ "propertyNames": { "enum": ["text", "isBold", "url", "isTimestamp"] }, + "required": ["text"], "properties": { "text": { "$id": "#/definitions/ui-block-element/text", From 703482e5ece1b7d139093555d0c82157503b63a0 Mon Sep 17 00:00:00 2001 From: Jaz White Date: Fri, 5 Nov 2021 16:17:57 -0400 Subject: [PATCH 464/936] [sc-130013] add placeholders to cloudflare manifest (#303) Uses example values which are straight out of Cloudflare's own API docs See: https://api.cloudflare.com/ --- integrations/cloudflare/manifest.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/integrations/cloudflare/manifest.json b/integrations/cloudflare/manifest.json index 530c83af..ebfb3cd1 100644 --- a/integrations/cloudflare/manifest.json +++ b/integrations/cloudflare/manifest.json @@ -23,6 +23,7 @@ "name": "Account ID", "description": "Enter your Cloudflare account ID. This can be found on your Workers Dashboard or using [Wrangler CLI](https://developers.cloudflare.com/workers/get-started/guide)", "type": "string", + "placeholder": "e.g. 01a7362d577a6c3019a474fd6f485823", "isSecret": false }, { @@ -30,12 +31,14 @@ "name": "KV Namespace ID", "description": "You must have a KV namespace available for flag updates. Enter the KV namespace ID associated with your Worker.", "type": "string", + "placeholder": "e.g. 0f2ac74b498b48028cb68387c421e279", "isSecret": false }, { "key": "apiToken", "name": "API Token", "description": "Enter the API token generated from Cloudflare. Instructions for generating a [Cloudflare API token](https://developers.cloudflare.com/api/tokens/create).", + "placeholder": "e.g. 8M7wS6hCpXVc-DoRnPPY_UCWPgy8aea4Wy6kCe5T", "type": "string", "isSecret": true } From 94ed4d794c6714b5ece6934b93ff0c2fe588204d Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 8 Nov 2021 10:29:07 -0600 Subject: [PATCH 465/936] Added UI blocks for slack app --- integrations/jira/manifest.json | 6 ++- integrations/slack-app/manifest.json | 72 +++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index be5bebb2..7afe6032 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -68,7 +68,11 @@ { "text": "Created by" }, { "text": "{{metadata.creator}}", "isBold": true }, { "text": "on" }, - { "text": "{{timestamp.milliseconds}}", "isTimestamp": true } + { + "text": "{{timestamp.milliseconds}}", + "isTimestamp": true, + "isBold": true + } ] } } diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index e4800bee..aa382cd0 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -18,5 +18,75 @@ "legacy": { "kind": "webhooks" }, - "otherCapabilities": ["webhooks"] + "otherCapabilities": ["webhooks"], + "capabilities": { + "externalReferences": { + "header": "Slack conversations", + "emptyState": { + "title": "There are no Slack conversations that reference this flag.", + "leadText": "Slack conversations that are associated with this feature flag will automatically appear here. To learn more about how to associate a slack conversation with a feature flag [read our documentation](https://docs.launchdarkly.com/integrations/slack)" + }, + "connector": { + "metadata": [ + { + "key": "avatar", + "name": "User Avatar", + "type": "avatar", + "path": "/user_profile/image_original" + }, + { + "key": "displayName", + "name": "Reference creator", + "type": "string", + "path": "/user_profile/display_name" + }, + { + "key": "timestamp", + "name": "Timestamp", + "type": "string", + "path": "/message_ts" + }, + { + "key": "messagePermalink", + "name": "Message Permalink", + "type": "hyperlink", + "path": "/message_permalink" + }, + { + "key": "channelName", + "name": "Channel Name", + "type": "string", + "path": "/channel_info/name" + }, + { + "key": "conversation", + "name": "Conversation", + "type": "string", + "path": "/message_text" + } + ] + }, + "uiBlocks": { + "image": { + "sourceUrl": "{{metadata.avatar}}", + "isAvatar": true + }, + "name": "{{metadata.displayName}}", + "description": "{{metadata.conversation}}", + "context": { + "elements": [ + { "text": "Posted in" }, + { "text": "#{{metadata.channelName}}", "isBold": true }, + { "text": "on" }, + { + "text": "{{metadata.timestamp}}", + "isTimestamp": true, + "isBold": true + }, + { "text": "View message", "url": "{{metadata.messagePermalink}}" } + ] + } + } + } + } } From fb53ee92b8520bb490a24cdf0eab238033f64af7 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 11 Nov 2021 00:20:06 -0600 Subject: [PATCH 466/936] Fixing slack context block timestamp defaulting to the 70s --- integrations/slack-app/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index aa382cd0..fdaeb5e0 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -79,7 +79,7 @@ { "text": "#{{metadata.channelName}}", "isBold": true }, { "text": "on" }, { - "text": "{{metadata.timestamp}}", + "text": "{{timestamp.milliseconds}}", "isTimestamp": true, "isBold": true }, From e177837ecdc7ba85a59759f51e81a2fae678843e Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 18 Nov 2021 15:34:44 +0100 Subject: [PATCH 467/936] [sc-129873] add eu data center option for new relic one integration (#308) * feat: add and use new formVariable * feat: integration working with new EU endpoint * docs: fix typo in readme * fix: fix existing US url * fix: fix existing US url * chore: Apply suggestions from code review Co-authored-by: Henry Barrow * fix: escape quotes in description * fix: remove includeErrorResponseBody as domain is not static anymore * feedback: account for existing integrations not having domain field Co-authored-by: Henry Barrow * chore: make things pretty Co-authored-by: Henry Barrow --- integrations/new-relic-apm/README.md | 2 +- integrations/new-relic-apm/manifest.json | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/integrations/new-relic-apm/README.md b/integrations/new-relic-apm/README.md index 6a89456d..0c289b8b 100644 --- a/integrations/new-relic-apm/README.md +++ b/integrations/new-relic-apm/README.md @@ -8,4 +8,4 @@ Run `npm run curl new-relic-apm` in the root repository directory to generate a Please note that this integration requires a New Relic APM account to function. You should be able to see all LaunchDarkly flag events on the Deployment page -of you APM console. +of your APM console. diff --git a/integrations/new-relic-apm/manifest.json b/integrations/new-relic-apm/manifest.json index bf944b02..6b1b0855 100644 --- a/integrations/new-relic-apm/manifest.json +++ b/integrations/new-relic-apm/manifest.json @@ -29,13 +29,21 @@ "description": "Enter your [New Relic application ID](https://docs.newrelic.com/docs/accounts/install-new-relic/account-setup/app-id-other-product-ids#ui).", "type": "string", "placeholder": "123456" + }, + { + "key": "domain", + "name": "Data Center", + "description": "Your New Relic data center. The default(US) is \"api.newrelic.com\". Use \"api.eu.newrelic.com\" if you are using the EU data center.", + "type": "enum", + "allowedValues": ["api.newrelic.com", "api.eu.newrelic.com"], + "isOptional": true, + "defaultValue": "api.newrelic.com" } ], "capabilities": { "auditLogEventsHook": { - "includeErrorResponseBody": true, "endpoint": { - "url": "https://api.newrelic.com/v2/applications/{{applicationId}}/deployments.json", + "url": "https://{{#if domain}}{{domain}}{{else}}api.newrelic.com{{/if}}/v2/applications/{{applicationId}}/deployments.json", "method": "POST", "headers": [ { From 906ee1d1a53d392469d6d729c96a1e3b91e6dfcb Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 25 Nov 2021 14:32:31 +0000 Subject: [PATCH 468/936] [sc-132618] Upgrade node to v16 and resolve secuirty vulnerabilities (#309) * Upgrade node to v16 * Resolve security vulnerabilities --- .circleci/config.yml | 11 +- .nvmrc | 2 +- package-lock.json | 1143 ++++++++++-------------------------------- package.json | 4 +- 4 files changed, 271 insertions(+), 889 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 10c1ab88..47fa67d2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,14 +1,7 @@ version: 2.1 -# Keep this at the top to reduce noise in chatrooms when we mess up circleci setup -experimental: - notify: - branches: - only: - - master - orbs: - node: circleci/node@4.1.0 + node: circleci/node@4.7.0 aws-cli: circleci/aws-cli@1.3.0 linter: thekevjames/linter@1.0.49 @@ -16,7 +9,7 @@ jobs: build: executor: name: node/default - tag: '14.15.0' + tag: '16.13' steps: - checkout - node/install-packages diff --git a/.nvmrc b/.nvmrc index 8351c193..b6a7d89c 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -14 +16 diff --git a/package-lock.json b/package-lock.json index 20c04a9b..a222bd35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,9 +18,9 @@ "handlebars": "^4.7.7", "jest": "^26.6.3", "jest-expect-message": "1.0.2", - "jest-junit": "^12.0.0", + "jest-junit": "^13.0.0", "json-schema-to-typescript": "^10.0.0", - "jsonpointer": "^4.0.1", + "jsonpointer": "^5.0.0", "lodash": "^4.17.21", "prettier": "^2.0.1" } @@ -796,6 +796,15 @@ "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@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, + "engines": { + "node": ">= 6" + } + }, "node_modules/@types/babel__core": { "version": "7.1.12", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", @@ -968,6 +977,18 @@ "node": ">=0.4.0" } }, + "node_modules/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, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1000,9 +1021,9 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" @@ -1087,24 +1108,6 @@ "node": ">=0.10.0" } }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -1132,21 +1135,6 @@ "node": ">= 4.5.0" } }, - "node_modules/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=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "node_modules/babel-jest": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", @@ -1275,15 +1263,6 @@ "node": ">=0.10.0" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1383,12 +1362,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -1647,12 +1620,6 @@ "node": ">=0.10.0" } }, - "node_modules/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 - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1701,18 +1668,6 @@ "type": "^1.0.1" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -1777,9 +1732,9 @@ } }, "node_modules/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=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "node_modules/deepmerge": { @@ -1852,16 +1807,6 @@ "node": ">=8" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", @@ -1952,13 +1897,13 @@ } }, "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "dependencies": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1" }, @@ -1967,7 +1912,7 @@ "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=4.0" + "node": ">=6.0" }, "optionalDependencies": { "source-map": "~0.6.1" @@ -1987,9 +1932,9 @@ } }, "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -2221,12 +2166,6 @@ "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", "dev": true }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -2292,15 +2231,6 @@ "node": ">=0.10.0" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -2362,27 +2292,18 @@ "node": ">=0.10.0" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/fragment-cache": { @@ -2474,15 +2395,6 @@ "node": ">=0.10.0" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -2561,29 +2473,6 @@ "uglify-js": "^3.1.4" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2692,19 +2581,31 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, "node_modules/human-signals": { @@ -2769,15 +2670,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -2941,9 +2833,9 @@ } }, "node_modules/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=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "node_modules/is-promise": { @@ -3010,12 +2902,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "node_modules/istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -3335,29 +3221,20 @@ } }, "node_modules/jest-junit": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.0.0.tgz", - "integrity": "sha512-+8K35LlboWiPuCnXSyiid7rFdxNlpCWWM20WEYe6IZH6psfUWKZmSpSRQ5tk0C0cBeDsvsnIzcef5mYhyJsbug==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.0.0.tgz", + "integrity": "sha512-JSHR+Dhb32FGJaiKkqsB7AR3OqWKtldLd6ZH2+FJ8D4tsweb8Id8zEVReU4+OlrRO1ZluqJLQEETm+Q6/KilBg==", "dev": true, "dependencies": { "mkdirp": "^1.0.4", - "strip-ansi": "^5.2.0", - "uuid": "^3.3.3", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", "xml": "^1.0.1" }, "engines": { "node": ">=10.12.0" } }, - "node_modules/jest-junit/node_modules/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, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-junit/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -3370,18 +3247,6 @@ "node": ">=10" } }, - "node_modules/jest-junit/node_modules/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, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-leak-detector": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", @@ -3726,43 +3591,38 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "node_modules/jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, "dependencies": { - "abab": "^2.0.3", - "acorn": "^7.1.1", + "abab": "^2.0.5", + "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", - "cssstyle": "^2.2.0", + "cssstyle": "^2.3.0", "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", + "decimal.js": "^10.2.1", "domexception": "^2.0.1", - "escodegen": "^1.14.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", + "tough-cookie": "^4.0.0", "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", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" }, "engines": { @@ -3777,6 +3637,18 @@ } } }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -3795,12 +3667,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "node_modules/json-schema-ref-parser": { "version": "9.0.6", "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", @@ -3891,29 +3757,14 @@ } }, "node_modules/jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", + "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3978,12 +3829,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4095,21 +3940,21 @@ } }, "node_modules/mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dev": true, "dependencies": { - "mime-db": "1.45.0" + "mime-db": "1.51.0" }, "engines": { "node": ">= 0.6" @@ -4264,16 +4109,6 @@ "node": ">=10" } }, - "node_modules/node-notifier/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -4313,15 +4148,6 @@ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4557,9 +4383,9 @@ } }, "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "node_modules/pascalcase": { @@ -4604,12 +4430,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "node_modules/picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -4729,15 +4549,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -4836,97 +4647,6 @@ "node": ">=0.10" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/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==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native/node_modules/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==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/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==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5724,31 +5444,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "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" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", @@ -5863,15 +5558,6 @@ "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", "dev": true }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -5900,12 +5586,12 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -6103,23 +5789,23 @@ } }, "node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" }, "engines": { "node": ">=6" } }, "node_modules/tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, "dependencies": { "punycode": "^2.1.1" @@ -6128,24 +5814,6 @@ "node": ">=8" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -6231,6 +5899,15 @@ "node": ">=0.10.0" } }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -6314,13 +5991,12 @@ } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/v8-to-istanbul": { @@ -6356,20 +6032,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -6425,13 +6087,13 @@ "dev": true }, "node_modules/whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", + "lodash": "^4.7.0", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" }, "engines": { @@ -7254,6 +6916,12 @@ "@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", @@ -7417,6 +7085,15 @@ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "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==", + "dev": true, + "requires": { + "debug": "4" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -7439,9 +7116,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -7502,21 +7179,6 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "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=", - "dev": true - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -7535,18 +7197,6 @@ "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=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "babel-jest": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", @@ -7650,15 +7300,6 @@ } } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -7743,12 +7384,6 @@ "rsvp": "^4.8.4" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -7963,12 +7598,6 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "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 - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8013,15 +7642,6 @@ "type": "^1.0.1" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "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", @@ -8066,9 +7686,9 @@ "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=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "deepmerge": { @@ -8122,16 +7742,6 @@ } } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", @@ -8213,13 +7823,13 @@ "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dev": true, "requires": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" @@ -8232,9 +7842,9 @@ "dev": true }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "esutils": { @@ -8426,12 +8036,6 @@ } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -8484,12 +8088,6 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -8542,20 +8140,14 @@ "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=", - "dev": true - }, "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, @@ -8620,15 +8212,6 @@ "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=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -8684,22 +8267,6 @@ "wordwrap": "^1.0.0" } }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -8788,15 +8355,25 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "agent-base": "6", + "debug": "4" } }, "human-signals": { @@ -8846,12 +8423,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", @@ -8970,9 +8541,9 @@ } }, "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=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "is-promise": { @@ -9027,12 +8598,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -9284,37 +8849,22 @@ } }, "jest-junit": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.0.0.tgz", - "integrity": "sha512-+8K35LlboWiPuCnXSyiid7rFdxNlpCWWM20WEYe6IZH6psfUWKZmSpSRQ5tk0C0cBeDsvsnIzcef5mYhyJsbug==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.0.0.tgz", + "integrity": "sha512-JSHR+Dhb32FGJaiKkqsB7AR3OqWKtldLd6ZH2+FJ8D4tsweb8Id8zEVReU4+OlrRO1ZluqJLQEETm+Q6/KilBg==", "dev": true, "requires": { "mkdirp": "^1.0.4", - "strip-ansi": "^5.2.0", - "uuid": "^3.3.3", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", "xml": "^1.0.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 - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true - }, - "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" - } } } }, @@ -9593,44 +9143,47 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", "dev": true, "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", + "abab": "^2.0.5", + "acorn": "^8.2.4", "acorn-globals": "^6.0.0", "cssom": "^0.4.4", - "cssstyle": "^2.2.0", + "cssstyle": "^2.3.0", "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", + "decimal.js": "^10.2.1", "domexception": "^2.0.1", - "escodegen": "^1.14.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", + "tough-cookie": "^4.0.0", "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", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true + } } }, "jsesc": { @@ -9645,12 +9198,6 @@ "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=", - "dev": true - }, "json-schema-ref-parser": { "version": "9.0.6", "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", @@ -9724,23 +9271,11 @@ } }, "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", + "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", "dev": true }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "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", @@ -9790,12 +9325,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -9888,18 +9417,18 @@ } }, "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "dev": true }, "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dev": true, "requires": { - "mime-db": "1.45.0" + "mime-db": "1.51.0" } }, "mimic-fn": { @@ -10029,13 +9558,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true } } }, @@ -10072,12 +9594,6 @@ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -10251,9 +9767,9 @@ } }, "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, "pascalcase": { @@ -10286,12 +9802,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -10378,12 +9888,6 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "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==", - "dev": true - }, "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -10462,78 +9966,6 @@ "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==", - "dev": true, - "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": { - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "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==", - "dev": true, - "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", @@ -11187,23 +10619,6 @@ "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==", - "dev": true, - "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" - } - }, "stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", @@ -11297,12 +10712,6 @@ "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", "dev": true }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, "string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -11325,12 +10734,12 @@ } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -11485,40 +10894,25 @@ } }, "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "dev": true, "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } }, "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", "dev": true, "requires": { "punycode": "^2.1.1" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "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=", - "dev": true - }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -11582,6 +10976,12 @@ } } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -11653,9 +11053,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, "v8-to-istanbul": { @@ -11687,17 +11087,6 @@ "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=", - "dev": true, - "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", @@ -11747,13 +11136,13 @@ "dev": true }, "whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", + "lodash": "^4.7.0", + "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" } }, diff --git a/package.json b/package.json index 3cc2400e..ec4a01bc 100644 --- a/package.json +++ b/package.json @@ -33,9 +33,9 @@ "handlebars": "^4.7.7", "jest": "^26.6.3", "jest-expect-message": "1.0.2", - "jest-junit": "^12.0.0", + "jest-junit": "^13.0.0", "json-schema-to-typescript": "^10.0.0", - "jsonpointer": "^4.0.1", + "jsonpointer": "^5.0.0", "lodash": "^4.17.21", "prettier": "^2.0.1" }, From 8c99f7bdea77c82c9b9718c44a0f5488ad9555a9 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 25 Nov 2021 15:04:50 +0000 Subject: [PATCH 469/936] Add the option to change where default information is populated in ServiceNow (#310) --- integrations/servicenow/manifest.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 779d81e8..056f9f99 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -44,6 +44,15 @@ } } } + }, + { + "key": "detail_column", + "name": "Detailed information column name", + "description": "The name of the ServiceNow Change Request column used by LaunchDarkly to populate detailed approval request information.", + "type": "string", + "defaultValue": "justification", + "isOptional": true, + "placeholder": "justification" } ], "creationRequest": { @@ -57,7 +66,7 @@ } ] }, - "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", \"justification\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{timestamp.simple}}\"}", + "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{timestamp.simple}}\"}", "parser": { "approvalId": "/result/sys_id/value", "statusValue": "/result/state/value", From 4d47a65ae9c8ae446acdefab378b58ed2a2df437 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 3 Dec 2021 18:23:56 -0600 Subject: [PATCH 470/936] Renaming external refs to flag links --- integrations/jira/manifest.json | 2 +- integrations/slack-app/manifest.json | 2 +- manifest.schema.d.ts | 18 +++--- manifest.schema.json | 62 +++++++++---------- schemas/base.json | 6 +- ...externalReferences.json => flagLinks.json} | 60 +++++++++--------- 6 files changed, 75 insertions(+), 75 deletions(-) rename schemas/capabilities/{externalReferences.json => flagLinks.json} (73%) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 7afe6032..d75625bb 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -18,7 +18,7 @@ }, "otherCapabilities": ["external"], "capabilities": { - "externalReferences": { + "flagLinks": { "header": "JIRA issues", "emptyState": { "title": "There are no JIRA issues that link to this flag.", diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index fdaeb5e0..e762c72f 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -20,7 +20,7 @@ }, "otherCapabilities": ["webhooks"], "capabilities": { - "externalReferences": { + "flagLinks": { "header": "Slack conversations", "emptyState": { "title": "There are no Slack conversations that reference this flag.", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index a2c396d3..60ddc229 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -426,9 +426,9 @@ export type Type1 = "avatar" | "codeSnippet" | "hyperlink" | "string" | "multili */ export type Path = string; /** - * List of metadata blocks corresponding to information on the LaunchDarkly External References tab + * List of metadata blocks corresponding to information on the LaunchDarkly links tab */ -export type FlagReferencesMetadata = { +export type FlagLinksMetadata = { key?: Key2; name?: Name3; type?: Type1; @@ -593,7 +593,7 @@ export interface Capabilities { trigger?: Trigger; approval?: Approval; featureStore?: FeatureStore; - externalReferences?: ExternalFlagReferences; + flagLinks?: FlagLinks; [k: string]: unknown; } /** @@ -739,12 +739,12 @@ export interface FeatureStore { [k: string]: unknown; } /** - * This capability is used to manage inbound flag reference webhooks + * This capability is used to manage inbound flag links */ -export interface ExternalFlagReferences { +export interface FlagLinks { header: ReferenceGroupHeader; emptyState: EmptyState; - connector?: ExternalFlagReferencesConnector; + connector?: FlagLinksConnector; uiBlocks: UIBlocks; [k: string]: unknown; } @@ -757,10 +757,10 @@ export interface EmptyState { [k: string]: unknown; } /** - * Receiver configuration for inbound flag reference + * Receiver configuration for inbound flag links */ -export interface ExternalFlagReferencesConnector { - metadata?: FlagReferencesMetadata; +export interface FlagLinksConnector { + metadata?: FlagLinksMetadata; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index 3d4a5eb9..817c37c3 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -539,7 +539,7 @@ "trigger", "approval", "featureStore", - "externalReferences" + "flagLinks" ] }, "properties": { @@ -2666,10 +2666,10 @@ } } }, - "externalReferences": { - "$id": "#/properties/capability/external-references", - "title": "External Flag References", - "description": "This capability is used to manage inbound flag reference webhooks", + "flagLinks": { + "$id": "#/properties/capability/flag-links", + "title": "Flag Links", + "description": "This capability is used to manage inbound flag links", "type": "object", "propertyNames": { "enum": [ @@ -2686,13 +2686,13 @@ ], "properties": { "header": { - "$id": "#/properties/capability/external-references/header", + "$id": "#/properties/capability/flag-links/header", "title": "Reference group header", "description": "Title to show for all references for this integration", "type": "string" }, "emptyState": { - "$id": "#/properties/capability/external-references/empty-state", + "$id": "#/properties/capability/flag-links/empty-state", "title": "Empty state", "description": "Content to display when there are no references to display for this integration", "type": "object", @@ -2704,13 +2704,13 @@ }, "properties": { "title": { - "$id": "#/properties/capability/external-references/empty-state/title", + "$id": "#/properties/capability/flag-links/empty-state/title", "title": "Title", "type": "string", "description": "Title of the message" }, "leadText": { - "$id": "#/properties/capability/external-references/empty-state/lead-text", + "$id": "#/properties/capability/flag-links/empty-state/lead-text", "title": "Lead text", "type": "string", "description": "Text or markup content describing how references can be created for this integration" @@ -2718,15 +2718,15 @@ } }, "connector": { - "$id": "#/properties/capability/external-references/connector", - "title": "External Flag References Connector", - "description": "Receiver configuration for inbound flag reference", + "$id": "#/properties/capability/flag-links/connector", + "title": "Flag Links Connector", + "description": "Receiver configuration for inbound flag links", "type": "object", "properties": { "metadata": { - "$id": "#/properties/capability/external-references/connector/metadata", - "title": "Flag References Metadata", - "description": "List of metadata blocks corresponding to information on the LaunchDarkly External References tab", + "$id": "#/properties/capability/flag-links/connector/metadata", + "title": "Flag Links Metadata", + "description": "List of metadata blocks corresponding to information on the LaunchDarkly links tab", "type": "array", "items": { "type": "object", @@ -2740,21 +2740,21 @@ }, "properties": { "key": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/key", + "$id": "#/properties/capability/flag-links/connector/ui-blocks/key", "title": "Key", "type": "string", "description": "The unique key corresponding to the property to be displayed", "maxLength": 50 }, "name": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/name", + "$id": "#/properties/capability/flag-links/connector/ui-blocks/name", "title": "Name", "type": "string", "description": "The display name of the property", "maxLength": 50 }, "type": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/type", + "$id": "#/properties/capability/flag-links/connector/ui-blocks/type", "title": "Type", "type": "string", "enum": [ @@ -2768,7 +2768,7 @@ "description": "The data type of the information this metadata block will display" }, "path": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/path", + "$id": "#/properties/capability/flag-links/connector/ui-blocks/path", "title": "Path", "type": "string", "description": "The JSON path corresponding to where the information can be found in the incoming payload" @@ -2779,7 +2779,7 @@ } }, "uiBlocks": { - "$id": "#/properties/capability/external-references/ui-blocks", + "$id": "#/properties/capability/flag-links/ui-blocks", "title": "UI Blocks", "description": "UI blocks are visual components that represents a section of the view layout for a reference displayed in LaunchDarkly", "type": "object", @@ -2794,7 +2794,7 @@ }, "properties": { "image": { - "$id": "#/properties/capability/external-references/ui-blocks/image", + "$id": "#/properties/capability/flag-links/ui-blocks/image", "title": "Image", "type": "object", "description": "A visual block used to render an image in LaunchDarkly UI", @@ -2810,19 +2810,19 @@ ], "properties": { "sourceUrl": { - "$id": "#/properties/capability/external-references/ui-blocks/image/source-url", + "$id": "#/properties/capability/flag-links/ui-blocks/image/source-url", "title": "Source Url", "description": "Url of the image", "type": "string" }, "isIcon": { - "$id": "#/properties/capability/external-references/ui-blocks/image/is-icon", + "$id": "#/properties/capability/flag-links/ui-blocks/image/is-icon", "title": "Is icon", "description": "Indicates whether the image should be rendered as an icon", "type": "boolean" }, "isAvatar": { - "$id": "#/properties/capability/external-references/ui-blocks/image/is-avatar", + "$id": "#/properties/capability/flag-links/ui-blocks/image/is-avatar", "title": "Is avatar", "description": "Indicates whether the image should be rendered as an avatar", "type": "boolean" @@ -2830,13 +2830,13 @@ } }, "name": { - "$id": "#/properties/capability/external-references/ui-blocks/name", + "$id": "#/properties/capability/flag-links/ui-blocks/name", "title": "Name", "type": "string", "description": "Template string used to render a visual block in LaunchDarkly UI to display a name" }, "title": { - "$id": "#/properties/capability/external-references/ui-blocks/title", + "$id": "#/properties/capability/flag-links/ui-blocks/title", "title": "Title", "type": "object", "description": "Object with visual elements used to display a reference title in LaunchDarkly UI", @@ -2851,7 +2851,7 @@ ], "properties": { "elements": { - "$id": "#/properties/capability/external-references/ui-blocks/title/elements", + "$id": "#/properties/capability/flag-links/ui-blocks/title/elements", "title": "Elements", "description": "An array of elements to be combined to create a title block", "type": "array", @@ -2903,7 +2903,7 @@ "minLength": 1 }, "linkToReference": { - "$id": "#/properties/capability/external-references/ui-blocks/title/link-to-reference", + "$id": "#/properties/capability/flag-links/ui-blocks/title/link-to-reference", "title": "Link to reference", "description": "Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI", "type": "boolean", @@ -2912,13 +2912,13 @@ } }, "description": { - "$id": "#/properties/capability/external-references/ui-blocks/description", + "$id": "#/properties/capability/flag-links/ui-blocks/description", "title": "Description", "type": "string", "description": "Markdown string used to render a visual block in LaunchDarkly UI to display a reference description" }, "context": { - "$id": "#/properties/capability/external-references/ui-blocks/reference-context", + "$id": "#/properties/capability/flag-links/ui-blocks/reference-context", "title": "Reference Context", "type": "object", "description": "Object with visual elements used to display context information for a reference in LaunchDarkly UI", @@ -2932,7 +2932,7 @@ ], "properties": { "elements": { - "$id": "#/properties/capability/external-references/ui-blocks/context/elements", + "$id": "#/properties/capability/flag-links/ui-blocks/context/elements", "description": "An array of elements to be combined to create a context block", "title": "Elements", "type": "array", diff --git a/schemas/base.json b/schemas/base.json index b72e9935..93e3e8ac 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -248,7 +248,7 @@ "trigger", "approval", "featureStore", - "externalReferences" + "flagLinks" ] }, "properties": { @@ -267,8 +267,8 @@ "featureStore": { "$ref": "schemas/capabilities/featureStore.json#/featureStore" }, - "externalReferences": { - "$ref": "schemas/capabilities/externalReferences.json#/externalReferences" + "flagLinks": { + "$ref": "schemas/capabilities/flagLinks.json#/flagLinks" } } } diff --git a/schemas/capabilities/externalReferences.json b/schemas/capabilities/flagLinks.json similarity index 73% rename from schemas/capabilities/externalReferences.json rename to schemas/capabilities/flagLinks.json index 5234b8de..5297445a 100644 --- a/schemas/capabilities/externalReferences.json +++ b/schemas/capabilities/flagLinks.json @@ -1,9 +1,9 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "externalReferences": { - "$id": "#/properties/capability/external-references", - "title": "External Flag References", - "description": "This capability is used to manage inbound flag reference webhooks", + "flagLinks": { + "$id": "#/properties/capability/flag-links", + "title": "Flag Links", + "description": "This capability is used to manage inbound flag links", "type": "object", "propertyNames": { "enum": ["connector", "uiBlocks", "emptyState", "header"] @@ -11,13 +11,13 @@ "required": ["uiBlocks", "header", "emptyState"], "properties": { "header": { - "$id": "#/properties/capability/external-references/header", + "$id": "#/properties/capability/flag-links/header", "title": "Reference group header", "description": "Title to show for all references for this integration", "type": "string" }, "emptyState": { - "$id": "#/properties/capability/external-references/empty-state", + "$id": "#/properties/capability/flag-links/empty-state", "title": "Empty state", "description": "Content to display when there are no references to display for this integration", "type": "object", @@ -26,13 +26,13 @@ }, "properties": { "title": { - "$id": "#/properties/capability/external-references/empty-state/title", + "$id": "#/properties/capability/flag-links/empty-state/title", "title": "Title", "type": "string", "description": "Title of the message" }, "leadText": { - "$id": "#/properties/capability/external-references/empty-state/lead-text", + "$id": "#/properties/capability/flag-links/empty-state/lead-text", "title": "Lead text", "type": "string", "description": "Text or markup content describing how references can be created for this integration" @@ -40,15 +40,15 @@ } }, "connector": { - "$id": "#/properties/capability/external-references/connector", - "title": "External Flag References Connector", - "description": "Receiver configuration for inbound flag reference", + "$id": "#/properties/capability/flag-links/connector", + "title": "Flag Links Connector", + "description": "Receiver configuration for inbound flag links", "type": "object", "properties": { "metadata": { - "$id": "#/properties/capability/external-references/connector/metadata", - "title": "Flag References Metadata", - "description": "List of metadata blocks corresponding to information on the LaunchDarkly External References tab", + "$id": "#/properties/capability/flag-links/connector/metadata", + "title": "Flag Links Metadata", + "description": "List of metadata blocks corresponding to information on the LaunchDarkly links tab", "type": "array", "items": { "type": "object", @@ -57,21 +57,21 @@ }, "properties": { "key": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/key", + "$id": "#/properties/capability/flag-links/connector/ui-blocks/key", "title": "Key", "type": "string", "description": "The unique key corresponding to the property to be displayed", "maxLength": 50 }, "name": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/name", + "$id": "#/properties/capability/flag-links/connector/ui-blocks/name", "title": "Name", "type": "string", "description": "The display name of the property", "maxLength": 50 }, "type": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/type", + "$id": "#/properties/capability/flag-links/connector/ui-blocks/type", "title": "Type", "type": "string", "enum": [ @@ -85,7 +85,7 @@ "description": "The data type of the information this metadata block will display" }, "path": { - "$id": "#/properties/capability/external-references/connector/ui-blocks/path", + "$id": "#/properties/capability/flag-links/connector/ui-blocks/path", "title": "Path", "type": "string", "description": "The JSON path corresponding to where the information can be found in the incoming payload" @@ -96,7 +96,7 @@ } }, "uiBlocks": { - "$id": "#/properties/capability/external-references/ui-blocks", + "$id": "#/properties/capability/flag-links/ui-blocks", "title": "UI Blocks", "description": "UI blocks are visual components that represents a section of the view layout for a reference displayed in LaunchDarkly", "type": "object", @@ -105,7 +105,7 @@ }, "properties": { "image": { - "$id": "#/properties/capability/external-references/ui-blocks/image", + "$id": "#/properties/capability/flag-links/ui-blocks/image", "title": "Image", "type": "object", "description": "A visual block used to render an image in LaunchDarkly UI", @@ -115,19 +115,19 @@ "required": ["sourceUrl"], "properties": { "sourceUrl": { - "$id": "#/properties/capability/external-references/ui-blocks/image/source-url", + "$id": "#/properties/capability/flag-links/ui-blocks/image/source-url", "title": "Source Url", "description": "Url of the image", "type": "string" }, "isIcon": { - "$id": "#/properties/capability/external-references/ui-blocks/image/is-icon", + "$id": "#/properties/capability/flag-links/ui-blocks/image/is-icon", "title": "Is icon", "description": "Indicates whether the image should be rendered as an icon", "type": "boolean" }, "isAvatar": { - "$id": "#/properties/capability/external-references/ui-blocks/image/is-avatar", + "$id": "#/properties/capability/flag-links/ui-blocks/image/is-avatar", "title": "Is avatar", "description": "Indicates whether the image should be rendered as an avatar", "type": "boolean" @@ -135,13 +135,13 @@ } }, "name": { - "$id": "#/properties/capability/external-references/ui-blocks/name", + "$id": "#/properties/capability/flag-links/ui-blocks/name", "title": "Name", "type": "string", "description": "Template string used to render a visual block in LaunchDarkly UI to display a name" }, "title": { - "$id": "#/properties/capability/external-references/ui-blocks/title", + "$id": "#/properties/capability/flag-links/ui-blocks/title", "title": "Title", "type": "object", "description": "Object with visual elements used to display a reference title in LaunchDarkly UI", @@ -151,7 +151,7 @@ "required": ["elements"], "properties": { "elements": { - "$id": "#/properties/capability/external-references/ui-blocks/title/elements", + "$id": "#/properties/capability/flag-links/ui-blocks/title/elements", "title": "Elements", "description": "An array of elements to be combined to create a title block", "type": "array", @@ -161,7 +161,7 @@ "minLength": 1 }, "linkToReference": { - "$id": "#/properties/capability/external-references/ui-blocks/title/link-to-reference", + "$id": "#/properties/capability/flag-links/ui-blocks/title/link-to-reference", "title": "Link to reference", "description": "Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI", "type": "boolean", @@ -170,13 +170,13 @@ } }, "description": { - "$id": "#/properties/capability/external-references/ui-blocks/description", + "$id": "#/properties/capability/flag-links/ui-blocks/description", "title": "Description", "type": "string", "description": "Markdown string used to render a visual block in LaunchDarkly UI to display a reference description" }, "context": { - "$id": "#/properties/capability/external-references/ui-blocks/reference-context", + "$id": "#/properties/capability/flag-links/ui-blocks/reference-context", "title": "Reference Context", "type": "object", "description": "Object with visual elements used to display context information for a reference in LaunchDarkly UI", @@ -186,7 +186,7 @@ "required": ["elements"], "properties": { "elements": { - "$id": "#/properties/capability/external-references/ui-blocks/context/elements", + "$id": "#/properties/capability/flag-links/ui-blocks/context/elements", "description": "An array of elements to be combined to create a context block", "title": "Elements", "type": "array", From f4cdd0064b2b15b3802b48ee757999697a44b08c Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 3 Dec 2021 19:47:33 -0600 Subject: [PATCH 471/936] More renaming --- integrations/jira/manifest.json | 2 +- integrations/slack-app/manifest.json | 2 +- manifest.schema.d.ts | 34 ++++----- manifest.schema.json | 74 +++++++++---------- schemas/base.json | 6 +- .../{flagLinks.json => flagLink.json} | 72 +++++++++--------- 6 files changed, 95 insertions(+), 95 deletions(-) rename schemas/capabilities/{flagLinks.json => flagLink.json} (70%) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index d75625bb..d822e13f 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -18,7 +18,7 @@ }, "otherCapabilities": ["external"], "capabilities": { - "flagLinks": { + "flagLink": { "header": "JIRA issues", "emptyState": { "title": "There are no JIRA issues that link to this flag.", diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index e762c72f..a5481f36 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -20,7 +20,7 @@ }, "otherCapabilities": ["webhooks"], "capabilities": { - "flagLinks": { + "flagLink": { "header": "Slack conversations", "emptyState": { "title": "There are no Slack conversations that reference this flag.", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 60ddc229..a904a29f 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -398,15 +398,15 @@ export type URLTemplate = string; */ export type ProviderFormVariables = FormVariable[]; /** - * Title to show for all references for this integration + * Title to show for all links for this integration */ -export type ReferenceGroupHeader = string; +export type LinkGroupHeader = string; /** * Title of the message */ export type Title = string; /** - * Text or markup content describing how references can be created for this integration + * Text or markup content describing how links can be created for this integration */ export type LeadText = string; /** @@ -428,7 +428,7 @@ export type Path = string; /** * List of metadata blocks corresponding to information on the LaunchDarkly links tab */ -export type FlagLinksMetadata = { +export type FlagLinkMetadata = { key?: Key2; name?: Name3; type?: Type1; @@ -476,7 +476,7 @@ export type Elements = UIBlockElement[]; */ export type LinkToReference = boolean; /** - * Markdown string used to render a visual block in LaunchDarkly UI to display a reference description + * Markdown string used to render a visual block in LaunchDarkly UI to display a link description */ export type Description3 = string; /** @@ -593,7 +593,7 @@ export interface Capabilities { trigger?: Trigger; approval?: Approval; featureStore?: FeatureStore; - flagLinks?: FlagLinks; + flagLink?: FlagLink; [k: string]: unknown; } /** @@ -741,15 +741,15 @@ export interface FeatureStore { /** * This capability is used to manage inbound flag links */ -export interface FlagLinks { - header: ReferenceGroupHeader; +export interface FlagLink { + header: LinkGroupHeader; emptyState: EmptyState; - connector?: FlagLinksConnector; + connector?: FlagLinkConnector; uiBlocks: UIBlocks; [k: string]: unknown; } /** - * Content to display when there are no references to display for this integration + * Content to display when there are no links to display for this integration */ export interface EmptyState { title?: Title; @@ -759,19 +759,19 @@ export interface EmptyState { /** * Receiver configuration for inbound flag links */ -export interface FlagLinksConnector { - metadata?: FlagLinksMetadata; +export interface FlagLinkConnector { + metadata?: FlagLinkMetadata; [k: string]: unknown; } /** - * UI blocks are visual components that represents a section of the view layout for a reference displayed in LaunchDarkly + * UI blocks are visual components that represents a section of the view layout for a flag link displayed in LaunchDarkly */ export interface UIBlocks { image?: Image; name?: Name4; title?: Title1; description?: Description3; - context?: ReferenceContext; + context?: LinkContext; [k: string]: unknown; } /** @@ -784,7 +784,7 @@ export interface Image { [k: string]: unknown; } /** - * Object with visual elements used to display a reference title in LaunchDarkly UI + * Object with visual elements used to display a link title in LaunchDarkly UI */ export interface Title1 { elements: Elements; @@ -802,9 +802,9 @@ export interface UIBlockElement { [k: string]: unknown; } /** - * Object with visual elements used to display context information for a reference in LaunchDarkly UI + * Object with visual elements used to display context information for a link in LaunchDarkly UI */ -export interface ReferenceContext { +export interface LinkContext { elements: Elements1; [k: string]: unknown; } diff --git a/manifest.schema.json b/manifest.schema.json index 817c37c3..9d604d84 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -539,7 +539,7 @@ "trigger", "approval", "featureStore", - "flagLinks" + "flagLink" ] }, "properties": { @@ -2666,9 +2666,9 @@ } } }, - "flagLinks": { - "$id": "#/properties/capability/flag-links", - "title": "Flag Links", + "flagLink": { + "$id": "#/properties/capability/flag-link", + "title": "flagLink", "description": "This capability is used to manage inbound flag links", "type": "object", "propertyNames": { @@ -2686,15 +2686,15 @@ ], "properties": { "header": { - "$id": "#/properties/capability/flag-links/header", - "title": "Reference group header", - "description": "Title to show for all references for this integration", + "$id": "#/properties/capability/flag-link/header", + "title": "Link group header", + "description": "Title to show for all links for this integration", "type": "string" }, "emptyState": { - "$id": "#/properties/capability/flag-links/empty-state", + "$id": "#/properties/capability/flag-link/empty-state", "title": "Empty state", - "description": "Content to display when there are no references to display for this integration", + "description": "Content to display when there are no links to display for this integration", "type": "object", "propertyNames": { "enum": [ @@ -2704,28 +2704,28 @@ }, "properties": { "title": { - "$id": "#/properties/capability/flag-links/empty-state/title", + "$id": "#/properties/capability/flag-link/empty-state/title", "title": "Title", "type": "string", "description": "Title of the message" }, "leadText": { - "$id": "#/properties/capability/flag-links/empty-state/lead-text", + "$id": "#/properties/capability/flag-link/empty-state/lead-text", "title": "Lead text", "type": "string", - "description": "Text or markup content describing how references can be created for this integration" + "description": "Text or markup content describing how links can be created for this integration" } } }, "connector": { - "$id": "#/properties/capability/flag-links/connector", - "title": "Flag Links Connector", + "$id": "#/properties/capability/flag-link/connector", + "title": "flagLink Connector", "description": "Receiver configuration for inbound flag links", "type": "object", "properties": { "metadata": { - "$id": "#/properties/capability/flag-links/connector/metadata", - "title": "Flag Links Metadata", + "$id": "#/properties/capability/flag-link/connector/metadata", + "title": "flagLink Metadata", "description": "List of metadata blocks corresponding to information on the LaunchDarkly links tab", "type": "array", "items": { @@ -2740,21 +2740,21 @@ }, "properties": { "key": { - "$id": "#/properties/capability/flag-links/connector/ui-blocks/key", + "$id": "#/properties/capability/flag-link/connector/ui-blocks/key", "title": "Key", "type": "string", "description": "The unique key corresponding to the property to be displayed", "maxLength": 50 }, "name": { - "$id": "#/properties/capability/flag-links/connector/ui-blocks/name", + "$id": "#/properties/capability/flag-link/connector/ui-blocks/name", "title": "Name", "type": "string", "description": "The display name of the property", "maxLength": 50 }, "type": { - "$id": "#/properties/capability/flag-links/connector/ui-blocks/type", + "$id": "#/properties/capability/flag-link/connector/ui-blocks/type", "title": "Type", "type": "string", "enum": [ @@ -2768,7 +2768,7 @@ "description": "The data type of the information this metadata block will display" }, "path": { - "$id": "#/properties/capability/flag-links/connector/ui-blocks/path", + "$id": "#/properties/capability/flag-link/connector/ui-blocks/path", "title": "Path", "type": "string", "description": "The JSON path corresponding to where the information can be found in the incoming payload" @@ -2779,9 +2779,9 @@ } }, "uiBlocks": { - "$id": "#/properties/capability/flag-links/ui-blocks", + "$id": "#/properties/capability/flag-link/ui-blocks", "title": "UI Blocks", - "description": "UI blocks are visual components that represents a section of the view layout for a reference displayed in LaunchDarkly", + "description": "UI blocks are visual components that represents a section of the view layout for a flag link displayed in LaunchDarkly", "type": "object", "propertyNames": { "enum": [ @@ -2794,7 +2794,7 @@ }, "properties": { "image": { - "$id": "#/properties/capability/flag-links/ui-blocks/image", + "$id": "#/properties/capability/flag-link/ui-blocks/image", "title": "Image", "type": "object", "description": "A visual block used to render an image in LaunchDarkly UI", @@ -2810,19 +2810,19 @@ ], "properties": { "sourceUrl": { - "$id": "#/properties/capability/flag-links/ui-blocks/image/source-url", + "$id": "#/properties/capability/flag-link/ui-blocks/image/source-url", "title": "Source Url", "description": "Url of the image", "type": "string" }, "isIcon": { - "$id": "#/properties/capability/flag-links/ui-blocks/image/is-icon", + "$id": "#/properties/capability/flag-link/ui-blocks/image/is-icon", "title": "Is icon", "description": "Indicates whether the image should be rendered as an icon", "type": "boolean" }, "isAvatar": { - "$id": "#/properties/capability/flag-links/ui-blocks/image/is-avatar", + "$id": "#/properties/capability/flag-link/ui-blocks/image/is-avatar", "title": "Is avatar", "description": "Indicates whether the image should be rendered as an avatar", "type": "boolean" @@ -2830,16 +2830,16 @@ } }, "name": { - "$id": "#/properties/capability/flag-links/ui-blocks/name", + "$id": "#/properties/capability/flag-link/ui-blocks/name", "title": "Name", "type": "string", "description": "Template string used to render a visual block in LaunchDarkly UI to display a name" }, "title": { - "$id": "#/properties/capability/flag-links/ui-blocks/title", + "$id": "#/properties/capability/flag-link/ui-blocks/title", "title": "Title", "type": "object", - "description": "Object with visual elements used to display a reference title in LaunchDarkly UI", + "description": "Object with visual elements used to display a link title in LaunchDarkly UI", "propertyNames": { "enum": [ "elements", @@ -2851,7 +2851,7 @@ ], "properties": { "elements": { - "$id": "#/properties/capability/flag-links/ui-blocks/title/elements", + "$id": "#/properties/capability/flag-link/ui-blocks/title/elements", "title": "Elements", "description": "An array of elements to be combined to create a title block", "type": "array", @@ -2903,7 +2903,7 @@ "minLength": 1 }, "linkToReference": { - "$id": "#/properties/capability/flag-links/ui-blocks/title/link-to-reference", + "$id": "#/properties/capability/flag-link/ui-blocks/title/link-to-reference", "title": "Link to reference", "description": "Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI", "type": "boolean", @@ -2912,16 +2912,16 @@ } }, "description": { - "$id": "#/properties/capability/flag-links/ui-blocks/description", + "$id": "#/properties/capability/flag-link/ui-blocks/description", "title": "Description", "type": "string", - "description": "Markdown string used to render a visual block in LaunchDarkly UI to display a reference description" + "description": "Markdown string used to render a visual block in LaunchDarkly UI to display a link description" }, "context": { - "$id": "#/properties/capability/flag-links/ui-blocks/reference-context", - "title": "Reference Context", + "$id": "#/properties/capability/flag-link/ui-blocks/link-context", + "title": "Link Context", "type": "object", - "description": "Object with visual elements used to display context information for a reference in LaunchDarkly UI", + "description": "Object with visual elements used to display context information for a link in LaunchDarkly UI", "propertyNames": { "enum": [ "elements" @@ -2932,7 +2932,7 @@ ], "properties": { "elements": { - "$id": "#/properties/capability/flag-links/ui-blocks/context/elements", + "$id": "#/properties/capability/flag-link/ui-blocks/context/elements", "description": "An array of elements to be combined to create a context block", "title": "Elements", "type": "array", diff --git a/schemas/base.json b/schemas/base.json index 93e3e8ac..d2b6daa2 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -248,7 +248,7 @@ "trigger", "approval", "featureStore", - "flagLinks" + "flagLink" ] }, "properties": { @@ -267,8 +267,8 @@ "featureStore": { "$ref": "schemas/capabilities/featureStore.json#/featureStore" }, - "flagLinks": { - "$ref": "schemas/capabilities/flagLinks.json#/flagLinks" + "flagLink": { + "$ref": "schemas/capabilities/flagLink.json#/flagLink" } } } diff --git a/schemas/capabilities/flagLinks.json b/schemas/capabilities/flagLink.json similarity index 70% rename from schemas/capabilities/flagLinks.json rename to schemas/capabilities/flagLink.json index 5297445a..37f745eb 100644 --- a/schemas/capabilities/flagLinks.json +++ b/schemas/capabilities/flagLink.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "flagLinks": { - "$id": "#/properties/capability/flag-links", - "title": "Flag Links", + "flagLink": { + "$id": "#/properties/capability/flag-link", + "title": "flagLink", "description": "This capability is used to manage inbound flag links", "type": "object", "propertyNames": { @@ -11,43 +11,43 @@ "required": ["uiBlocks", "header", "emptyState"], "properties": { "header": { - "$id": "#/properties/capability/flag-links/header", - "title": "Reference group header", - "description": "Title to show for all references for this integration", + "$id": "#/properties/capability/flag-link/header", + "title": "Link group header", + "description": "Title to show for all links for this integration", "type": "string" }, "emptyState": { - "$id": "#/properties/capability/flag-links/empty-state", + "$id": "#/properties/capability/flag-link/empty-state", "title": "Empty state", - "description": "Content to display when there are no references to display for this integration", + "description": "Content to display when there are no links to display for this integration", "type": "object", "propertyNames": { "enum": ["title", "leadText"] }, "properties": { "title": { - "$id": "#/properties/capability/flag-links/empty-state/title", + "$id": "#/properties/capability/flag-link/empty-state/title", "title": "Title", "type": "string", "description": "Title of the message" }, "leadText": { - "$id": "#/properties/capability/flag-links/empty-state/lead-text", + "$id": "#/properties/capability/flag-link/empty-state/lead-text", "title": "Lead text", "type": "string", - "description": "Text or markup content describing how references can be created for this integration" + "description": "Text or markup content describing how links can be created for this integration" } } }, "connector": { - "$id": "#/properties/capability/flag-links/connector", - "title": "Flag Links Connector", + "$id": "#/properties/capability/flag-link/connector", + "title": "flagLink Connector", "description": "Receiver configuration for inbound flag links", "type": "object", "properties": { "metadata": { - "$id": "#/properties/capability/flag-links/connector/metadata", - "title": "Flag Links Metadata", + "$id": "#/properties/capability/flag-link/connector/metadata", + "title": "flagLink Metadata", "description": "List of metadata blocks corresponding to information on the LaunchDarkly links tab", "type": "array", "items": { @@ -57,21 +57,21 @@ }, "properties": { "key": { - "$id": "#/properties/capability/flag-links/connector/ui-blocks/key", + "$id": "#/properties/capability/flag-link/connector/ui-blocks/key", "title": "Key", "type": "string", "description": "The unique key corresponding to the property to be displayed", "maxLength": 50 }, "name": { - "$id": "#/properties/capability/flag-links/connector/ui-blocks/name", + "$id": "#/properties/capability/flag-link/connector/ui-blocks/name", "title": "Name", "type": "string", "description": "The display name of the property", "maxLength": 50 }, "type": { - "$id": "#/properties/capability/flag-links/connector/ui-blocks/type", + "$id": "#/properties/capability/flag-link/connector/ui-blocks/type", "title": "Type", "type": "string", "enum": [ @@ -85,7 +85,7 @@ "description": "The data type of the information this metadata block will display" }, "path": { - "$id": "#/properties/capability/flag-links/connector/ui-blocks/path", + "$id": "#/properties/capability/flag-link/connector/ui-blocks/path", "title": "Path", "type": "string", "description": "The JSON path corresponding to where the information can be found in the incoming payload" @@ -96,16 +96,16 @@ } }, "uiBlocks": { - "$id": "#/properties/capability/flag-links/ui-blocks", + "$id": "#/properties/capability/flag-link/ui-blocks", "title": "UI Blocks", - "description": "UI blocks are visual components that represents a section of the view layout for a reference displayed in LaunchDarkly", + "description": "UI blocks are visual components that represents a section of the view layout for a flag link displayed in LaunchDarkly", "type": "object", "propertyNames": { "enum": ["image", "name", "title", "context", "description"] }, "properties": { "image": { - "$id": "#/properties/capability/flag-links/ui-blocks/image", + "$id": "#/properties/capability/flag-link/ui-blocks/image", "title": "Image", "type": "object", "description": "A visual block used to render an image in LaunchDarkly UI", @@ -115,19 +115,19 @@ "required": ["sourceUrl"], "properties": { "sourceUrl": { - "$id": "#/properties/capability/flag-links/ui-blocks/image/source-url", + "$id": "#/properties/capability/flag-link/ui-blocks/image/source-url", "title": "Source Url", "description": "Url of the image", "type": "string" }, "isIcon": { - "$id": "#/properties/capability/flag-links/ui-blocks/image/is-icon", + "$id": "#/properties/capability/flag-link/ui-blocks/image/is-icon", "title": "Is icon", "description": "Indicates whether the image should be rendered as an icon", "type": "boolean" }, "isAvatar": { - "$id": "#/properties/capability/flag-links/ui-blocks/image/is-avatar", + "$id": "#/properties/capability/flag-link/ui-blocks/image/is-avatar", "title": "Is avatar", "description": "Indicates whether the image should be rendered as an avatar", "type": "boolean" @@ -135,23 +135,23 @@ } }, "name": { - "$id": "#/properties/capability/flag-links/ui-blocks/name", + "$id": "#/properties/capability/flag-link/ui-blocks/name", "title": "Name", "type": "string", "description": "Template string used to render a visual block in LaunchDarkly UI to display a name" }, "title": { - "$id": "#/properties/capability/flag-links/ui-blocks/title", + "$id": "#/properties/capability/flag-link/ui-blocks/title", "title": "Title", "type": "object", - "description": "Object with visual elements used to display a reference title in LaunchDarkly UI", + "description": "Object with visual elements used to display a link title in LaunchDarkly UI", "propertyNames": { "enum": ["elements", "linkToReference"] }, "required": ["elements"], "properties": { "elements": { - "$id": "#/properties/capability/flag-links/ui-blocks/title/elements", + "$id": "#/properties/capability/flag-link/ui-blocks/title/elements", "title": "Elements", "description": "An array of elements to be combined to create a title block", "type": "array", @@ -161,7 +161,7 @@ "minLength": 1 }, "linkToReference": { - "$id": "#/properties/capability/flag-links/ui-blocks/title/link-to-reference", + "$id": "#/properties/capability/flag-link/ui-blocks/title/link-to-reference", "title": "Link to reference", "description": "Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI", "type": "boolean", @@ -170,23 +170,23 @@ } }, "description": { - "$id": "#/properties/capability/flag-links/ui-blocks/description", + "$id": "#/properties/capability/flag-link/ui-blocks/description", "title": "Description", "type": "string", - "description": "Markdown string used to render a visual block in LaunchDarkly UI to display a reference description" + "description": "Markdown string used to render a visual block in LaunchDarkly UI to display a link description" }, "context": { - "$id": "#/properties/capability/flag-links/ui-blocks/reference-context", - "title": "Reference Context", + "$id": "#/properties/capability/flag-link/ui-blocks/link-context", + "title": "Link Context", "type": "object", - "description": "Object with visual elements used to display context information for a reference in LaunchDarkly UI", + "description": "Object with visual elements used to display context information for a link in LaunchDarkly UI", "propertyNames": { "enum": ["elements"] }, "required": ["elements"], "properties": { "elements": { - "$id": "#/properties/capability/flag-links/ui-blocks/context/elements", + "$id": "#/properties/capability/flag-link/ui-blocks/context/elements", "description": "An array of elements to be combined to create a context block", "title": "Elements", "type": "array", From 367e34ad2315b25013bad038d1ab418aebe219aa Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 3 Dec 2021 19:49:42 -0600 Subject: [PATCH 472/936] Renamed link context -> flag link context --- manifest.schema.d.ts | 4 ++-- manifest.schema.json | 2 +- schemas/capabilities/flagLink.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index a904a29f..c0bdb280 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -771,7 +771,7 @@ export interface UIBlocks { name?: Name4; title?: Title1; description?: Description3; - context?: LinkContext; + context?: FlagLinkContext; [k: string]: unknown; } /** @@ -804,7 +804,7 @@ export interface UIBlockElement { /** * Object with visual elements used to display context information for a link in LaunchDarkly UI */ -export interface LinkContext { +export interface FlagLinkContext { elements: Elements1; [k: string]: unknown; } diff --git a/manifest.schema.json b/manifest.schema.json index 9d604d84..5a70c4c4 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2919,7 +2919,7 @@ }, "context": { "$id": "#/properties/capability/flag-link/ui-blocks/link-context", - "title": "Link Context", + "title": "Flag Link Context", "type": "object", "description": "Object with visual elements used to display context information for a link in LaunchDarkly UI", "propertyNames": { diff --git a/schemas/capabilities/flagLink.json b/schemas/capabilities/flagLink.json index 37f745eb..a1a7f9c4 100644 --- a/schemas/capabilities/flagLink.json +++ b/schemas/capabilities/flagLink.json @@ -177,7 +177,7 @@ }, "context": { "$id": "#/properties/capability/flag-link/ui-blocks/link-context", - "title": "Link Context", + "title": "Flag Link Context", "type": "object", "description": "Object with visual elements used to display context information for a link in LaunchDarkly UI", "propertyNames": { From aa64e89a24dec25e86d06d4e8970b78adc8f8f15 Mon Sep 17 00:00:00 2001 From: Christie Williams Date: Wed, 8 Dec 2021 14:54:34 -0500 Subject: [PATCH 473/936] Update Cloudflare manifest --- integrations/cloudflare/manifest.json | 37 ++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/integrations/cloudflare/manifest.json b/integrations/cloudflare/manifest.json index ebfb3cd1..76d83526 100644 --- a/integrations/cloudflare/manifest.json +++ b/integrations/cloudflare/manifest.json @@ -42,7 +42,42 @@ "type": "string", "isSecret": true } - ] + ], + "validationRequest": { + "endpoint": { + "url": "https://api.cloudflare.com/client/v4/accounts/{{accountId}}/storage/kv/namespaces/{{namespaceId}}/keys", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, + "parser": { + "success": "success" + } + }, + "featureStoreRequest": { + "endpoint": { + "url": "https://api.cloudflare.com/client/v4/accounts/{{accountId}}/storage/kv/namespaces/{{namespaceId}}/values/{{_featureStoreKey}}", + "method": "PUT", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + }, + { + "name": "Content-Type", + "value": "text/plain" + } + ] + }, + "parser": { + "success": "success", + "errors": "errors" + } + } } } } From a8d7ddd2bc9a89ac776eaa6c6464b75b6a03aa42 Mon Sep 17 00:00:00 2001 From: Christie Williams Date: Wed, 8 Dec 2021 16:36:18 -0500 Subject: [PATCH 474/936] Update feature store capability schema --- manifest.schema.d.ts | 28 +++ manifest.schema.json | 283 +++++++++++++++++++++++- schemas/capabilities/featureStore.json | 40 +++- schemas/capabilities/parser/parser.json | 22 ++ 4 files changed, 369 insertions(+), 4 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index c0bdb280..78abf5b6 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -397,6 +397,8 @@ export type URLTemplate = string; * Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store */ export type ProviderFormVariables = FormVariable[]; +export type SuccessPointer = string; +export type ErrorsPointer = string; /** * Title to show for all links for this integration */ @@ -736,6 +738,32 @@ export interface DeletionRequest { */ export interface FeatureStore { formVariables: ProviderFormVariables; + validationRequest?: ValidationRequest; + featureStoreRequest: FeatureStoreRequest; + [k: string]: unknown; +} +/** + * Details needed to make a request to test that the provided form variables are valid + */ +export interface ValidationRequest { + endpoint: Endpoint; + parser: FeatureStoreRequestParser; + [k: string]: unknown; +} +/** + * Mapping to success/errors value(s) in a JSON response body + */ +export interface FeatureStoreRequestParser { + success: SuccessPointer; + errors?: ErrorsPointer; + [k: string]: unknown; +} +/** + * Details needed to make a request to deliver the flag payload to the feature store + */ +export interface FeatureStoreRequest { + endpoint: Endpoint; + parser: FeatureStoreRequestParser; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index 5a70c4c4..4cdcdf70 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2385,11 +2385,14 @@ "type": "object", "propertyNames": { "enum": [ - "formVariables" + "formVariables", + "validationRequest", + "featureStoreRequest" ] }, "required": [ - "formVariables" + "formVariables", + "featureStoreRequest" ], "properties": { "formVariables": { @@ -2663,6 +2666,282 @@ ] }, "default": [] + }, + "validationRequest": { + "$id": "#/capabilities/feature-store/validation-request", + "title": "Validation request", + "description": "Details needed to make a request to test that the provided form variables are valid", + "type": "object", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/feature-store-request-parser", + "title": "Feature store request parser", + "description": "Mapping to success/errors value(s) in a JSON response body", + "type": "object", + "propertyNames": { + "enum": [ + "success", + "errors" + ] + }, + "required": [ + "success" + ], + "properties": { + "success": { + "$id": "#/capabilities/feature-store/feature-store-request/parser/success", + "title": "Success pointer", + "type": "string" + }, + "errors": { + "$id": "#/capabilities/feature-store/feature-store-request/parser/errors", + "title": "Errors pointer", + "type": "string" + } + } + } + } + }, + "featureStoreRequest": { + "$id": "#/capabilities/feature-store/feature-store-request", + "title": "Feature store request", + "description": "Details needed to make a request to deliver the flag payload to the feature store", + "type": "object", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/feature-store-request-parser", + "title": "Feature store request parser", + "description": "Mapping to success/errors value(s) in a JSON response body", + "type": "object", + "propertyNames": { + "enum": [ + "success", + "errors" + ] + }, + "required": [ + "success" + ], + "properties": { + "success": { + "$id": "#/capabilities/feature-store/feature-store-request/parser/success", + "title": "Success pointer", + "type": "string" + }, + "errors": { + "$id": "#/capabilities/feature-store/feature-store-request/parser/errors", + "title": "Errors pointer", + "type": "string" + } + } + } + } } } }, diff --git a/schemas/capabilities/featureStore.json b/schemas/capabilities/featureStore.json index 9a9fec42..65aac1d6 100644 --- a/schemas/capabilities/featureStore.json +++ b/schemas/capabilities/featureStore.json @@ -6,9 +6,9 @@ "description": "This capability allows LaunchDarkly to write feature flag data to a given provider", "type": "object", "propertyNames": { - "enum": ["formVariables"] + "enum": ["formVariables", "validationRequest", "featureStoreRequest"] }, - "required": ["formVariables"], + "required": ["formVariables", "featureStoreRequest"], "properties": { "formVariables": { "$id": "#/capabilities/feature-store/form-variables", @@ -19,6 +19,42 @@ "$ref": "../definitions.json#/formVariable" }, "default": [] + }, + "validationRequest": { + "$id": "#/capabilities/feature-store/validation-request", + "title": "Validation request", + "description": "Details needed to make a request to test that the provided form variables are valid", + "type": "object", + "propertyNames": { + "enum": ["endpoint", "parser"] + }, + "required": ["endpoint", "parser"], + "properties": { + "endpoint": { + "$ref": "../definitions.json#/endpoint" + }, + "parser": { + "$ref": "./parser/parser.json#/featureStoreRequestParser" + } + } + }, + "featureStoreRequest": { + "$id": "#/capabilities/feature-store/feature-store-request", + "title": "Feature store request", + "description": "Details needed to make a request to deliver the flag payload to the feature store", + "type": "object", + "propertyNames": { + "enum": ["endpoint", "parser"] + }, + "required": ["endpoint", "parser"], + "properties": { + "endpoint": { + "$ref": "../definitions.json#/endpoint" + }, + "parser": { + "$ref": "./parser/parser.json#/featureStoreRequestParser" + } + } } } } diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index 0b804a6b..59f9b665 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -123,5 +123,27 @@ } } } + }, + "featureStoreRequestParser": { + "$id": "#/feature-store-request-parser", + "title": "Feature store request parser", + "description": "Mapping to success/errors value(s) in a JSON response body", + "type": "object", + "propertyNames": { + "enum": ["success", "errors"] + }, + "required": ["success"], + "properties": { + "success": { + "$id": "#/capabilities/feature-store/feature-store-request/parser/success", + "title": "Success pointer", + "type": "string" + }, + "errors": { + "$id": "#/capabilities/feature-store/feature-store-request/parser/errors", + "title": "Errors pointer", + "type": "string" + } + } } } From b14715a04a2dc154df82ca395aac98d6c2e397b5 Mon Sep 17 00:00:00 2001 From: Mahek Chheda Date: Tue, 14 Dec 2021 12:44:57 -0500 Subject: [PATCH 475/936] Initial integration for ld2git. --- .../ld-to-git/assets/images/square.svg | 1 + integrations/ld-to-git/manifest.json | 48 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 integrations/ld-to-git/assets/images/square.svg create mode 100644 integrations/ld-to-git/manifest.json diff --git a/integrations/ld-to-git/assets/images/square.svg b/integrations/ld-to-git/assets/images/square.svg new file mode 100644 index 00000000..d519b566 --- /dev/null +++ b/integrations/ld-to-git/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json new file mode 100644 index 00000000..be4cb2b6 --- /dev/null +++ b/integrations/ld-to-git/manifest.json @@ -0,0 +1,48 @@ +{ + "name": "LD to Git", + "version": "1.0.0", + "overview": "Send LaunchDarkly flag changes to Git.", + "description": "This integration sends LaunchDarkly audit log events to git repository", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://launchdarkly.atlassian.net/wiki/spaces/ENG/pages/1993211935/Marry+git+to+your+flags+planning", + "launchdarklyDocs": "https://launchdarkly.atlassian.net/wiki/spaces/ENG/pages/1993211935/Marry+git+to+your+flags+planning", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "formVariables": [ + { + "key": "url", + "name": "Git repo URL", + "description": "Enter the URL for your target repository", + "type": "uri", + "isSecret": false, + "placeholder": "https://github.com/launchdarkly", + "isOptional": false + }, + { + "key": "token", + "name": "Authentication token", + "description": "Enter the [base64 _credentials_ based on your API Key]", + "type": "string", + "isSecret": true, + "isOptional": false, + "placeholder": "https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token" + }, + { + "key": "branch", + "name": "branch", + "description": "Enter the branch name where you want to commit flags", + "type": "string", + "isSecret": false, + "isOptional": false, + "placeholder": "master" + } + ], + "otherCapabilities": ["dataExport"] +} From 41526c26416c860528ac44913e964924586cf5d1 Mon Sep 17 00:00:00 2001 From: Mahek Chheda Date: Tue, 14 Dec 2021 16:42:54 -0500 Subject: [PATCH 476/936] add template for webhook event. --- integrations/ld-to-git/manifest.json | 53 ++++++++++++++++--- .../ld-to-git/templates/template.json.hbs | 8 +++ 2 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 integrations/ld-to-git/templates/template.json.hbs diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json index be4cb2b6..1a1cdc46 100644 --- a/integrations/ld-to-git/manifest.json +++ b/integrations/ld-to-git/manifest.json @@ -26,13 +26,13 @@ "isOptional": false }, { - "key": "token", + "key": "apiToken", "name": "Authentication token", "description": "Enter the [base64 _credentials_ based on your API Key]", "type": "string", "isSecret": true, - "isOptional": false, - "placeholder": "https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token" + "isOptional": true, + "defaultValue": "https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token" }, { "key": "branch", @@ -40,9 +40,50 @@ "description": "Enter the branch name where you want to commit flags", "type": "string", "isSecret": false, - "isOptional": false, - "placeholder": "master" + "isOptional": false + }, + { + "key": "user", + "name": "user", + "description": "Enter the user name for making Git operations", + "type": "string", + "isSecret": false, + "isOptional": true, + "defaultValue": "user" + }, + { + "key": "secret", + "name": "secret", + "description": "Enter the secret for making Git operations", + "type": "string", + "isSecret": true, + "isOptional": true, + "defaultValue": "password" } ], - "otherCapabilities": ["dataExport"] + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "https://cobg36dyj6.execute-api.us-east-1.amazonaws.com/", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "default": "templates/template.json.hbs", + "validation": "templates/template.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/*:flag/*"], + "actions": ["*"] + } + ] + } + } } diff --git a/integrations/ld-to-git/templates/template.json.hbs b/integrations/ld-to-git/templates/template.json.hbs new file mode 100644 index 00000000..f862dda3 --- /dev/null +++ b/integrations/ld-to-git/templates/template.json.hbs @@ -0,0 +1,8 @@ +{ + "repoURL": "{{formVariables.url}}", + "auditLogLink": "{{{_links.self.href}}}", + "apiToken": "{{formVariables.apiToken}}", + "branch": "{{formVariables.branch}}", + "user": "{{formVariables.user}}", + "secret": "{{formVariables.secret}}" +} From c50785c2dcde996de131df3cada59db68b5c75d7 Mon Sep 17 00:00:00 2001 From: Mahek Chheda Date: Wed, 15 Dec 2021 09:29:07 -0500 Subject: [PATCH 477/936] Review comments. --- integrations/ld-to-git/manifest.json | 21 +++++++++++++------ .../ld-to-git/templates/template.json.hbs | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json index 1a1cdc46..dfb36493 100644 --- a/integrations/ld-to-git/manifest.json +++ b/integrations/ld-to-git/manifest.json @@ -17,7 +17,16 @@ }, "formVariables": [ { - "key": "url", + "key": "lambdaEndpoint", + "name": "Endpoint for updater lambda", + "description": "Updater Lambda endpoint where audit log would be forwarded", + "type": "uri", + "isSecret": false, + "placeholder": "https://cobg36dyj6.execute-api.us-east-1.amazonaws.com/", + "isOptional": false + }, + { + "key": "repoUrl", "name": "Git repo URL", "description": "Enter the URL for your target repository", "type": "uri", @@ -28,11 +37,11 @@ { "key": "apiToken", "name": "Authentication token", - "description": "Enter the [base64 _credentials_ based on your API Key]", + "description": "Enter the API token. For more information https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token", "type": "string", "isSecret": true, "isOptional": true, - "defaultValue": "https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token" + "defaultValue": "" }, { "key": "branch", @@ -49,7 +58,7 @@ "type": "string", "isSecret": false, "isOptional": true, - "defaultValue": "user" + "defaultValue": "" }, { "key": "secret", @@ -58,13 +67,13 @@ "type": "string", "isSecret": true, "isOptional": true, - "defaultValue": "password" + "defaultValue": "" } ], "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "https://cobg36dyj6.execute-api.us-east-1.amazonaws.com/", + "url": "{{lambdaEndpoint}}", "method": "POST", "headers": [ { diff --git a/integrations/ld-to-git/templates/template.json.hbs b/integrations/ld-to-git/templates/template.json.hbs index f862dda3..e6fc8f4e 100644 --- a/integrations/ld-to-git/templates/template.json.hbs +++ b/integrations/ld-to-git/templates/template.json.hbs @@ -1,5 +1,5 @@ { - "repoURL": "{{formVariables.url}}", + "repoURL": "{{formVariables.repoUrl}}", "auditLogLink": "{{{_links.self.href}}}", "apiToken": "{{formVariables.apiToken}}", "branch": "{{formVariables.branch}}", From 7f10b2fdfce06fb2746e5e370cd846e7f47e03d1 Mon Sep 17 00:00:00 2001 From: Mahek Chheda Date: Wed, 15 Dec 2021 12:05:46 -0500 Subject: [PATCH 478/936] adding general integration docs. --- integrations/ld-to-git/manifest.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json index dfb36493..bd1582d1 100644 --- a/integrations/ld-to-git/manifest.json +++ b/integrations/ld-to-git/manifest.json @@ -2,12 +2,11 @@ "name": "LD to Git", "version": "1.0.0", "overview": "Send LaunchDarkly flag changes to Git.", - "description": "This integration sends LaunchDarkly audit log events to git repository", + "description": "This integration sends LaunchDarkly audit log events to a git repository", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://launchdarkly.atlassian.net/wiki/spaces/ENG/pages/1993211935/Marry+git+to+your+flags+planning", - "launchdarklyDocs": "https://launchdarkly.atlassian.net/wiki/spaces/ENG/pages/1993211935/Marry+git+to+your+flags+planning", + "site": "https://docs.launchdarkly.com/integrations", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], From 308926fe8c663035473f0e87a2c1f989f357dd59 Mon Sep 17 00:00:00 2001 From: Mahek Chheda Date: Wed, 15 Dec 2021 12:57:32 -0500 Subject: [PATCH 479/936] scoping out secret/token based on value set. --- integrations/ld-to-git/templates/template.json.hbs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/integrations/ld-to-git/templates/template.json.hbs b/integrations/ld-to-git/templates/template.json.hbs index e6fc8f4e..9a0728fb 100644 --- a/integrations/ld-to-git/templates/template.json.hbs +++ b/integrations/ld-to-git/templates/template.json.hbs @@ -1,8 +1,11 @@ { "repoURL": "{{formVariables.repoUrl}}", "auditLogLink": "{{{_links.self.href}}}", + {{#if formVariables.apiToken}} "apiToken": "{{formVariables.apiToken}}", - "branch": "{{formVariables.branch}}", + {{else}} "user": "{{formVariables.user}}", - "secret": "{{formVariables.secret}}" + "secret": "{{formVariables.secret}}", + {{/if}} + "branch": "{{formVariables.branch}}" } From de4413a059bfc3bc1dc9414563c9de48ad4b0b96 Mon Sep 17 00:00:00 2001 From: Mahek Chheda Date: Wed, 15 Dec 2021 18:33:55 -0500 Subject: [PATCH 480/936] expose ld api token. --- integrations/ld-to-git/manifest.json | 16 ++++++++++++---- .../ld-to-git/templates/template.json.hbs | 7 ++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json index bd1582d1..2587289c 100644 --- a/integrations/ld-to-git/manifest.json +++ b/integrations/ld-to-git/manifest.json @@ -24,6 +24,14 @@ "placeholder": "https://cobg36dyj6.execute-api.us-east-1.amazonaws.com/", "isOptional": false }, + { + "key": "ldApiToken", + "name": "LaunchDarkly API token", + "description": "API token used for accessing LaunchDarkly API. Instructions for generating a [LaunchDarkly API token](https://docs.launchdarkly.com/home/account-security/api-access-tokens)", + "type": "string", + "isSecret": true, + "isOptional": false + }, { "key": "repoUrl", "name": "Git repo URL", @@ -34,9 +42,9 @@ "isOptional": false }, { - "key": "apiToken", + "key": "gitApiToken", "name": "Authentication token", - "description": "Enter the API token. For more information https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token", + "description": "Enter the API token. For example, a [Github API Token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)", "type": "string", "isSecret": true, "isOptional": true, @@ -53,7 +61,7 @@ { "key": "user", "name": "user", - "description": "Enter the user name for making Git operations", + "description": "Enter the user name for making Git operations. This is required if not using git api token", "type": "string", "isSecret": false, "isOptional": true, @@ -62,7 +70,7 @@ { "key": "secret", "name": "secret", - "description": "Enter the secret for making Git operations", + "description": "Enter the secret for making Git operations. This is required if not using git api token", "type": "string", "isSecret": true, "isOptional": true, diff --git a/integrations/ld-to-git/templates/template.json.hbs b/integrations/ld-to-git/templates/template.json.hbs index 9a0728fb..a3cd12a7 100644 --- a/integrations/ld-to-git/templates/template.json.hbs +++ b/integrations/ld-to-git/templates/template.json.hbs @@ -1,11 +1,12 @@ { "repoURL": "{{formVariables.repoUrl}}", "auditLogLink": "{{{_links.self.href}}}", - {{#if formVariables.apiToken}} - "apiToken": "{{formVariables.apiToken}}", + {{#if formVariables.gitApiToken}} + "gitApiToken": "{{formVariables.gitApiToken}}", {{else}} "user": "{{formVariables.user}}", "secret": "{{formVariables.secret}}", {{/if}} - "branch": "{{formVariables.branch}}" + "branch": "{{formVariables.branch}}", + "ldApiToken": "{{formVariables.ldApiToken}}" } From d99c5d1606a1edd9e4aa20f079e211c6cfd844ef Mon Sep 17 00:00:00 2001 From: Mahek Chheda Date: Wed, 15 Dec 2021 19:07:28 -0500 Subject: [PATCH 481/936] cleanup. --- integrations/ld-to-git/manifest.json | 31 ++++++++++++++++------------ 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json index 2587289c..dd3db2c1 100644 --- a/integrations/ld-to-git/manifest.json +++ b/integrations/ld-to-git/manifest.json @@ -17,25 +17,24 @@ "formVariables": [ { "key": "lambdaEndpoint", - "name": "Endpoint for updater lambda", + "name": "API gateway endpoint for processing audit log.", "description": "Updater Lambda endpoint where audit log would be forwarded", "type": "uri", "isSecret": false, - "placeholder": "https://cobg36dyj6.execute-api.us-east-1.amazonaws.com/", "isOptional": false }, { "key": "ldApiToken", "name": "LaunchDarkly API token", - "description": "API token used for accessing LaunchDarkly API. Instructions for generating a [LaunchDarkly API token](https://docs.launchdarkly.com/home/account-security/api-access-tokens)", + "description": "Enter the API token generated from LaunchDarkly. Instructions for generating a [LaunchDarkly API token](https://docs.launchdarkly.com/home/account-security/api-access-tokens)", "type": "string", "isSecret": true, "isOptional": false }, { "key": "repoUrl", - "name": "Git repo URL", - "description": "Enter the URL for your target repository", + "name": "Git repository URL", + "description": "Enter the URL for your target repository.", "type": "uri", "isSecret": false, "placeholder": "https://github.com/launchdarkly", @@ -44,7 +43,7 @@ { "key": "gitApiToken", "name": "Authentication token", - "description": "Enter the API token. For example, a [Github API Token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)", + "description": "Enter the API token with access to git repository. For example, instructions for generating a [Github API Token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)", "type": "string", "isSecret": true, "isOptional": true, @@ -52,16 +51,17 @@ }, { "key": "branch", - "name": "branch", - "description": "Enter the branch name where you want to commit flags", + "name": "Git branch name", + "description": "Enter the branch name for sending LaunchDarkly resources.", "type": "string", "isSecret": false, - "isOptional": false + "isOptional": false, + "placeholder": "master" }, { "key": "user", - "name": "user", - "description": "Enter the user name for making Git operations. This is required if not using git api token", + "name": "Username", + "description": "Enter the user name for accessing git repository. This is required if not using git api token", "type": "string", "isSecret": false, "isOptional": true, @@ -69,8 +69,8 @@ }, { "key": "secret", - "name": "secret", - "description": "Enter the secret for making Git operations. This is required if not using git api token", + "name": "Secret", + "description": "Enter the secret for accessing git repository. This is required if not using git api token", "type": "string", "isSecret": true, "isOptional": true, @@ -98,6 +98,11 @@ "effect": "allow", "resources": ["proj/*:env/*:flag/*"], "actions": ["*"] + }, + { + "effect": "allow", + "resources": ["integration/*"], + "actions": ["*"] } ] } From 79bd44e336172152375768d693688c000cd41e21 Mon Sep 17 00:00:00 2001 From: Mahek Chheda <86633378+mchheda-ld@users.noreply.github.com> Date: Thu, 16 Dec 2021 06:45:57 -0800 Subject: [PATCH 482/936] Fix description. Co-authored-by: Isabelle Miller --- integrations/ld-to-git/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json index dd3db2c1..48475917 100644 --- a/integrations/ld-to-git/manifest.json +++ b/integrations/ld-to-git/manifest.json @@ -61,7 +61,7 @@ { "key": "user", "name": "Username", - "description": "Enter the user name for accessing git repository. This is required if not using git api token", + "description": "Enter the user name for accessing your git repository. This is required if not using an API token", "type": "string", "isSecret": false, "isOptional": true, From 9bc1274126a22c606284b2cb0173f2466e350f3c Mon Sep 17 00:00:00 2001 From: Mahek Chheda <86633378+mchheda-ld@users.noreply.github.com> Date: Thu, 16 Dec 2021 06:46:22 -0800 Subject: [PATCH 483/936] Fix secret description. Co-authored-by: Isabelle Miller --- integrations/ld-to-git/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json index 48475917..da12297d 100644 --- a/integrations/ld-to-git/manifest.json +++ b/integrations/ld-to-git/manifest.json @@ -70,7 +70,7 @@ { "key": "secret", "name": "Secret", - "description": "Enter the secret for accessing git repository. This is required if not using git api token", + "description": "Enter the secret for accessing your git repository. This is required if not using an API token", "type": "string", "isSecret": true, "isOptional": true, From 295c173e5123a3b4aefc732155f772b457b884db Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 16 Dec 2021 15:49:02 +0100 Subject: [PATCH 484/936] Update integrations/ld-to-git/manifest.json --- integrations/ld-to-git/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json index da12297d..7564c97a 100644 --- a/integrations/ld-to-git/manifest.json +++ b/integrations/ld-to-git/manifest.json @@ -26,7 +26,7 @@ { "key": "ldApiToken", "name": "LaunchDarkly API token", - "description": "Enter the API token generated from LaunchDarkly. Instructions for generating a [LaunchDarkly API token](https://docs.launchdarkly.com/home/account-security/api-access-tokens)", + "description": "Enter the API token generated from LaunchDarkly. Instructions for generating a LaunchDarkly API token can be found [here](https://docs.launchdarkly.com/home/account-security/api-access-tokens)", "type": "string", "isSecret": true, "isOptional": false From bb1e33d02fbb38ce2f6c9e3a9d48b42a7f65de99 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 16 Dec 2021 15:49:07 +0100 Subject: [PATCH 485/936] Update integrations/ld-to-git/manifest.json --- integrations/ld-to-git/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json index 7564c97a..7a84866b 100644 --- a/integrations/ld-to-git/manifest.json +++ b/integrations/ld-to-git/manifest.json @@ -43,7 +43,7 @@ { "key": "gitApiToken", "name": "Authentication token", - "description": "Enter the API token with access to git repository. For example, instructions for generating a [Github API Token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)", + "description": "Enter the API token with access to git repository. For example, instructions for generating a Github API Token can be found [here](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)", "type": "string", "isSecret": true, "isOptional": true, From 2f017372d49d785e4bb2ed3599730578cf7cadd3 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 16 Dec 2021 14:47:02 -0600 Subject: [PATCH 486/936] Escaping some flag link templates --- integrations/jira/manifest.json | 6 +++--- integrations/slack-app/manifest.json | 10 +++++----- manifest.schema.d.ts | 2 +- manifest.schema.json | 3 +-- schemas/capabilities/flagLink.json | 3 +-- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index d822e13f..5665c157 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -54,19 +54,19 @@ }, "uiBlocks": { "image": { - "sourceUrl": "{{metadata.iconUrl}}", + "sourceUrl": "{{{metadata.iconUrl}}}", "isIcon": true }, "title": { "linkToReference": true, "elements": [ - { "text": "{{metadata.issueKey}}: {{metadata.issueTitle}}" } + { "text": "{{{metadata.issueKey}}}: {{{metadata.issueTitle}}}" } ] }, "context": { "elements": [ { "text": "Created by" }, - { "text": "{{metadata.creator}}", "isBold": true }, + { "text": "{{{metadata.creator}}}", "isBold": true }, { "text": "on" }, { "text": "{{timestamp.milliseconds}}", diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index a5481f36..d690a8ec 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -68,22 +68,22 @@ }, "uiBlocks": { "image": { - "sourceUrl": "{{metadata.avatar}}", + "sourceUrl": "{{{metadata.avatar}}}", "isAvatar": true }, - "name": "{{metadata.displayName}}", - "description": "{{metadata.conversation}}", + "name": "{{{metadata.displayName}}}", + "description": "{{{metadata.conversation}}}", "context": { "elements": [ { "text": "Posted in" }, - { "text": "#{{metadata.channelName}}", "isBold": true }, + { "text": "#{{{metadata.channelName}}}", "isBold": true }, { "text": "on" }, { "text": "{{timestamp.milliseconds}}", "isTimestamp": true, "isBold": true }, - { "text": "View message", "url": "{{metadata.messagePermalink}}" } + { "text": "View message", "url": "{{{metadata.messagePermalink}}}" } ] } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 78abf5b6..96286fdc 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -422,7 +422,7 @@ export type Name3 = string; /** * The data type of the information this metadata block will display */ -export type Type1 = "avatar" | "codeSnippet" | "hyperlink" | "string" | "multilineText" | "timestamp"; +export type Type1 = "avatar" | "codeSnippet" | "hyperlink" | "string" | "multilineText"; /** * The JSON path corresponding to where the information can be found in the incoming payload */ diff --git a/manifest.schema.json b/manifest.schema.json index 4cdcdf70..07a7ebcd 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -3041,8 +3041,7 @@ "codeSnippet", "hyperlink", "string", - "multilineText", - "timestamp" + "multilineText" ], "description": "The data type of the information this metadata block will display" }, diff --git a/schemas/capabilities/flagLink.json b/schemas/capabilities/flagLink.json index a1a7f9c4..44a1db55 100644 --- a/schemas/capabilities/flagLink.json +++ b/schemas/capabilities/flagLink.json @@ -79,8 +79,7 @@ "codeSnippet", "hyperlink", "string", - "multilineText", - "timestamp" + "multilineText" ], "description": "The data type of the information this metadata block will display" }, From c12d373787ffd9a0e165bfa8a4df99d04c161dde Mon Sep 17 00:00:00 2001 From: Christie Williams Date: Mon, 20 Dec 2021 15:20:18 -0500 Subject: [PATCH 487/936] Fix Cloudflare manifest JSON pointers --- integrations/cloudflare/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/cloudflare/manifest.json b/integrations/cloudflare/manifest.json index 76d83526..86069fbd 100644 --- a/integrations/cloudflare/manifest.json +++ b/integrations/cloudflare/manifest.json @@ -55,7 +55,7 @@ ] }, "parser": { - "success": "success" + "success": "/success" } }, "featureStoreRequest": { @@ -74,8 +74,8 @@ ] }, "parser": { - "success": "success", - "errors": "errors" + "success": "/success", + "errors": "/errors" } } } From ef3eeb05e5409265c788f892494cf0fba247dac9 Mon Sep 17 00:00:00 2001 From: carmenquan Date: Tue, 21 Dec 2021 15:11:01 -0800 Subject: [PATCH 488/936] [sc-129419] First draft documentation for feature store capability (#313) * first draft feature store capability * removing ... * Update docs/capabilities.md Co-authored-by: Jaz White * swap sections * Apply suggestions from code review Co-authored-by: Molly * PR feedback * sample to example * Apply suggestions from code review Co-authored-by: Molly * Apply suggestions from code review Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Jaz White Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> --- docs/capabilities.md | 122 ++++++++++++++++++++++++++----------------- docs/endpoint.md | 64 +++++++++++++++++++++++ 2 files changed, 139 insertions(+), 47 deletions(-) create mode 100644 docs/endpoint.md diff --git a/docs/capabilities.md b/docs/capabilities.md index caa370d1..0c00fef6 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -2,11 +2,12 @@ Your integration's `capabilities` describe how it interacts with LaunchDarkly. -We support three capabilities: +We support four capabilities: - [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`) - [Trigger](#trigger-trigger) (`trigger`) - [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) +- [Feature store](#feature-store-featurestore) (`featureStore`) ## Audit log events hook (`auditLogEventsHook`) @@ -63,49 +64,7 @@ events in a LaunchDarkly account: ### Endpoint -Every `auditLogEventsHook` capability must specify the endpoint to which LaunchDarkly should send webhook data. This specification must include all appropriate request semantics including the URL, method, and headers. - -In the example -above, a few of the properties (`endpoint.url` and -`endpoint.headers[].value`) accept template variables. These template -variables can reference any `formVariables` you've defined in your manifest. -The templating language we use is based off of a subset of the -Handlebars syntax. - -To learn more, read [Handlebars' documentation](https://handlebarsjs.com/). - -There are a few properties that allow you to substitute template variables at -runtime. The main ones are the `endpoint.url` and the -`endpoint.headers[].value`. This lets you configure a dynamic endpoint -based on the `formVariables` your integration collects from the user. Examples follow. - -This example uses the `endpointUrl` form variable as the URL of the endpoint and the `apiToken` as a `Bearer` token in the `Authorization` header: - -```json - "endpoint": { - "url": "{{endpointUrl}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, -``` - -This example uses the `apiToken` formVariable as a query parameter on the URL: - -```json - "endpoint": { - "url": "https://example.com/apiToken?={{apiToken}}", - "method": "POST" - }, -``` +Every `auditLogEventsHook` capability must specify the [endpoint](endpoint.md) to which LaunchDarkly should send webhook data. ### Templates @@ -270,7 +229,7 @@ Alternatively, to produce a sample `curl` command, run `npm run curl INTEGRATION ## Trigger (`trigger`) -**At the time of this writing, LaunchDarkly's trigger functionality is only available to customers opted in to an early access program. Email [partnerships@launchdarkly.com](mailto:partnerships@launchdarkly.com) to request access.** +**LaunchDarkly's trigger functionality is only available to customers who have opted in to an Early Access Program (EAP). To access to this feature, [join the EAP](https://launchdarkly.com/eap).** The trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. @@ -282,7 +241,7 @@ If the integration offers the option to send test events / webhook requests, the If your webhooks' request bodies are non-empty, you can specify the optional `parser` object with one or more of `eventName`, `value`, and `url`. The provided values will flow through LaunchDarkly into the resulting audit log messages when your service invokes a trigger in LaunchDarkly. -Here is a sample `trigger` capability including all optional properties: +Here is an example `trigger` capability including all optional properties: ```json "trigger": { @@ -312,7 +271,7 @@ Reserved custom properties are simple to define. Their only requirements are a ` After your integration is configured by a user, the custom property starts appearing in the dropdown on the flag's Settings page. -Here is a sample `reservedCustomProperties` capability: +Here is an example `reservedCustomProperties` capability: ```json "reservedCustomProperties": [ @@ -323,3 +282,72 @@ Here is a sample `reservedCustomProperties` capability: } ], ``` + +## Feature store (`featureStore`) + +**LaunchDarkly's feature store functionality is only available to customers who have opted in to an Early Access Program (EAP). To access to this feature, [join the EAP](https://launchdarkly.com/eap).** + +The feature store capability allows you to specify an endpoint that can receive a payload containing up-to-date flag data from LaunchDarkly. + +In addition to [`formVariables`](form-variables.md), the `featureStore` has two properties, a required `featureStoreRequest` and an optional `validationRequest`. You can define both using an [`endpoint`](endpoint.md) and a `parser`. + +The `parser` object allows LaunchDarkly to interpret the response of the request. It allows a mapping of success and errors for the given response body of the request in the form of a [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901). The `parser` object has two properties, a required `success` and an optional `error`. + +```json + "parser": { + "success": "/success", + "error": "/error" + }, +``` + +### `featureStoreRequest` + +This specifies the request that LaunchDarkly makes when flag data are updated. + +In addition to the form variables defined in your manifest, you can use the special variable `_featureStoreKey`. `_featureStoreKey` is provided by LaunchDarkly, and is unique per environment. + +### `validationRequest` (Optional) + +Specifying a validation request allows customers to verify that they have properly filled out the details to correctly make a request. + +Choose an endpoint that will indicate by its response that the specified form variables are correct, but which has no side effects. + +Here is an example `featureStore` capability: + +```json + "featureStoreRequest": { + "endpoint": { + "url": "https://example.com/{{accountId}}/dictionary/{{dictId}}/item/{{_featureStoreKey}}", + "method": "PUT", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + }, + { + "name": "Content-Type", + "value": "text/plain" + } + ] + }, + "parser": { + "success": "/success", + "errors": "/errors" + } + }, + "validationRequest": { + "endpoint": { + "url": "https://example.com/{{accountId}}/dictionary/{{dictId}}/items", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, + "parser": { + "success": "/success" + } + } +``` diff --git a/docs/endpoint.md b/docs/endpoint.md new file mode 100644 index 00000000..917805bd --- /dev/null +++ b/docs/endpoint.md @@ -0,0 +1,64 @@ +# Endpoint + +Some capabilities require specifying an endpoint that LaunchDarkly can make requests to. For example, an endpoint could be specified as follows: + +```json + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, +``` + +This specification must include all appropriate request semantics including the URL, method, and headers. + +In the example +above, the properties `endpoint.url` and +`endpoint.headers[].value` accept template variables. These template +variables can reference any [`formVariables`](form-variables.md) you've defined in your manifest. +The templating language LaunchDarkly uses is based off of a subset of the +Handlebars syntax. + +To learn more, read the [Handlebars documentation](https://handlebarsjs.com/). + +There are a few properties that allow you to substitute template variables at +runtime. The main ones are the `endpoint.url` and the +`endpoint.headers[].value`. This lets you configure a dynamic endpoint +based on the `formVariables` your integration collects from the user. + +This example uses the `endpointUrl` form variable as the URL of the endpoint and the `apiToken` as a `Bearer` token in the `Authorization` header: + +```json + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, +``` + +This example uses the `apiToken` form variable as a query parameter on the URL: + +```json + "endpoint": { + "url": "https://example.com/apiToken?={{apiToken}}", + "method": "POST" + }, +``` From 881ff9d8754f0b7a0420983c8caf583a0e993144 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 23 Dec 2021 15:38:01 +0000 Subject: [PATCH 489/936] Add 5 minute offset to end date in servicenow creation request (#317) --- integrations/servicenow/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 056f9f99..870508ab 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -66,7 +66,7 @@ } ] }, - "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{timestamp.simple}}\"}", + "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\"}", "parser": { "approvalId": "/result/sys_id/value", "statusValue": "/result/state/value", From da9e1b64720fe06def09d25012d54325928f4a46 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 11 Jan 2022 12:52:07 -0600 Subject: [PATCH 490/936] Updated empty state text --- integrations/jira/manifest.json | 4 ++-- integrations/slack-app/manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 5665c157..38130823 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -21,8 +21,8 @@ "flagLink": { "header": "JIRA issues", "emptyState": { - "title": "There are no JIRA issues that link to this flag.", - "leadText": "JIRA tickets connected to this feature flag will automatically appear here. To connect a ticket to a feature flag [read our documentation](https://docs.launchdarkly.com/integrations/jira)" + "title": "There are no Jira issues that link to this flag.", + "leadText": "Jira issues connected to this feature flag will automatically appear here. To learn how to enable the Jira integration or to connect an issue to a feature flag, [read our documentation](https://docs.launchdarkly.com/integrations/jira)" }, "connector": { "metadata": [ diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index d690a8ec..753e902f 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -24,7 +24,7 @@ "header": "Slack conversations", "emptyState": { "title": "There are no Slack conversations that reference this flag.", - "leadText": "Slack conversations that are associated with this feature flag will automatically appear here. To learn more about how to associate a slack conversation with a feature flag [read our documentation](https://docs.launchdarkly.com/integrations/slack)" + "leadText": "Slack conversations connected to this feature flag will automatically appear here. To learn how to enable the Slack integration or to connect a slack conversation to a feature flag, [read our documentation](https://docs.launchdarkly.com/integrations/slack)" }, "connector": { "metadata": [ From ef48da1f6ed83becedebb2860b45ad08d30dbd17 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 18 Jan 2022 22:35:17 +0000 Subject: [PATCH 491/936] Add all 6 Datadog sites to Datadog manifest (#319) --- integrations/datadog/manifest.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index bba27fa6..8ad2f498 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -26,11 +26,14 @@ { "key": "hostURL", "name": "Datadog host URL", - "description": "Your Datadog host URL. The default host URL is [https://api.datadoghq.com](https://api.datadoghq.com). Use [https://api.datadoghq.eu](https://api.datadoghq.eu) if you are on the Datadog EU site.", + "description": "Your Datadog host URL. Read [How do I tell which Datadog site I am on?](https://docs.datadoghq.com/getting_started/site/#how-do-i-tell-which-datadog-site-i-am-on) if you are unsure which host URL to select.", "type": "enum", "allowedValues": [ "https://api.datadoghq.com", - "https://api.datadoghq.eu" + "https://api.datadoghq.eu", + "https://us3.datadoghq.com", + "https://us5.datadoghq.com", + "https://app.ddog-gov.com" ], "isOptional": true, "defaultValue": "https://api.datadoghq.com" From 087d0d8a4b3bc9a21d4c855f07d8355adf8afeb5 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 18 Jan 2022 18:07:04 -0600 Subject: [PATCH 492/936] Updated flag link metadata schema to be an object instead of an array --- integrations/jira/manifest.json | 40 +++++--------- integrations/slack-app/manifest.json | 64 ++++++++------------- manifest.schema.d.ts | 42 ++++---------- manifest.schema.json | 83 +++++++++------------------- schemas/capabilities/flagLink.json | 69 ++++++----------------- 5 files changed, 90 insertions(+), 208 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 5665c157..60bfcd5f 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -24,33 +24,19 @@ "title": "There are no JIRA issues that link to this flag.", "leadText": "JIRA tickets connected to this feature flag will automatically appear here. To connect a ticket to a feature flag [read our documentation](https://docs.launchdarkly.com/integrations/jira)" }, - "connector": { - "metadata": [ - { - "key": "creator", - "path": "/creator/name", - "name": "Creator", - "type": "string" - }, - { - "key": "iconUrl", - "path": "/issue/iconUrl", - "name": "Issue Icon URL", - "type": "string" - }, - { - "key": "issueKey", - "path": "/issue/key", - "name": "Issue Key", - "type": "string" - }, - { - "key": "issueTitle", - "path": "/issue/title", - "name": "Title", - "type": "string" - } - ] + "metadata": { + "creator": { + "type": "string" + }, + "iconUrl": { + "type": "uri" + }, + "issueKey": { + "type": "string" + }, + "issueTitle": { + "type": "string" + } }, "uiBlocks": { "image": { diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index d690a8ec..76b6694f 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -26,53 +26,33 @@ "title": "There are no Slack conversations that reference this flag.", "leadText": "Slack conversations that are associated with this feature flag will automatically appear here. To learn more about how to associate a slack conversation with a feature flag [read our documentation](https://docs.launchdarkly.com/integrations/slack)" }, - "connector": { - "metadata": [ - { - "key": "avatar", - "name": "User Avatar", - "type": "avatar", - "path": "/user_profile/image_original" - }, - { - "key": "displayName", - "name": "Reference creator", - "type": "string", - "path": "/user_profile/display_name" - }, - { - "key": "timestamp", - "name": "Timestamp", - "type": "string", - "path": "/message_ts" - }, - { - "key": "messagePermalink", - "name": "Message Permalink", - "type": "hyperlink", - "path": "/message_permalink" - }, - { - "key": "channelName", - "name": "Channel Name", - "type": "string", - "path": "/channel_info/name" - }, - { - "key": "conversation", - "name": "Conversation", - "type": "string", - "path": "/message_text" - } - ] + "metadata": { + "avatarUrl": { + "type": "uri" + }, + "displayName": { + "type": "string" + }, + "timestamp": { + "type": "string" + }, + "permalink": { + "type": "uri" + }, + "channelName": { + "type": "string" + }, + "message": { + "type": "string" + } }, "uiBlocks": { "image": { - "sourceUrl": "{{{metadata.avatar}}}", + "sourceUrl": "{{{metadata.avatarUrl}}}", "isAvatar": true }, "name": "{{{metadata.displayName}}}", - "description": "{{{metadata.conversation}}}", + "description": "{{{metadata.message}}}", "context": { "elements": [ { "text": "Posted in" }, @@ -83,7 +63,7 @@ "isTimestamp": true, "isBold": true }, - { "text": "View message", "url": "{{{metadata.messagePermalink}}}" } + { "text": "View message", "url": "{{{metadata.permalink}}}" } ] } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 96286fdc..ad688d26 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -412,31 +412,9 @@ export type Title = string; */ export type LeadText = string; /** - * The unique key corresponding to the property to be displayed + * Data type for the metadata attribute */ -export type Key2 = string; -/** - * The display name of the property - */ -export type Name3 = string; -/** - * The data type of the information this metadata block will display - */ -export type Type1 = "avatar" | "codeSnippet" | "hyperlink" | "string" | "multilineText"; -/** - * The JSON path corresponding to where the information can be found in the incoming payload - */ -export type Path = string; -/** - * List of metadata blocks corresponding to information on the LaunchDarkly links tab - */ -export type FlagLinkMetadata = { - key?: Key2; - name?: Name3; - type?: Type1; - path?: Path; - [k: string]: unknown; -}[]; +export type Type1 = "string" | "uri"; /** * Url of the image */ @@ -452,7 +430,7 @@ export type IsAvatar = boolean; /** * Template string used to render a visual block in LaunchDarkly UI to display a name */ -export type Name4 = string; +export type Name3 = string; /** * Text to be displayed for the element. The text can contain template variables */ @@ -772,7 +750,7 @@ export interface FeatureStoreRequest { export interface FlagLink { header: LinkGroupHeader; emptyState: EmptyState; - connector?: FlagLinkConnector; + metadata?: FlagLinkMetadata; uiBlocks: UIBlocks; [k: string]: unknown; } @@ -785,18 +763,20 @@ export interface EmptyState { [k: string]: unknown; } /** - * Receiver configuration for inbound flag links + * Key/value pairs describing attributes for the flag link's payload metadata property. The key is the name of the metadata field and the value is the configuration object for the field. */ -export interface FlagLinkConnector { - metadata?: FlagLinkMetadata; - [k: string]: unknown; +export interface FlagLinkMetadata { + [k: string]: { + type: Type1; + [k: string]: unknown; + }; } /** * UI blocks are visual components that represents a section of the view layout for a flag link displayed in LaunchDarkly */ export interface UIBlocks { image?: Image; - name?: Name4; + name?: Name3; title?: Title1; description?: Description3; context?: FlagLinkContext; diff --git a/manifest.schema.json b/manifest.schema.json index 07a7ebcd..a0b53f8e 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2952,10 +2952,10 @@ "type": "object", "propertyNames": { "enum": [ - "connector", "uiBlocks", "emptyState", - "header" + "header", + "metadata" ] }, "required": [ @@ -2996,62 +2996,31 @@ } } }, - "connector": { - "$id": "#/properties/capability/flag-link/connector", - "title": "flagLink Connector", - "description": "Receiver configuration for inbound flag links", + "metadata": { + "$id": "#/properties/capability/flag-link/metadata", + "title": "FlagLink Metadata", + "description": "Key/value pairs describing attributes for the flag link's payload metadata property. The key is the name of the metadata field and the value is the configuration object for the field.", "type": "object", - "properties": { - "metadata": { - "$id": "#/properties/capability/flag-link/connector/metadata", - "title": "flagLink Metadata", - "description": "List of metadata blocks corresponding to information on the LaunchDarkly links tab", - "type": "array", - "items": { - "type": "object", - "propertyNames": { - "enum": [ - "key", - "name", - "type", - "path" - ] - }, - "properties": { - "key": { - "$id": "#/properties/capability/flag-link/connector/ui-blocks/key", - "title": "Key", - "type": "string", - "description": "The unique key corresponding to the property to be displayed", - "maxLength": 50 - }, - "name": { - "$id": "#/properties/capability/flag-link/connector/ui-blocks/name", - "title": "Name", - "type": "string", - "description": "The display name of the property", - "maxLength": 50 - }, - "type": { - "$id": "#/properties/capability/flag-link/connector/ui-blocks/type", - "title": "Type", - "type": "string", - "enum": [ - "avatar", - "codeSnippet", - "hyperlink", - "string", - "multilineText" - ], - "description": "The data type of the information this metadata block will display" - }, - "path": { - "$id": "#/properties/capability/flag-link/connector/ui-blocks/path", - "title": "Path", - "type": "string", - "description": "The JSON path corresponding to where the information can be found in the incoming payload" - } - } + "additionalProperties": { + "type": "object", + "propertyNames": { + "enum": [ + "type" + ] + }, + "required": [ + "type" + ], + "properties": { + "type": { + "$id": "#/properties/capability/flag-link/metadata/type", + "title": "Type", + "type": "string", + "description": "Data type for the metadata attribute", + "enum": [ + "string", + "uri" + ] } } } diff --git a/schemas/capabilities/flagLink.json b/schemas/capabilities/flagLink.json index 44a1db55..f954447f 100644 --- a/schemas/capabilities/flagLink.json +++ b/schemas/capabilities/flagLink.json @@ -6,7 +6,7 @@ "description": "This capability is used to manage inbound flag links", "type": "object", "propertyNames": { - "enum": ["connector", "uiBlocks", "emptyState", "header"] + "enum": ["uiBlocks", "emptyState", "header", "metadata"] }, "required": ["uiBlocks", "header", "emptyState"], "properties": { @@ -39,57 +39,24 @@ } } }, - "connector": { - "$id": "#/properties/capability/flag-link/connector", - "title": "flagLink Connector", - "description": "Receiver configuration for inbound flag links", + "metadata": { + "$id": "#/properties/capability/flag-link/metadata", + "title": "FlagLink Metadata", + "description": "Key/value pairs describing attributes for the flag link's payload metadata property. The key is the name of the metadata field and the value is the configuration object for the field.", "type": "object", - "properties": { - "metadata": { - "$id": "#/properties/capability/flag-link/connector/metadata", - "title": "flagLink Metadata", - "description": "List of metadata blocks corresponding to information on the LaunchDarkly links tab", - "type": "array", - "items": { - "type": "object", - "propertyNames": { - "enum": ["key", "name", "type", "path"] - }, - "properties": { - "key": { - "$id": "#/properties/capability/flag-link/connector/ui-blocks/key", - "title": "Key", - "type": "string", - "description": "The unique key corresponding to the property to be displayed", - "maxLength": 50 - }, - "name": { - "$id": "#/properties/capability/flag-link/connector/ui-blocks/name", - "title": "Name", - "type": "string", - "description": "The display name of the property", - "maxLength": 50 - }, - "type": { - "$id": "#/properties/capability/flag-link/connector/ui-blocks/type", - "title": "Type", - "type": "string", - "enum": [ - "avatar", - "codeSnippet", - "hyperlink", - "string", - "multilineText" - ], - "description": "The data type of the information this metadata block will display" - }, - "path": { - "$id": "#/properties/capability/flag-link/connector/ui-blocks/path", - "title": "Path", - "type": "string", - "description": "The JSON path corresponding to where the information can be found in the incoming payload" - } - } + "additionalProperties": { + "type": "object", + "propertyNames": { + "enum": ["type"] + }, + "required": ["type"], + "properties": { + "type": { + "$id": "#/properties/capability/flag-link/metadata/type", + "title": "Type", + "type": "string", + "description": "Data type for the metadata attribute", + "enum": ["string", "uri"] } } } From 36b8a93c05e1ea605bf720fd685675c7b36c77f3 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 19 Jan 2022 17:45:34 -0600 Subject: [PATCH 493/936] Removed unused flag link metadata property for slack app --- integrations/slack-app/manifest.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index 76b6694f..037fff2f 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -33,9 +33,6 @@ "displayName": { "type": "string" }, - "timestamp": { - "type": "string" - }, "permalink": { "type": "uri" }, From 07619b001cfdc0c0a68865b39137c19d5a09181c Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 20 Jan 2022 10:56:57 -0600 Subject: [PATCH 494/936] Replace slack manifest's flag link permalink metadata attribute with deeplink since they are both the same --- integrations/slack-app/manifest.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index 037fff2f..7146843c 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -33,9 +33,6 @@ "displayName": { "type": "string" }, - "permalink": { - "type": "uri" - }, "channelName": { "type": "string" }, @@ -60,7 +57,7 @@ "isTimestamp": true, "isBold": true }, - { "text": "View message", "url": "{{{metadata.permalink}}}" } + { "text": "View message", "url": "{{{deepLink}}}" } ] } } From 1fa04b72cb102090239a75210dac403db9478fb3 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 26 Jan 2022 10:16:16 -0600 Subject: [PATCH 495/936] Updated URLs for flag links docs --- integrations/jira/manifest.json | 2 +- integrations/slack-app/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index ecff96ea..d377f134 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -22,7 +22,7 @@ "header": "JIRA issues", "emptyState": { "title": "There are no Jira issues that link to this flag.", - "leadText": "Jira issues connected to this feature flag will automatically appear here. To learn how to enable the Jira integration or to connect an issue to a feature flag, [read our documentation](https://docs.launchdarkly.com/integrations/jira)" + "leadText": "Jira issues connected to this feature flag will automatically appear here. To learn how to enable the Jira integration or to connect an issue to a feature flag, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-jira-flag-links)" }, "metadata": { "creator": { diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index 9508cdfd..506be397 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -24,7 +24,7 @@ "header": "Slack conversations", "emptyState": { "title": "There are no Slack conversations that reference this flag.", - "leadText": "Slack conversations connected to this feature flag will automatically appear here. To learn how to enable the Slack integration or to connect a slack conversation to a feature flag, [read our documentation](https://docs.launchdarkly.com/integrations/slack)" + "leadText": "Slack conversations connected to this feature flag will automatically appear here. To learn how to enable the Slack integration or to connect a slack conversation to a feature flag, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-slack-flag-links)" }, "metadata": { "avatarUrl": { From 70656632a724b9481328885cb08cfba0454a431d Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 26 Jan 2022 18:34:47 -0600 Subject: [PATCH 496/936] Updated Jira header text match Atlassian's branding --- integrations/jira/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index d377f134..8005b39b 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -19,7 +19,7 @@ "otherCapabilities": ["external"], "capabilities": { "flagLink": { - "header": "JIRA issues", + "header": "Jira issues", "emptyState": { "title": "There are no Jira issues that link to this flag.", "leadText": "Jira issues connected to this feature flag will automatically appear here. To learn how to enable the Jira integration or to connect an issue to a feature flag, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-jira-flag-links)" From c355ad356f28e214be12f9629ce433a538008bdc Mon Sep 17 00:00:00 2001 From: Jaz White Date: Fri, 28 Jan 2022 15:08:31 -0500 Subject: [PATCH 497/936] [sc-137630] remove parser for delivery request (#323) * [sc-137630] remove parser for delivery request * [sc-138928] add generic feature store integration manifest for testing (#324) Co-authored-by: Henry Barrow Co-authored-by: Carmen Quan Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> --- docs/capabilities.md | 26 ++++---- integrations/cloudflare/manifest.json | 4 -- .../assets/horizontal.svg | 4 ++ .../generic-feature-store/assets/square.svg | 4 ++ .../generic-feature-store/manifest.json | 59 +++++++++++++++++++ manifest.schema.d.ts | 5 +- manifest.schema.json | 41 ++----------- schemas/capabilities/featureStore.json | 9 +-- schemas/capabilities/parser/parser.json | 10 ++-- 9 files changed, 94 insertions(+), 68 deletions(-) create mode 100644 integrations/generic-feature-store/assets/horizontal.svg create mode 100644 integrations/generic-feature-store/assets/square.svg create mode 100644 integrations/generic-feature-store/manifest.json diff --git a/docs/capabilities.md b/docs/capabilities.md index 0c00fef6..79ac9b81 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -289,20 +289,11 @@ Here is an example `reservedCustomProperties` capability: The feature store capability allows you to specify an endpoint that can receive a payload containing up-to-date flag data from LaunchDarkly. -In addition to [`formVariables`](form-variables.md), the `featureStore` has two properties, a required `featureStoreRequest` and an optional `validationRequest`. You can define both using an [`endpoint`](endpoint.md) and a `parser`. - -The `parser` object allows LaunchDarkly to interpret the response of the request. It allows a mapping of success and errors for the given response body of the request in the form of a [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901). The `parser` object has two properties, a required `success` and an optional `error`. - -```json - "parser": { - "success": "/success", - "error": "/error" - }, -``` +In addition to [`formVariables`](form-variables.md), the `featureStore` has two properties, a required `featureStoreRequest` and an optional `validationRequest`. ### `featureStoreRequest` -This specifies the request that LaunchDarkly makes when flag data are updated. +This specifies the request [`endpoint`](endpoint.md) that LaunchDarkly makes when flag data are updated. You can do this using an [`endpoint`](endpoint.md) and a `parser`. In addition to the form variables defined in your manifest, you can use the special variable `_featureStoreKey`. `_featureStoreKey` is provided by LaunchDarkly, and is unique per environment. @@ -310,6 +301,15 @@ In addition to the form variables defined in your manifest, you can use the spec Specifying a validation request allows customers to verify that they have properly filled out the details to correctly make a request. +The `parser` object allows LaunchDarkly to interpret the response of the validation request. It allows a mapping of success and errors for the given response body of the request in the form of a [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901). The `parser` object has two properties: a required `success` and an optional `error`. + +```json + "parser": { + "success": "/success", + "error": "/error" + }, +``` + Choose an endpoint that will indicate by its response that the specified form variables are correct, but which has no side effects. Here is an example `featureStore` capability: @@ -329,10 +329,6 @@ Here is an example `featureStore` capability: "value": "text/plain" } ] - }, - "parser": { - "success": "/success", - "errors": "/errors" } }, "validationRequest": { diff --git a/integrations/cloudflare/manifest.json b/integrations/cloudflare/manifest.json index 86069fbd..c7776f47 100644 --- a/integrations/cloudflare/manifest.json +++ b/integrations/cloudflare/manifest.json @@ -72,10 +72,6 @@ "value": "text/plain" } ] - }, - "parser": { - "success": "/success", - "errors": "/errors" } } } diff --git a/integrations/generic-feature-store/assets/horizontal.svg b/integrations/generic-feature-store/assets/horizontal.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/generic-feature-store/assets/horizontal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/generic-feature-store/assets/square.svg b/integrations/generic-feature-store/assets/square.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/generic-feature-store/assets/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/generic-feature-store/manifest.json b/integrations/generic-feature-store/manifest.json new file mode 100644 index 00000000..114c3b92 --- /dev/null +++ b/integrations/generic-feature-store/manifest.json @@ -0,0 +1,59 @@ +{ + "name": "Generic Feature Store", + "version": "1.0.0", + "overview": "Send feature store data to an endpoint - used for testing.", + "description": "Send feature store data to an endpoint - used for testing.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://docs.launchdarkly.com", + "privacyPolicy": "https://docs.launchdarkly.com" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "featureStore": { + "formVariables": [ + { + "key": "validationReqUrl", + "name": "Validation request url", + "description": "A URL for validation", + "type": "uri", + "isSecret": false + }, + { + "key": "featureStoreReqUrl", + "name": "Feature store request url", + "description": "A URL for feature store data", + "type": "uri", + "isSecret": false + } + ], + "validationRequest": { + "endpoint": { + "url": "{{validationReqUrl}}", + "method": "GET", + "headers": [] + }, + "parser": { + "success": "/success" + } + }, + "featureStoreRequest": { + "endpoint": { + "url": "{{featureStoreReqUrl}}?_featureStoreKey={{_featureStoreKey}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "text/plain" + } + ] + } + } + } + } +} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index ad688d26..b103d6c3 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -725,13 +725,13 @@ export interface FeatureStore { */ export interface ValidationRequest { endpoint: Endpoint; - parser: FeatureStoreRequestParser; + parser: FeatureStoreValidationParser; [k: string]: unknown; } /** * Mapping to success/errors value(s) in a JSON response body */ -export interface FeatureStoreRequestParser { +export interface FeatureStoreValidationParser { success: SuccessPointer; errors?: ErrorsPointer; [k: string]: unknown; @@ -741,7 +741,6 @@ export interface FeatureStoreRequestParser { */ export interface FeatureStoreRequest { endpoint: Endpoint; - parser: FeatureStoreRequestParser; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index a0b53f8e..c47cc88d 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2777,8 +2777,8 @@ ] }, "parser": { - "$id": "#/feature-store-request-parser", - "title": "Feature store request parser", + "$id": "#/feature-store-validation-parser", + "title": "Feature store validation parser", "description": "Mapping to success/errors value(s) in a JSON response body", "type": "object", "propertyNames": { @@ -2792,12 +2792,12 @@ ], "properties": { "success": { - "$id": "#/capabilities/feature-store/feature-store-request/parser/success", + "$id": "#/capabilities/feature-store/feature-store-validation/parser/success", "title": "Success pointer", "type": "string" }, "errors": { - "$id": "#/capabilities/feature-store/feature-store-request/parser/errors", + "$id": "#/capabilities/feature-store/feature-store-validation/parser/errors", "title": "Errors pointer", "type": "string" } @@ -2812,13 +2812,11 @@ "type": "object", "propertyNames": { "enum": [ - "endpoint", - "parser" + "endpoint" ] }, "required": [ - "endpoint", - "parser" + "endpoint" ], "properties": { "endpoint": { @@ -2913,33 +2911,6 @@ "url", "method" ] - }, - "parser": { - "$id": "#/feature-store-request-parser", - "title": "Feature store request parser", - "description": "Mapping to success/errors value(s) in a JSON response body", - "type": "object", - "propertyNames": { - "enum": [ - "success", - "errors" - ] - }, - "required": [ - "success" - ], - "properties": { - "success": { - "$id": "#/capabilities/feature-store/feature-store-request/parser/success", - "title": "Success pointer", - "type": "string" - }, - "errors": { - "$id": "#/capabilities/feature-store/feature-store-request/parser/errors", - "title": "Errors pointer", - "type": "string" - } - } } } } diff --git a/schemas/capabilities/featureStore.json b/schemas/capabilities/featureStore.json index 65aac1d6..f0b18dfa 100644 --- a/schemas/capabilities/featureStore.json +++ b/schemas/capabilities/featureStore.json @@ -34,7 +34,7 @@ "$ref": "../definitions.json#/endpoint" }, "parser": { - "$ref": "./parser/parser.json#/featureStoreRequestParser" + "$ref": "./parser/parser.json#/featureStoreValidationParser" } } }, @@ -44,15 +44,12 @@ "description": "Details needed to make a request to deliver the flag payload to the feature store", "type": "object", "propertyNames": { - "enum": ["endpoint", "parser"] + "enum": ["endpoint"] }, - "required": ["endpoint", "parser"], + "required": ["endpoint"], "properties": { "endpoint": { "$ref": "../definitions.json#/endpoint" - }, - "parser": { - "$ref": "./parser/parser.json#/featureStoreRequestParser" } } } diff --git a/schemas/capabilities/parser/parser.json b/schemas/capabilities/parser/parser.json index 59f9b665..79203465 100644 --- a/schemas/capabilities/parser/parser.json +++ b/schemas/capabilities/parser/parser.json @@ -124,9 +124,9 @@ } } }, - "featureStoreRequestParser": { - "$id": "#/feature-store-request-parser", - "title": "Feature store request parser", + "featureStoreValidationParser": { + "$id": "#/feature-store-validation-parser", + "title": "Feature store validation parser", "description": "Mapping to success/errors value(s) in a JSON response body", "type": "object", "propertyNames": { @@ -135,12 +135,12 @@ "required": ["success"], "properties": { "success": { - "$id": "#/capabilities/feature-store/feature-store-request/parser/success", + "$id": "#/capabilities/feature-store/feature-store-validation/parser/success", "title": "Success pointer", "type": "string" }, "errors": { - "$id": "#/capabilities/feature-store/feature-store-request/parser/errors", + "$id": "#/capabilities/feature-store/feature-store-validation/parser/errors", "title": "Errors pointer", "type": "string" } From 97fd537486dcebd129450aaecf012d5ac524db59 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 1 Feb 2022 14:32:29 +0000 Subject: [PATCH 498/936] Increase servicenow-c0 end_date offset to 5 mins (#325) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 4aa96463..276b5cd0 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -79,7 +79,7 @@ } ] }, - "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 1 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 2 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", + "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 1 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From 1e67be1aaf37071f49c0349d888bcf25f771cccc Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 2 Feb 2022 17:22:06 +0000 Subject: [PATCH 499/936] Increase servicenow-c0 start_date from 1s to 5s (#326) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 276b5cd0..120b9d94 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -79,7 +79,7 @@ } ] }, - "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 1 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", + "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From 2871ea81f06f1aaeb44a0b2059b8e0dbab1643fc Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 8 Feb 2022 20:09:52 -0600 Subject: [PATCH 500/936] Renaming references to master to be main --- .circleci/config.yml | 4 ++-- .github/pull_request_template.md | 2 +- docs/getting-started.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 47fa67d2..cb7ac3c5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -61,10 +61,10 @@ workflows: context: org-global filters: branches: - only: master + only: main - send-webhook: requires: - upload-to-s3 filters: branches: - only: master + only: main diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a2877019..eaa70695 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,6 +1,6 @@ **Requirements** -- [ ] I have followed the repository's [pull request submission guidelines](../blob/master/README.md#submitting-pull-requests) +- [ ] I have followed the repository's [pull request submission guidelines](../blob/main/README.md#submitting-pull-requests) - [ ] I have updated my user documentation - [ ] I have updated my developer documentation (my integration README) diff --git a/docs/getting-started.md b/docs/getting-started.md index f2749693..898c92ac 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -79,7 +79,7 @@ In addition to user documentation, you must to provide guidance on how to mainta ## Step 8: Submit your integration After you've built your integration, [submit a pull request against this -repo](https://github.com/launchdarkly/integration-framework/pull/new/master). +repo](https://github.com/launchdarkly/integration-framework/pull/new/main). When you do, your branch will run through some automated validations and be reviewed by our team. If we're ready to publish your integration, we'll get your permission and make it live on our site. From 740dc81fd26f988ce5ea669651fc0674bcebf0c8 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 8 Feb 2022 20:19:40 -0600 Subject: [PATCH 501/936] Rename master to main in bash script --- scripts/merge_to_public.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/merge_to_public.sh b/scripts/merge_to_public.sh index 36c1b9df..b63596c1 100755 --- a/scripts/merge_to_public.sh +++ b/scripts/merge_to_public.sh @@ -1,7 +1,7 @@ #!/bin/bash # # This script merges forward from the private mirror to the public one, -# one master branch to the other while squashing commits. +# one main branch to the other while squashing commits. # # Usage: ./merge_to_public.sh # @@ -19,11 +19,11 @@ mkdir -p temp git clone git@github.com:launchdarkly/integration-framework.git temp/repo cd temp/repo git remote add private git@github.com:launchdarkly/integration-framework-private.git -git checkout master +git checkout main git fetch private -git merge private/master --squash --strategy-option=theirs +git merge private/main --squash --strategy-option=theirs git commit -a -m "${COMMIT_MSG}" # Merge conflicts will need to be resolved manually -git push origin master +git push origin main cd ../.. rm -rf temp From 8562190d60801d0ca27fb41d9414367c89887eed Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 18 Feb 2022 09:24:44 -0600 Subject: [PATCH 502/936] Added Dynatrace cloud automation manifest for trigerring flag change events in LaunchDarkly from their cloud sequence --- .../dynatrace-cloud-automation/LICENSE.md | 13 +++++++++ .../dynatrace-cloud-automation/README.md | 1 + .../assets/horizontal.svg | 17 +++++++++++ .../assets/square.svg | 8 +++++ .../dynatrace-cloud-automation/manifest.json | 29 +++++++++++++++++++ 5 files changed, 68 insertions(+) create mode 100644 integrations/dynatrace-cloud-automation/LICENSE.md create mode 100644 integrations/dynatrace-cloud-automation/README.md create mode 100644 integrations/dynatrace-cloud-automation/assets/horizontal.svg create mode 100644 integrations/dynatrace-cloud-automation/assets/square.svg create mode 100644 integrations/dynatrace-cloud-automation/manifest.json diff --git a/integrations/dynatrace-cloud-automation/LICENSE.md b/integrations/dynatrace-cloud-automation/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/dynatrace-cloud-automation/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/dynatrace-cloud-automation/README.md b/integrations/dynatrace-cloud-automation/README.md new file mode 100644 index 00000000..70ebfa2d --- /dev/null +++ b/integrations/dynatrace-cloud-automation/README.md @@ -0,0 +1 @@ +# Dynatrace Cloud Automation diff --git a/integrations/dynatrace-cloud-automation/assets/horizontal.svg b/integrations/dynatrace-cloud-automation/assets/horizontal.svg new file mode 100644 index 00000000..f36df202 --- /dev/null +++ b/integrations/dynatrace-cloud-automation/assets/horizontal.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/integrations/dynatrace-cloud-automation/assets/square.svg b/integrations/dynatrace-cloud-automation/assets/square.svg new file mode 100644 index 00000000..2bacc0b7 --- /dev/null +++ b/integrations/dynatrace-cloud-automation/assets/square.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/integrations/dynatrace-cloud-automation/manifest.json b/integrations/dynatrace-cloud-automation/manifest.json new file mode 100644 index 00000000..4c062ad9 --- /dev/null +++ b/integrations/dynatrace-cloud-automation/manifest.json @@ -0,0 +1,29 @@ +{ + "name": "Dynatrace Cloud Automation", + "version": "1.0.0", + "overview": "Trigger LaunchDarkly flag changes using Dynatrace Cloud Automation sequence.", + "description": "Automatically trigger LaunchDarkly flag change events from your Dynatrace Cloud Automation sequence", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.dynatrace.com/platform/cloud-automation/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/dynatrace-cloud-automation", + "privacyPolicy": "https://www.dynatrace.com/company/trust-center/privacy/" + }, + "categories": ["automation", "developer-tools"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "trigger": { + "documentation": "https://docs.launchdarkly.com/integrations/dynatrace/triggers#connecting-a-launchdarkly-trigger-to-dynatrace-cloud-automation", + "defaultEventName": "An event", + "parser": { + "eventName": "/eventName", + "value": "/value", + "url": "/url" + } + } + } +} From 74cf188ecbf361b9e8aa9519a99413506403b664 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 2 Mar 2022 20:37:15 -0600 Subject: [PATCH 503/936] Updated the flag links capaibility verbiage to match the new design verbiage --- integrations/jira/manifest.json | 6 +++--- integrations/slack-app/manifest.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 8005b39b..72144563 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -19,10 +19,10 @@ "otherCapabilities": ["external"], "capabilities": { "flagLink": { - "header": "Jira issues", + "header": "Jira issue", "emptyState": { - "title": "There are no Jira issues that link to this flag.", - "leadText": "Jira issues connected to this feature flag will automatically appear here. To learn how to enable the Jira integration or to connect an issue to a feature flag, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-jira-flag-links)" + "title": "No Jira issues link to this flag.", + "leadText": "To enable the Jira integration, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-jira-flag-links)" }, "metadata": { "creator": { diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index 506be397..0b9370c2 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -21,10 +21,10 @@ "otherCapabilities": ["webhooks"], "capabilities": { "flagLink": { - "header": "Slack conversations", + "header": "Slack conversation", "emptyState": { - "title": "There are no Slack conversations that reference this flag.", - "leadText": "Slack conversations connected to this feature flag will automatically appear here. To learn how to enable the Slack integration or to connect a slack conversation to a feature flag, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-slack-flag-links)" + "title": "No Slack conversations link to this flag.", + "leadText": "To enable the Slack integration, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-slack-flag-links)" }, "metadata": { "avatarUrl": { From db543444f3652f223525f739f91ee99b61287ee4 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 2 Mar 2022 20:46:42 -0600 Subject: [PATCH 504/936] Small text change --- integrations/jira/manifest.json | 2 +- integrations/slack-app/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 72144563..ab0175e4 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -22,7 +22,7 @@ "header": "Jira issue", "emptyState": { "title": "No Jira issues link to this flag.", - "leadText": "To enable the Jira integration, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-jira-flag-links)" + "leadText": "To enable the Jira integration, [read the documentation](https://docs.launchdarkly.com/home/flags/links#creating-jira-flag-links)" }, "metadata": { "creator": { diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index 0b9370c2..cc9deead 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -24,7 +24,7 @@ "header": "Slack conversation", "emptyState": { "title": "No Slack conversations link to this flag.", - "leadText": "To enable the Slack integration, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-slack-flag-links)" + "leadText": "To enable the Slack integration, [read the documentation](https://docs.launchdarkly.com/home/flags/links#creating-slack-flag-links)" }, "metadata": { "avatarUrl": { From cda8d3f07f69730ee1174134ed0e61982c57f7b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Mar 2022 19:51:19 +0000 Subject: [PATCH 505/936] Bump url-parse from 1.5.3 to 1.5.9 (#332) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.9. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.9) --- updated-dependencies: - dependency-name: url-parse dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a222bd35..4a40a2bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "dateformat": "^4.5.1", - "url-parse": "^1.5.3" + "url-parse": "^1.5.9" }, "devDependencies": { "@apidevtools/json-schema-ref-parser": "^8.0.0", @@ -5973,9 +5973,9 @@ "dev": true }, "node_modules/url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.9.tgz", + "integrity": "sha512-HpOvhKBvre8wYez+QhHcYiVvVmeF6DVnuSOOPhe3cTum3BnqHhvKaZm8FU5yTiOu/Jut2ZpB2rA/SbBA1JIGlQ==", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -11038,9 +11038,9 @@ "dev": true }, "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.9.tgz", + "integrity": "sha512-HpOvhKBvre8wYez+QhHcYiVvVmeF6DVnuSOOPhe3cTum3BnqHhvKaZm8FU5yTiOu/Jut2ZpB2rA/SbBA1JIGlQ==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" diff --git a/package.json b/package.json index ec4a01bc..444c8ffc 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,6 @@ }, "dependencies": { "dateformat": "^4.5.1", - "url-parse": "^1.5.3" + "url-parse": "^1.5.9" } } From c25ff97a361b78c453036637d1c7b0386cf2accc Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 7 Mar 2022 09:34:51 -0600 Subject: [PATCH 506/936] Removing date/time elements from the flag links ui blocks since these are no longer needed in the new design --- integrations/jira/manifest.json | 8 +------- integrations/slack-app/manifest.json | 6 ------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index ab0175e4..803e2906 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -52,13 +52,7 @@ "context": { "elements": [ { "text": "Created by" }, - { "text": "{{{metadata.creator}}}", "isBold": true }, - { "text": "on" }, - { - "text": "{{timestamp.milliseconds}}", - "isTimestamp": true, - "isBold": true - } + { "text": "{{{metadata.creator}}}", "isBold": true } ] } } diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index cc9deead..80556632 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -51,12 +51,6 @@ "elements": [ { "text": "Posted in" }, { "text": "#{{{metadata.channelName}}}", "isBold": true }, - { "text": "on" }, - { - "text": "{{timestamp.milliseconds}}", - "isTimestamp": true, - "isBold": true - }, { "text": "View message", "url": "{{{deepLink}}}" } ] } From e071ec39de5b129e9cfca1a9014ee60389d9194f Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Thu, 10 Mar 2022 08:20:45 -0500 Subject: [PATCH 507/936] request issue if user is not service owner --- docs/getting-started.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/getting-started.md b/docs/getting-started.md index 898c92ac..a0945cbc 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -10,6 +10,8 @@ The easiest way to do this is to use [`curl`](https://curl.haxx.se/docs/manpage. When you execute your sample commands, observe the request semantics. This helps streamline your manifest and template definitions. +If you are looking to integrate with a third-party service that you are not directly associated with, please open a [Feature Request](https://github.com/launchdarkly/integration-framework/issues/new/choose) describing your goal and expectations for the integration before submitting any Pull Request. + ## Step 1: Fork this repository Fork this repository to your own GitHub account. From 5431def416fc32edddb65403fbd5f86f7465dde2 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 10 Mar 2022 10:13:35 -0600 Subject: [PATCH 508/936] Updated context text for jira --- integrations/jira/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 803e2906..4d77b22d 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -51,7 +51,7 @@ }, "context": { "elements": [ - { "text": "Created by" }, + { "text": "Issue created by" }, { "text": "{{{metadata.creator}}}", "isBold": true } ] } From e19fa543c4e093752d9874df8b1d7ffb03318301 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 11 Mar 2022 14:51:36 +0000 Subject: [PATCH 509/936] Remove unnecessary line breaks (#336) * Remove unnecessary line breaks * Trim trailing whitespace * Remove flag link stub --- README.md | 4 +-- docs/capabilities.md | 39 +++++++----------------- docs/endpoint.md | 11 ++----- docs/form-variables.md | 15 +++------ docs/getting-started.md | 23 +++++--------- docs/manifest.md | 67 ++++++++++------------------------------- 6 files changed, 43 insertions(+), 116 deletions(-) diff --git a/README.md b/README.md index d29c19af..5c3f1c6e 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,7 @@ Feature flags give you control over your deployment and rollout, but that's not all they do. They also provide context to other related systems, giving your team visibility into how your services react due to flag changes. -This repository contains -LaunchDarkly integrations built by our community. Most of these integrations -consume events from LaunchDarkly to provide their users with more context. +This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly to provide their users with more context. LaunchDarkly's integration framework lets you build one-way integrations from LaunchDarkly to a third party service. We support a small subset of actions that let you subscribe to LaunchDarkly events to trigger an action or event in your service. You can think of this capability as a webhook, with the added convenience of not having to write your own service to manage the integration. LaunchDarkly manages the configuration, authentication, and transformation of our events to what your service expects without having to create an intermediary service. diff --git a/docs/capabilities.md b/docs/capabilities.md index 79ac9b81..11c129ba 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -11,10 +11,7 @@ We support four capabilities: ## Audit log events hook (`auditLogEventsHook`) -An audit log events hook is a webhook that LaunchDarkly sends whenever an -event happens inside of LaunchDarkly. Each of these events -result in an event being published to LaunchDarkly's audit log. -You can use this capability to send data to or trigger an event in another service. +An audit log events hook is a webhook that LaunchDarkly sends whenever an event happens inside of LaunchDarkly. Each of these events result in an event being published to LaunchDarkly's audit log. You can use this capability to send data to or trigger an event in another service. The `auditLogEventsHook` has three properties: @@ -27,8 +24,7 @@ The `auditLogEventsHook` has three properties: policies](https://docs.launchdarkly.com/home/members/role-policies) that act as a filter determining which events to send to your webhook endpoint. -Here's an example of an audit log events hook capability that subscribes to flag -events in a LaunchDarkly account: +Here's an example of an audit log events hook capability that subscribes to flag events in a LaunchDarkly account: ```json "capabilities": { @@ -68,9 +64,7 @@ Every `auditLogEventsHook` capability must specify the [endpoint](endpoint.md) t ### Templates -Before the `auditLogEventsHook` capability sends the request to the endpoint -handling your webhook, you can transform the body of the request -sent to your handler. +Before the `auditLogEventsHook` capability sends the request to the endpoint handling your webhook, you can transform the body of the request sent to your handler. In your manifest, you can specify templates to be executed when webhook events are of kinds `flag`, `project`, and `environment`. Additionally, you can specify a `default` template as a catch-all for any event without a more specific template. A `validation` template is also provided in case you want to provide users with the ability to validate their connection by sending a test event from LaunchDarkly to your service. @@ -84,8 +78,7 @@ In your manifest, you can specify templates to be executed when webhook events a }, ``` -If you don't provide one or more templates, LaunchDarkly -sends you a default JSON payload that looks like this: +If you don't provide one or more templates, LaunchDarkly sends you a default JSON payload that looks like this: ```json { @@ -146,21 +139,13 @@ sends you a default JSON payload that looks like this: } ``` -If you choose to provide one or more -`templates`, -LaunchDarkly renders your template using the context data above. Your -template can be any text based format, but you must specify the appropriate -`Content-Type` header in your `endpoint.headers` property to match the content -type of your template body. +If you choose to provide one or more `templates`, LaunchDarkly renders your template using the context data above. Your template can be any text based format, but you must specify the appropriate `Content-Type` header in your `endpoint.headers` property to match the content type of your template body. -We use a basic subset of the Handlebars template syntax to render -your template. +We use a basic subset of the Handlebars template syntax to render your template. -To learn more about Handlebars' sysntax, read [Handlebars' Language -Guide](https://handlebarsjs.com/guide/). +To learn more about Handlebars' sysntax, read [Handlebars' Language Guide](https://handlebarsjs.com/guide/). -In addition to the basic language syntax, we support the following [built-in -helpers](https://handlebarsjs.com/guide/builtin-helpers.html): +In addition to the basic language syntax, we support the following [built-in helpers](https://handlebarsjs.com/guide/builtin-helpers.html): - `if` - `unless` @@ -183,13 +168,11 @@ The following timestamp formats are supported: - `rfc3339` - [RFC3339 format](https://datatracker.ietf.org/doc/html/rfc3339), e.g., `2020-02-04T01:02:14Z` - `simple` - timestamp string formatted as `yyyy-mm-dd h:MM:ss`, e.g., `2020-02-04 01:03:59` -To test your templates, you can run `npm run preview $INTEGRATION_NAME` or use the [Handlebars -Sandbox](http://tryhandlebarsjs.com/). +To test your templates, you can run `npm run preview $INTEGRATION_NAME` or use the [Handlebars Sandbox](http://tryhandlebarsjs.com/). ### Default policy -When you configure your integration, customers can specify an array of [LaunchDarkly -policies](https://docs.launchdarkly.com/home/members/role-policies) filter which events to send to your webhook endpoint. +When you configure your integration, customers can specify an array of [LaunchDarkly policies](https://docs.launchdarkly.com/home/members/role-policies) filter which events to send to your webhook endpoint. To simplify onboarding your integration, you can specify a default policy which follows best practices for your integration's use case. @@ -207,7 +190,7 @@ Here is the policy: ] ``` -### Include error response body (`includeErrorResponseBody`) +### Include error response body (`includeErrorResponseBody`) For endpoints defined with static domains - where the domain part of the endpoint isn't a template variable (see example below), you have the option to specify an optional property `includeErrorResponseBody` in your `auditLogEventsHook` configuration to view any errors LaunchDarkly receives when it sends events to your endpoint. This is particularly useful for users troubleshooting issues with their integration. diff --git a/docs/endpoint.md b/docs/endpoint.md index 917805bd..9130b803 100644 --- a/docs/endpoint.md +++ b/docs/endpoint.md @@ -22,18 +22,11 @@ Some capabilities require specifying an endpoint that LaunchDarkly can make requ This specification must include all appropriate request semantics including the URL, method, and headers. In the example -above, the properties `endpoint.url` and -`endpoint.headers[].value` accept template variables. These template -variables can reference any [`formVariables`](form-variables.md) you've defined in your manifest. -The templating language LaunchDarkly uses is based off of a subset of the -Handlebars syntax. +above, the properties `endpoint.url` and `endpoint.headers[].value` accept template variables. These template variables can reference any [`formVariables`](form-variables.md) you've defined in your manifest. The templating language LaunchDarkly uses is based off of a subset of the Handlebars syntax. To learn more, read the [Handlebars documentation](https://handlebarsjs.com/). -There are a few properties that allow you to substitute template variables at -runtime. The main ones are the `endpoint.url` and the -`endpoint.headers[].value`. This lets you configure a dynamic endpoint -based on the `formVariables` your integration collects from the user. +There are a few properties that allow you to substitute template variables at runtime. The main ones are the `endpoint.url` and the `endpoint.headers[].value`. This lets you configure a dynamic endpoint based on the `formVariables` your integration collects from the user. This example uses the `endpointUrl` form variable as the URL of the endpoint and the `apiToken` as a `Bearer` token in the `Authorization` header: diff --git a/docs/form-variables.md b/docs/form-variables.md index ff5f152f..4fc85395 100644 --- a/docs/form-variables.md +++ b/docs/form-variables.md @@ -1,7 +1,6 @@ # Form variables -Most integrations need to collect one or more pieces of configuration data -that supports the integration, such as API tokens or webhook endpoints. +Most integrations need to collect one or more pieces of configuration data that supports the integration, such as API tokens or webhook endpoints. To support these configurations, describe a set of `formVariables` that define these configuration properties. @@ -27,18 +26,14 @@ Here's an example: ], ``` -The `formVariables` entry above displays as the following UI in the [LaunchDarkly Integrations -page](https://app.launchdarkly.com/default/integrations): +The `formVariables` entry above displays as the following UI in the [LaunchDarkly Integrations page](https://app.launchdarkly.com/default/integrations): -![Example configuration -form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) +![Example configuration form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) Form variables apply to the entire integration configuration. There are no capability-specific form variables. -The `formVariables[].description` will be used as a field label on the UI. You -can use simple markdown to link a word or phrase to an external URL. +The `formVariables[].description` will be used as a field label on the UI. You can use simple markdown to link a word or phrase to an external URL. -Accepted form variable types are `string`, `boolean`, `uri`, `enum`, and `dynamicEnum`. -Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. If you provide a `defaultValue`, you must also set `isOptional` to `true` and vice versa. +Accepted form variable types are `string`, `boolean`, `uri`, `enum`, and `dynamicEnum`. Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. If you provide a `defaultValue`, you must also set `isOptional` to `true` and vice versa. To learn more, read the [manifest schema](../manifest.schema.json). diff --git a/docs/getting-started.md b/docs/getting-started.md index a0945cbc..c73296eb 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -22,11 +22,9 @@ To learn more about submitting a pull request, read [Step 8: Submit your integra ## Step 2: Create a new directory inside `./integrations` -Create a new directory inside the [integrations](../integrations) directory. Name it -after your organization or give it the integration's name (For example, `your-company-name-dot-com`). +Create a new directory inside the [integrations](../integrations) directory. Name it after your organization or give it the integration's name (For example, `your-company-name-dot-com`). -The directory name must not have any spaces and must use -[kebab-casing](https://wiki.c2.com/?KebabCase). +The directory name must not have any spaces and must use [kebab-casing](https://wiki.c2.com/?KebabCase). Only change files and directories inside your new directory. Our validation process rejects any pull requests with modified content outside of your directory. @@ -40,8 +38,7 @@ To learn more, read [Integration manifest](manifest.md). ## Step 4: Collect integration configuration data from LaunchDarkly users -Most integrations need to collect one or more pieces of configuration data -that support the integration (for example, API tokens or webhook endpoints). +Most integrations need to collect one or more pieces of configuration data that support the integration (for example, API tokens or webhook endpoints). You can describe a set of `formVariables` that define these configuration properties. @@ -49,8 +46,7 @@ To learn more, read [Form variables](form-variables.md). ## Step 5: Define your integration's capabilities -The next step to define your LaunchDarkly integration is describing its -`capabilities`. Your integration's `capabilities` are how it interacts with LaunchDarkly. +The next step to define your LaunchDarkly integration is describing its `capabilities`. Your integration's `capabilities` are how it interacts with LaunchDarkly. To learn more, read [Capabilities](capabilities.md). @@ -61,10 +57,9 @@ To validate your integration: 1. Run `npm install` to install the validation dependencies. 2. Run `npm test` to run the validation suite. -**Note:** Please use Node.js v14 when running the above npm commands. +**Note:** Please use Node.js v16 when running the above npm commands. -Additionally, we -recommend you install [pre-commit hooks](https://pre-commit.com/#install) with `pre-commit install`. This will make the validation suite run before every commit, saving you time if you need to troubleshoot anything. +Additionally, we recommend you install [pre-commit hooks](https://pre-commit.com/#install) with `pre-commit install`. This will make the validation suite run before every commit, saving you time if you need to troubleshoot anything. Some of the capabilities have their own validation tools. To learn more, read [Capabilities](capabilities.md). @@ -80,10 +75,8 @@ In addition to user documentation, you must to provide guidance on how to mainta ## Step 8: Submit your integration -After you've built your integration, [submit a pull request against this -repo](https://github.com/launchdarkly/integration-framework/pull/new/main). +After you've built your integration, [submit a pull request against this repo](https://github.com/launchdarkly/integration-framework/pull/new/main). -When you do, your branch will run through some automated validations and be reviewed by -our team. If we're ready to publish your integration, we'll get your permission and make it live on our site. +When you do, your branch will run through some automated validations and be reviewed by our team. If we're ready to publish your integration, we'll get your permission and make it live on our site. We'll also work with you on submitting your user documentation to our [documentation site](https://github.com/launchdarkly/LaunchDarkly-Docs). diff --git a/docs/manifest.md b/docs/manifest.md index 51004ed2..d0ae16db 100644 --- a/docs/manifest.md +++ b/docs/manifest.md @@ -1,36 +1,24 @@ # Integration manifest -Each integration contains a manifest defining basic concepts about your -integration and organization. Manifests also instruct LaunchDarkly in how to -interact with your integration. +Each integration contains a manifest defining basic concepts about your integration and organization. Manifests also instruct LaunchDarkly in how to interact with your integration. -Defining your manifest is the single most important step in contributing your -integration to LaunchDarkly's platform. It's important to configure your -manifest correctly. +Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. It's important to configure your manifest correctly. ## Introduction -Create an empty `manifest.json` file inside your new directory. You will use the -`manifest.json` to describe your integration's details and capabilities. +Create an empty `manifest.json` file inside your new directory. You will use the `manifest.json` to describe your integration's details and capabilities. -The properties of LaunchDarkly's integration manifests are defined through a -[JSON schema](../manifest.schema.json). Many IDEs can provide you inline help -and validation while editing your manifest. You can register the JSON schema in -your IDE to enable this kind of help. +The properties of LaunchDarkly's integration manifests are defined through a [JSON schema](../manifest.schema.json). Many IDEs can provide you inline help and validation while editing your manifest. You can register the JSON schema in your IDE to enable this kind of help. -If you use [VSCode](https://code.visualstudio.com/), it detects the settings in -this repository and aplies the schema validation without any additional -configuration. +If you use [VSCode](https://code.visualstudio.com/), it detects the settings in this repository and applies the schema validation without any additional configuration. ![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) ## Getting started -The first part of the manifest describes your organization, contacts, URLs, and -a few items LaunchDarkly needs to list your integration properly. +The first part of the manifest describes your organization, contacts, URLs, and a few items LaunchDarkly needs to list your integration properly. -We use most of this information when we render your integration card and -configuration form in the LaunchDarkly UI. +We use most of this information when we render your integration card and configuration form in the LaunchDarkly UI. ```json { @@ -53,52 +41,29 @@ configuration form in the LaunchDarkly UI. } ``` -There are a few properties in the manifest that can accept simple -[markdown](https://daringfireball.net/projects/markdown/). One of them is the -`description`. +There are a few properties in the manifest that can accept simple [markdown](https://daringfireball.net/projects/markdown/). One of them is the `description`. -LaunchDarkly's UI converts markdown to HTML. To get the best results, only use -simple markdown, like links and basic text formatting. +LaunchDarkly's UI converts markdown to HTML. To get the best results, only use simple markdown, like links and basic text formatting. -Notice that the `icons` described above are in SVG format. This is intentional. -We do not accept other image formats. +Notice that the `icons` described above are in SVG format. This is intentional. We do not accept other image formats. -We use your organization's or integration's logo in the LaunchDarkly UI and a -public facing integrations listing on -[launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG -files allow your logo to scale nicely on different devices. To make sure your -logo appears correctly everywhere we use it, make sure that your SVG logos don't -have any padding around the image. +We use your organization's or integration's logo in the LaunchDarkly UI and a public facing integrations listing on [launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG files allow your logo to scale nicely on different devices. To make sure your logo appears correctly everywhere we use it, make sure that your SVG logos don't have any padding around the image. -Also, notice that the `icon.square` and `icon.horizontal` properties point to -relative paths. These paths are relative to your integration's directory. You -are free to create any directories and files that support your integration. +Also, notice that the `icon.square` and `icon.horizontal` properties point to relative paths. These paths are relative to your integration's directory. You are free to create any directories and files that support your integration. ## OAuth -Many integrations in LaunchDarkly today use API Tokens. However, if your API -requires OAuth for authentication, we can support that as well. Currently, we -support two types of OAuth: +Many integrations in LaunchDarkly today use API Tokens. However, if your API requires OAuth for authentication, we can support that as well. Currently, we support two types of OAuth: * [Authorization Code Flow](https://oauth.net/2/grant-types/authorization-code/) (aka, 3-legged OAuth) * [Client Credentials Flow](https://oauth.net/2/grant-types/client-credentials/) (aka, 2-legged OAuth) -With these flows, LaunchDarkly acts as the OAuth consumer. In order for this to -work, LaunchDarkly will need to store a consumer ID and secret. Please contact -us at to register your OAuth consumer details. -You'll also need to set the `requiresOAuth` root-level property in your manifest -to `true`. At runtime, LaunchDarkly will lookup your OAuth consumer ID and -secret from our registry based on your integration key. **Simply setting the -`requiresOAuth` property to `true` will not enable OAuth on your integration -- -you'll need to provide us with the OAuth consumer details first.** +With these flows, LaunchDarkly acts as the OAuth consumer. In order for this to work, LaunchDarkly will need to store a consumer ID and secret. Please contact us at to register your OAuth consumer details. You'll also need to set the `requiresOAuth` root-level property in your manifest to `true`. At runtime, LaunchDarkly will lookup your OAuth consumer ID and secret from our registry based on your integration key. **Simply setting the `requiresOAuth` property to `true` will not enable OAuth on your integration -- you'll need to provide us with the OAuth consumer details first.** ## Form variables and capabilities -Form variables and capabilities are the most important part of the manifest. -They define the primary interactions that LaunchDarkly and users will have with -your integration. +Form variables and capabilities are the most important part of the manifest. They define the primary interactions that LaunchDarkly and users will have with your integration. -Read more about [form variables](form-variables.md) and -[capabilities](capabilities.md). +Read more about [form variables](form-variables.md) and [capabilities](capabilities.md). From 9a4b7d1cddcda56743b9a3be70e5ee26bb510614 Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 11 Mar 2022 14:57:51 +0000 Subject: [PATCH 510/936] [sc-143291] Add a hide member details checkbox to datadog integration (#333) * add hideMemberDetails formVariable * dont send memberName tag if hideMemberDetails is true * build title from titleVerb and targetName for project and env templates * default template sends nothing for member events with hideMemberDetails, and filters memberDetails for other events if required * fix tag generation in project and env templates * update logic in default template, add equalWithElse helper --- helpers/index.js | 7 +++ integrations/datadog/manifest.json | 8 ++++ .../datadog/templates/default.json.hbs | 45 +++++++++++++++++-- .../datadog/templates/environment.json.hbs | 8 ++-- .../datadog/templates/project.json.hbs | 9 ++-- 5 files changed, 65 insertions(+), 12 deletions(-) diff --git a/helpers/index.js b/helpers/index.js index ccc740c3..7c9651f4 100644 --- a/helpers/index.js +++ b/helpers/index.js @@ -9,6 +9,13 @@ const registerHelpers = () => { } return options.inverse(this); }); + // We don't use this here - the rendering in goaltender is done with the GO implementation of handlebars, where we need to use a helper called equalWithElse, as equal is taken and doesn't support else + Handlebars.registerHelper('equalWithElse', function (v1, v2, options) { + if (v1 === v2) { + return options.fn(this); + } + return options.inverse(this); + }); Handlebars.registerHelper('pathEncode', function (v) { return encodeURI(v); }); diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 8ad2f498..80252db1 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -37,6 +37,14 @@ ], "isOptional": true, "defaultValue": "https://api.datadoghq.com" + }, + { + "key": "hideMemberDetails", + "name": "Hide member details", + "description": "Don't send related member email and names.", + "type": "boolean", + "defaultValue": false, + "isOptional": true } ], "capabilities": { diff --git a/integrations/datadog/templates/default.json.hbs b/integrations/datadog/templates/default.json.hbs index 61f63c80..37137c93 100644 --- a/integrations/datadog/templates/default.json.hbs +++ b/integrations/datadog/templates/default.json.hbs @@ -1,6 +1,9 @@ +{{#equalWithElse kind "member"}} +{{#if formVariables.hideMemberDetails}} +{{else}} { - "title": "{{{title.plainText}}}", - "text": "%%% \n {{{title.markdown}}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", + "title": {{#if formVariables.hideMemberDetails}}"A member {{{titleVerb}}} {{{target.name}}}"{{else}}"{{{title.plainText}}}"{{/if}}, + "text": "%%% \n {{#if formVariables.hideMemberDetails}}A member {{{titleVerb}}} [{{{target.name}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", "date_happened": {{timestamp.seconds}}, "tags": [ {{#if customProperties}} @@ -24,8 +27,42 @@ "{{kind}}_key:{{key}}", "{{kind}}_name:{{name}}", "action:{{verbKind}}", - "kind:{{kind}}", - "member:{{member.email}}" + {{#unless formVariables.hideMemberDetails }}"member:{{member.email}}",{{/unless}} + "kind:{{kind}}" ], "source_type_name": "launchdarkly" } +{{/if}} +{{else}} +{ + "title": {{#if formVariables.hideMemberDetails}}"A member {{{titleVerb}}} {{{target.name}}}"{{else}}"{{{title.plainText}}}"{{/if}}, + "text": "%%% \n {{#if formVariables.hideMemberDetails}}A member {{{titleVerb}}} [{{{target.name}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", + "date_happened": {{timestamp.seconds}}, + "tags": [ + {{#if customProperties}} + {{#if customProperties.datadog}} + {{#if customProperties.datadog.values}} + {{#with customProperties}} + {{#each datadog.values}} + "{{{this}}}", + {{/each}} + {{/with}} + {{/if}}{{/if}}{{/if}} + {{#each tags}} + "{{{this}}}", + {{/each}} + {{#if project.key}}"project_key:{{project.key}}", + "project_name:{{project.name}}", + {{#if project.environment.key}}"environment_key:{{project.environment.key}}", + "environment_name:{{project.environment.name}}", + {{!-- The following tag was added to provide backwards compatibility with the legacy integration. --}} + "{{project.environment.name}}",{{/if}}{{/if}} + "{{kind}}_key:{{key}}", + "{{kind}}_name:{{name}}", + "action:{{verbKind}}", + {{#unless formVariables.hideMemberDetails }}"member:{{member.email}}",{{/unless}} + "kind:{{kind}}" + ], + "source_type_name": "launchdarkly" +} +{{/equalWithElse}} diff --git a/integrations/datadog/templates/environment.json.hbs b/integrations/datadog/templates/environment.json.hbs index 00d1355b..abbb8e1b 100644 --- a/integrations/datadog/templates/environment.json.hbs +++ b/integrations/datadog/templates/environment.json.hbs @@ -1,6 +1,6 @@ { - "title": "{{{title.plainText}}}", - "text": "%%% \n {{{title.markdown}}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", + "title": {{#if formVariables.hideMemberDetails}}"A member {{{titleVerb}}} {{{target.name}}}"{{else}}"{{{title.plainText}}}"{{/if}}, + "text": "%%% \n {{#if formVariables.hideMemberDetails}}A member {{{titleVerb}}} [{{{target.name}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", "date_happened": {{timestamp.seconds}}, "tags": [ {{#if customProperties}} @@ -22,8 +22,8 @@ {{!-- The following tag was added to provide backwards compatibility with the legacy integration. --}} "{{project.environment.name}}", "action:{{verbKind}}", - "kind:{{kind}}", - "member:{{member.email}}" + {{#unless formVariables.hideMemberDetails }}"member:{{member.email}}",{{/unless}} + "kind:{{kind}}" ], "source_type_name": "launchdarkly" } diff --git a/integrations/datadog/templates/project.json.hbs b/integrations/datadog/templates/project.json.hbs index 9f2816b6..a52b2e05 100644 --- a/integrations/datadog/templates/project.json.hbs +++ b/integrations/datadog/templates/project.json.hbs @@ -1,6 +1,6 @@ { - "title": "{{{title.plainText}}}", - "text": "%%% \n {{{title.markdown}}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", + "title": {{#if formVariables.hideMemberDetails}}"A member {{{titleVerb}}} {{{target.name}}}"{{else}}"{{{title.plainText}}}"{{/if}}, + "text": "%%% \n {{#if formVariables.hideMemberDetails}}A member {{{titleVerb}}} [{{{target.name}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", "date_happened": {{timestamp.seconds}}, "tags": [ {{#if customProperties}} @@ -18,8 +18,9 @@ "project_key:{{project.key}}", "project_name:{{project.name}}", "action:{{verbKind}}", - "kind:{{kind}}", - "member:{{member.email}}" + {{#unless formVariables.hideMemberDetails }}"member:{{member.email}}",{{/unless}} + "kind:{{kind}}" + ], "source_type_name": "launchdarkly" } From f58e82c3b7f06f85f5d2705c3e458574537863e8 Mon Sep 17 00:00:00 2001 From: Molly Date: Wed, 16 Mar 2022 09:16:15 -0700 Subject: [PATCH 511/936] [sc-145741] docs: copyedits and minor cleanup (#338) * docs: copyedits and minor cleanup * Apply suggestions from code review Co-authored-by: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> * Update docs/capabilities.md * Apply suggestions from code review: integrations team, not integration team Co-authored-by: Henry Barrow * remove mention of auth per discussion here: https://github.com/launchdarkly/integration-framework-private/pull/338/files#r828030266 * one more integration -> integrations team correction Co-authored-by: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Henry Barrow --- README.md | 16 +++++----- docs/capabilities.md | 65 +++++++++++++++++++---------------------- docs/endpoint.md | 7 ++--- docs/form-variables.md | 15 ++++++---- docs/getting-started.md | 30 +++++++------------ docs/manifest.md | 22 +++++++------- 6 files changed, 70 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index 5c3f1c6e..41d78bb5 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ [![CircleCI](https://circleci.com/gh/launchdarkly/integration-framework.svg?style=svg&circle-token=9a44436c3b22e7fb6a22df1ad9a2455a0d6f2d34)](https://circleci.com/gh/launchdarkly/integration-framework) -Feature flags give you control over your deployment and rollout, but that's not all they do. They also provide context to other related systems, giving your team visibility into how your services react due to flag changes. +Feature flags give you control over your deployment and rollout. They can also provide context to third-party tools that show you how your application reacts to flag changes. You can integrate these tools with LaunchDarkly using the LaunchDarkly integration framework. For additional background, read [Building your own integrations](https://docs.launchdarkly.com/integrations/building-integrations) in our LaunchDarkly product documentation. -This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly to provide their users with more context. +This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly to provide the external tools with more context. -LaunchDarkly's integration framework lets you build one-way integrations from LaunchDarkly to a third party service. We support a small subset of actions that let you subscribe to LaunchDarkly events to trigger an action or event in your service. You can think of this capability as a webhook, with the added convenience of not having to write your own service to manage the integration. LaunchDarkly manages the configuration, authentication, and transformation of our events to what your service expects without having to create an intermediary service. +LaunchDarkly's integration framework lets you build one-way integrations from LaunchDarkly to a third-party service. We support a small subset of actions that let you subscribe to LaunchDarkly events to trigger an action or event in your service. You can think of this capability as a webhook, with the added convenience of not having to write your own service to manage the integration. LaunchDarkly manages the configuration, authentication, and transformation of our events to what your service expects without having to create an intermediary service. ## Building your own integrations @@ -16,18 +16,18 @@ To learn more, read [Getting started](docs/getting-started.md). ## The LaunchDarkly Technology Partner Program -Using the LaunchDarkly Integration Framework is just one way to create a relationship with LaunchDarkly. You can unlock even more benefits by joining our Technology Partner Program. +Using the LaunchDarkly integration framework is just one way to create a relationship with LaunchDarkly. You can unlock more benefits by joining our Technology Partner Program. -To join the program, email us at [partnerships@launchdarkly.com](mailto:partnerships@launchdarkly.com). +To learn more, read [Technology Partner Program](https://docs.launchdarkly.com/integrations/building-integrations#technology-partner-program). To join the program, email us at [partnerships@launchdarkly.com](mailto:partnerships@launchdarkly.com). ## Submitting bug reports and feature requests -The LaunchDarkly integration team monitors this repository's [issue tracker](https://github.com/launchdarkly/integration-framework/issues). We respond to all new issues within two business days. Use the issue tracker to file bug reports and feature requests specific to the platform and integrations. +The LaunchDarkly integrations team monitors this repository's [issue tracker](https://github.com/launchdarkly/integration-framework/issues). We respond to all new issues within two business days. Use the issue tracker to file bug reports and feature requests specific to the platform and integrations. If you want to reach out in private, email [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com). ## Submitting pull requests -We encourage pull requests and other contributions from the community. The integration team responds to all new pull requests within two business days. +We encourage pull requests and other contributions from the community. The LaunchDarkly integrations team responds to all new pull requests within two business days. -Before you submit pull requests, make sure that all temporary or unintended code is removed. Don't worry about adding reviewers to the pull request; the LaunchDarkly integration team can add themselves. +Before you submit pull requests, make sure that all temporary or unintended code is removed. Don't worry about adding reviewers to the pull request. The LaunchDarkly integrations team will add themselves. diff --git a/docs/capabilities.md b/docs/capabilities.md index 11c129ba..71bc540d 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -16,13 +16,11 @@ An audit log events hook is a webhook that LaunchDarkly sends whenever an event The `auditLogEventsHook` has three properties: 1. [`endpoint`](#endpoint): - Describes the HTTP handler that will receive the webhook. + The HTTP handler that will receive the webhook. 2. [`templates`](#templates): A map of template paths relative to your integration's directory. You can use templates to transform the raw audit log events to a format that your integration expects. These templates can be any file type. 3. [`defaultPolicy`](#default-policy): - An array of [LaunchDarkly - policies](https://docs.launchdarkly.com/home/members/role-policies) that - act as a filter determining which events to send to your webhook endpoint. + An array of LaunchDarkly policies. The policies determine which events to send to your webhook endpoint. To learn more, read [Using policies](https://docs.launchdarkly.com/home/members/role-policies). Here's an example of an audit log events hook capability that subscribes to flag events in a LaunchDarkly account: @@ -66,7 +64,9 @@ Every `auditLogEventsHook` capability must specify the [endpoint](endpoint.md) t Before the `auditLogEventsHook` capability sends the request to the endpoint handling your webhook, you can transform the body of the request sent to your handler. -In your manifest, you can specify templates to be executed when webhook events are of kinds `flag`, `project`, and `environment`. Additionally, you can specify a `default` template as a catch-all for any event without a more specific template. A `validation` template is also provided in case you want to provide users with the ability to validate their connection by sending a test event from LaunchDarkly to your service. +In your manifest, you can specify templates to be executed when webhook events are of kinds `flag`, `project`, and `environment`. Additionally, you can specify a `default` template as a catch-all for any event without a more specific template. You can also specify a `validation` template to provide users with the ability to validate their connection by sending a test event from LaunchDarkly to your service. + +Here is an example: ```json "templates": { @@ -139,11 +139,9 @@ If you don't provide one or more templates, LaunchDarkly sends you a default JSO } ``` -If you choose to provide one or more `templates`, LaunchDarkly renders your template using the context data above. Your template can be any text based format, but you must specify the appropriate `Content-Type` header in your `endpoint.headers` property to match the content type of your template body. - -We use a basic subset of the Handlebars template syntax to render your template. +If you choose to provide one or more templates, LaunchDarkly renders your template using the context data above. Your template can be any text-based format, but you must specify the appropriate `Content-Type` header in your `endpoint.headers` property to match the content type of your template body. -To learn more about Handlebars' sysntax, read [Handlebars' Language Guide](https://handlebarsjs.com/guide/). +We use a basic subset of the Handlebars template syntax to render your template. To learn more about Handlebars syntax, read [Handlebars Language Guide](https://handlebarsjs.com/guide/). In addition to the basic language syntax, we support the following [built-in helpers](https://handlebarsjs.com/guide/builtin-helpers.html): @@ -153,26 +151,26 @@ In addition to the basic language syntax, we support the following [built-in hel - `with` - `lookup` -Furthermore, the following custom helpers are supported: +We also support the following custom helpers: -- `equal` - renders a block if the string version of both arguments are equals +- `equal`: renders a block if the string version of both arguments are equal - `pathEncode` - URL path encodes the string version of the argument - `queryEncode` - URL query encodes the string version of the argument -- `basicAuthHeaderValue` - transforms `username` and `password` arguments into the `Authorization` header value required for a basic auth (including the `Basic ` prefix). -- `formatWithOffset` - adds an offset in seconds to a unix milliseconds timestamp and formats the timestamp using one of the supported formats detailed below. +- `basicAuthHeaderValue`: transforms `username` and `password` arguments into the `Authorization` header value required for a basic auth, including the `Basic ` prefix +- `formatWithOffset`: adds an offset in seconds to a unix milliseconds timestamp and formats the timestamp using one of the supported formats detailed below -The following timestamp formats are supported: +We support the following timestamp formats: -- `milliseconds` - unix milliseconds -- `seconds` - unix seconds -- `rfc3339` - [RFC3339 format](https://datatracker.ietf.org/doc/html/rfc3339), e.g., `2020-02-04T01:02:14Z` -- `simple` - timestamp string formatted as `yyyy-mm-dd h:MM:ss`, e.g., `2020-02-04 01:03:59` +- `milliseconds`: Unix milliseconds +- `seconds`: Unix seconds +- `rfc3339`: [RFC3339 format](https://datatracker.ietf.org/doc/html/rfc3339), for example, `2020-02-04T01:02:14Z` +- `simple`: timestamp string formatted as `yyyy-mm-dd h:MM:ss`, for example, `2020-02-04 01:03:59` To test your templates, you can run `npm run preview $INTEGRATION_NAME` or use the [Handlebars Sandbox](http://tryhandlebarsjs.com/). ### Default policy -When you configure your integration, customers can specify an array of [LaunchDarkly policies](https://docs.launchdarkly.com/home/members/role-policies) filter which events to send to your webhook endpoint. +Users of your integration can specify an array of [LaunchDarkly policies](https://docs.launchdarkly.com/home/members/role-policies) to filter which events to send to your webhook endpoint. To simplify onboarding your integration, you can specify a default policy which follows best practices for your integration's use case. @@ -192,9 +190,9 @@ Here is the policy: ### Include error response body (`includeErrorResponseBody`) -For endpoints defined with static domains - where the domain part of the endpoint isn't a template variable (see example below), you have the option to specify an optional property `includeErrorResponseBody` in your `auditLogEventsHook` configuration to view any errors LaunchDarkly receives when it sends events to your endpoint. This is particularly useful for users troubleshooting issues with their integration. +A static domain is one in which the domain part of the endpoint is not a template variable. For endpoints defined with static domains, you can specify the optional property `includeErrorResponseBody` in your `auditLogEventsHook` configuration to view any errors LaunchDarkly receives when it sends events to your endpoint. This is particularly useful for users troubleshooting issues with their integration. -Heres the example: +Here is an example: ```json "includeErrorResponseBody": true, @@ -206,32 +204,27 @@ Heres the example: ### Validation -To preview your integration's templates with sample data, run `npm run preview INTEGRATION_NAME`. +To preview your integration's templates with sample data, run `npm run preview $INTEGRATION_NAME`. -Alternatively, to produce a sample `curl` command, run `npm run curl INTEGRATION_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. +Alternatively, to produce a sample `curl` command, run `npm run curl $INTEGRATION_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. ## Trigger (`trigger`) **LaunchDarkly's trigger functionality is only available to customers who have opted in to an Early Access Program (EAP). To access to this feature, [join the EAP](https://launchdarkly.com/eap).** -The trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. - -By default, the trigger URL contains a globally unique path parameter to provide security in the form of an [unguessable URL](https://www.schneier.com/blog/archives/2015/07/googles_unguess.html). However, if your service supports additional security settings such as shared secrets when firing webhooks, you can specify those with the optional `auth` object. **Note**: at launch, the `auth` attribute is unsupported and should be omitted. +The trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. By default, the trigger URL contains a globally unique path parameter to provide security in the form of an [unguessable URL](https://www.schneier.com/blog/archives/2015/07/googles_unguess.html). The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. -If the integration offers the option to send test events / webhook requests, the optional `testEventNameRegexp` fields allows you to specify regex to match the expected `eventName` value below. This will tell our integration framework not to make any real flag or resource changes associated with matching events. +If the integration offers the option to send test events or webhook requests, the optional `testEventNameRegexp` field lets you to specify regex to match the expected `eventName` value. This tells our integration framework not to make any real flag or resource changes associated with matching events. If your webhooks' request bodies are non-empty, you can specify the optional `parser` object with one or more of `eventName`, `value`, and `url`. The provided values will flow through LaunchDarkly into the resulting audit log messages when your service invokes a trigger in LaunchDarkly. -Here is an example `trigger` capability including all optional properties: +Here is an example `trigger` capability: ```json "trigger": { "documentation": "https://example.com/configuring-webhooks", - "auth": { - "type": "sharedSecret" - }, "parser": { "eventName": "/event", "value": "/value", @@ -240,7 +233,7 @@ Here is an example `trigger` capability including all optional properties: } ``` -**Note**: if an integration only has the trigger capability, the word "trigger" will be added to its name in the LaunchDarkly UI. For this reason, do not include the word "trigger" in the manifest name. See the [generic-trigger manifest](/integrations/generic-trigger/manifest.json) for an example. +If an integration only has the trigger capability, the word "trigger" will be added to its name in the LaunchDarkly UI. For this reason, do not include the word "trigger" in the manifest name. Review the [generic-trigger manifest](/integrations/generic-trigger/manifest.json) for an example. ## Reserved custom properties (`reservedCustomProperties`) @@ -250,9 +243,9 @@ To learn more, read [Custom properties](https://docs.launchdarkly.com/home/conne By default, users must specify a custom property name and key when they attach the custom property value to a feature flag. This step introduces the possibility of user error. To prevent this, developers can _reserve_ a custom property for their integration, which makes it much easier for users to correctly add the property's value to feature flags. -Reserved custom properties are simple to define. Their only requirements are a `name` and `key`, adding a `description` is optional. +Reserved custom properties require a `name` and `key`. Adding a `description` is optional. -After your integration is configured by a user, the custom property starts appearing in the dropdown on the flag's Settings page. +After your integration is configured by a user, the custom property starts appearing in the dropdown on the flag's **Settings** page. Here is an example `reservedCustomProperties` capability: @@ -280,12 +273,14 @@ This specifies the request [`endpoint`](endpoint.md) that LaunchDarkly makes whe In addition to the form variables defined in your manifest, you can use the special variable `_featureStoreKey`. `_featureStoreKey` is provided by LaunchDarkly, and is unique per environment. -### `validationRequest` (Optional) +### `validationRequest` (optional) Specifying a validation request allows customers to verify that they have properly filled out the details to correctly make a request. The `parser` object allows LaunchDarkly to interpret the response of the validation request. It allows a mapping of success and errors for the given response body of the request in the form of a [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901). The `parser` object has two properties: a required `success` and an optional `error`. +Here is an example `parse` object: + ```json "parser": { "success": "/success", diff --git a/docs/endpoint.md b/docs/endpoint.md index 9130b803..fc8c1879 100644 --- a/docs/endpoint.md +++ b/docs/endpoint.md @@ -21,12 +21,9 @@ Some capabilities require specifying an endpoint that LaunchDarkly can make requ This specification must include all appropriate request semantics including the URL, method, and headers. -In the example -above, the properties `endpoint.url` and `endpoint.headers[].value` accept template variables. These template variables can reference any [`formVariables`](form-variables.md) you've defined in your manifest. The templating language LaunchDarkly uses is based off of a subset of the Handlebars syntax. +In the example above, the properties `endpoint.url` and `endpoint.headers[].value` accept template variables. These template variables can reference any [`formVariables`](form-variables.md) you've defined in your manifest. This lets you configure a dynamic endpoint based on the `formVariables` your integration collects from the user. -To learn more, read the [Handlebars documentation](https://handlebarsjs.com/). - -There are a few properties that allow you to substitute template variables at runtime. The main ones are the `endpoint.url` and the `endpoint.headers[].value`. This lets you configure a dynamic endpoint based on the `formVariables` your integration collects from the user. +The templating language LaunchDarkly uses is based off of a subset of the Handlebars syntax. To learn more, read the [Handlebars documentation](https://handlebarsjs.com/). This example uses the `endpointUrl` form variable as the URL of the endpoint and the `apiToken` as a `Bearer` token in the `Authorization` header: diff --git a/docs/form-variables.md b/docs/form-variables.md index 4fc85395..4f7ade1c 100644 --- a/docs/form-variables.md +++ b/docs/form-variables.md @@ -1,9 +1,8 @@ # Form variables -Most integrations need to collect one or more pieces of configuration data that supports the integration, such as API tokens or webhook endpoints. +Most integrations need to collect one or more pieces of configuration data that support the integration, such as API tokens or webhook endpoints. -To support these configurations, describe a set of -`formVariables` that define these configuration properties. +To support these configurations, describe a set of `formVariables` that define these configuration properties. The `formVariables` populate a form in the LaunchDarkly user interface (UI) that users complete to add your integration. Here's an example: @@ -26,14 +25,18 @@ Here's an example: ], ``` -The `formVariables` entry above displays as the following UI in the [LaunchDarkly Integrations page](https://app.launchdarkly.com/default/integrations): +The `formVariables` entry above displays as the following UI on the [LaunchDarkly Integrations page](https://app.launchdarkly.com/default/integrations): ![Example configuration form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) Form variables apply to the entire integration configuration. There are no capability-specific form variables. -The `formVariables[].description` will be used as a field label on the UI. You can use simple markdown to link a word or phrase to an external URL. +The `key`, `name`, `description`, and `type` are required. -Accepted form variable types are `string`, `boolean`, `uri`, `enum`, and `dynamicEnum`. Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. If you provide a `defaultValue`, you must also set `isOptional` to `true` and vice versa. +The `formVariables[].description` is used as a field label on the UI. You can use simple Markdown to link a word or phrase to an external URL. + +Accepted form variable `type`s are `string`, `boolean`, `uri`, `enum`, and `dynamicEnum`. + +Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. If you provide a `defaultValue`, you must also set `isOptional` to `true` and vice versa. To learn more, read the [manifest schema](../manifest.schema.json). diff --git a/docs/getting-started.md b/docs/getting-started.md index c73296eb..84f17d88 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -6,11 +6,9 @@ There are several steps to building an integration with LaunchDarkly. Before you connect LaunchDarkly with a third-party service, replicate your integration's desired behavior in an isolated standalone environment separate from LaunchDarkly. -The easiest way to do this is to use [`curl`](https://curl.haxx.se/docs/manpage.html). Find the API documentation for your third-party service and execute sample commands against it. A lot of API documentation has `curl` example commands provided for developers to use. +The easiest way to do this is to use [`curl`](https://curl.se/docs/manpage.html). Find the API documentation for your third-party service and execute sample commands against the service. When you execute your sample commands, observe the request semantics. This helps streamline your manifest and template definitions. -When you execute your sample commands, observe the request semantics. This helps streamline your manifest and template definitions. - -If you are looking to integrate with a third-party service that you are not directly associated with, please open a [Feature Request](https://github.com/launchdarkly/integration-framework/issues/new/choose) describing your goal and expectations for the integration before submitting any Pull Request. +If you are looking to integrate with a third-party service that you are not directly associated with, please open a [Feature Request](https://github.com/launchdarkly/integration-framework/issues/new/choose) describing your goal and expectations for the integration before submitting any pull requests. ## Step 1: Fork this repository @@ -22,9 +20,7 @@ To learn more about submitting a pull request, read [Step 8: Submit your integra ## Step 2: Create a new directory inside `./integrations` -Create a new directory inside the [integrations](../integrations) directory. Name it after your organization or give it the integration's name (For example, `your-company-name-dot-com`). - -The directory name must not have any spaces and must use [kebab-casing](https://wiki.c2.com/?KebabCase). +Create a new directory inside the [integrations](../integrations) directory. Name it after your organization or give it the integration's name, for example, `your-company-name-dot-com`. The directory name must not have any spaces and must use [kebab-casing](https://wiki.c2.com/?KebabCase). Only change files and directories inside your new directory. Our validation process rejects any pull requests with modified content outside of your directory. @@ -36,9 +32,9 @@ Defining your manifest is the single most important step in contributing your in To learn more, read [Integration manifest](manifest.md). -## Step 4: Collect integration configuration data from LaunchDarkly users +## Step 4: Collect integration configuration data from LaunchDarkly account members -Most integrations need to collect one or more pieces of configuration data that support the integration (for example, API tokens or webhook endpoints). +Most integrations need to collect one or more pieces of configuration data that support the integration. For example, your integration may collect API tokens or webhook endpoints. You can describe a set of `formVariables` that define these configuration properties. @@ -57,9 +53,9 @@ To validate your integration: 1. Run `npm install` to install the validation dependencies. 2. Run `npm test` to run the validation suite. -**Note:** Please use Node.js v16 when running the above npm commands. +Use Node.js v16 when running the above `npm` commands. -Additionally, we recommend you install [pre-commit hooks](https://pre-commit.com/#install) with `pre-commit install`. This will make the validation suite run before every commit, saving you time if you need to troubleshoot anything. +Additionally, we recommend you install [pre-commit hooks](https://pre-commit.com/#install) with `pre-commit install`. This runs the validation suite before every commit, saving you time if you need to troubleshoot anything. Some of the capabilities have their own validation tools. To learn more, read [Capabilities](capabilities.md). @@ -67,16 +63,12 @@ Some of the capabilities have their own validation tools. To learn more, read [C Now that your integration is built and validated, you must provide documentation for users and integration maintainers. -Find LaunchDarkly's user documentation at [docs.launchdarkly.com](https://docs.launchdarkly.com/integrations). You can submit new docs to the [LaunchDarkly-Docs repository](https://github.com/launchdarkly/LaunchDarkly-Docs). +Find LaunchDarkly's user documentation at [docs.launchdarkly.com](https://docs.launchdarkly.com/integrations). You can submit new docs to the [LaunchDarkly-Docs repository](https://github.com/launchdarkly/LaunchDarkly-Docs). Submit a pull request to this repository with a new integrations guide. Follow the pattern and language used by existing integration guides. -Submit a pull request to this repository with a new integrations guide. Follow the pattern and language used by existing integration guides. - -In addition to user documentation, you must to provide guidance on how to maintain and test your integration. Specify this developer-focused information in an integration README (`README.md`) in your integration's directory. The README should also link to the user documentation you provide. +In addition to user documentation, you must to provide guidance on how to maintain and test your integration. Specify this developer-focused documentation in an integration README (`README.md`) in your integration's directory. The README should also link to the user documentation you provide. ## Step 8: Submit your integration -After you've built your integration, [submit a pull request against this repo](https://github.com/launchdarkly/integration-framework/pull/new/main). - -When you do, your branch will run through some automated validations and be reviewed by our team. If we're ready to publish your integration, we'll get your permission and make it live on our site. +After you've built your integration, [submit a pull request against this repository](https://github.com/launchdarkly/integration-framework/pull/new/main). -We'll also work with you on submitting your user documentation to our [documentation site](https://github.com/launchdarkly/LaunchDarkly-Docs). +When you submit a pull request, your branch will run through some automated validations and be reviewed by our team. If we're ready to publish your integration, we'll get your permission and publish your integration and documentation live on our site. diff --git a/docs/manifest.md b/docs/manifest.md index d0ae16db..fdca47a2 100644 --- a/docs/manifest.md +++ b/docs/manifest.md @@ -18,14 +18,14 @@ If you use [VSCode](https://code.visualstudio.com/), it detects the settings in The first part of the manifest describes your organization, contacts, URLs, and a few items LaunchDarkly needs to list your integration properly. -We use most of this information when we render your integration card and configuration form in the LaunchDarkly UI. +We use most of this information when we render your integration card and configuration form in the LaunchDarkly user interface (UI). ```json { "name": "Sample Integration", "version": "1.0.0", "overview": "Short one-liner describing your integration", - "description": "Send flag data to space. Markdown based description.", + "description": "Send flag data to space. Markdown-based description.", "author": "Example Dot Com", "supportEmail": "support@example.com", "links": { @@ -41,26 +41,24 @@ We use most of this information when we render your integration card and configu } ``` -There are a few properties in the manifest that can accept simple [markdown](https://daringfireball.net/projects/markdown/). One of them is the `description`. +There are a few properties in the manifest that can accept simple [Markdown](https://daringfireball.net/projects/markdown/). One of them is the `description`. LaunchDarkly's UI converts Markdown to HTML. To get the best results, only use simple Markdown, such as links and basic text formatting. -LaunchDarkly's UI converts markdown to HTML. To get the best results, only use simple markdown, like links and basic text formatting. +The `icons` described in the manifest are in SVG format. This is intentional. We do not accept other image formats. -Notice that the `icons` described above are in SVG format. This is intentional. We do not accept other image formats. +We use your organization's or integration's logo in the LaunchDarkly UI and in the public integrations listing on [launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG files allow your logo to scale nicely on different devices. To make sure your logo appears correctly everywhere we use it, make sure that it doesn't have any padding around the image. -We use your organization's or integration's logo in the LaunchDarkly UI and a public facing integrations listing on [launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG files allow your logo to scale nicely on different devices. To make sure your logo appears correctly everywhere we use it, make sure that your SVG logos don't have any padding around the image. - -Also, notice that the `icon.square` and `icon.horizontal` properties point to relative paths. These paths are relative to your integration's directory. You are free to create any directories and files that support your integration. +The `icon.square` and `icon.horizontal` properties point to relative paths. These paths are relative to your integration's directory. You are free to create any directories and files that support your integration. ## OAuth -Many integrations in LaunchDarkly today use API Tokens. However, if your API requires OAuth for authentication, we can support that as well. Currently, we support two types of OAuth: +Many integrations in LaunchDarkly use API tokens. However, if your API requires OAuth for authentication, we can support that as well. We support two types of OAuth: * [Authorization Code Flow](https://oauth.net/2/grant-types/authorization-code/) - (aka, 3-legged OAuth) + (also known as "3-legged OAuth") * [Client Credentials Flow](https://oauth.net/2/grant-types/client-credentials/) - (aka, 2-legged OAuth) + (also known as "2-legged OAuth") -With these flows, LaunchDarkly acts as the OAuth consumer. In order for this to work, LaunchDarkly will need to store a consumer ID and secret. Please contact us at to register your OAuth consumer details. You'll also need to set the `requiresOAuth` root-level property in your manifest to `true`. At runtime, LaunchDarkly will lookup your OAuth consumer ID and secret from our registry based on your integration key. **Simply setting the `requiresOAuth` property to `true` will not enable OAuth on your integration -- you'll need to provide us with the OAuth consumer details first.** +With both of these flows, LaunchDarkly acts as the OAuth consumer. In order for this to work, LaunchDarkly needs to store a consumer ID and secret. Contact us at [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com) to register your OAuth consumer details. You'll also need to set the `requiresOAuth` root-level property in your manifest to `true`. At runtime, LaunchDarkly will look up your OAuth consumer ID and secret from our registry based on your integration key. **Setting the `requiresOAuth` property to `true` will not enable OAuth on your integration. You need to provide us with the OAuth consumer details first.** ## Form variables and capabilities From 65f10a166147f824ac502f6fd357344bcb34c186 Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Mon, 21 Mar 2022 16:08:34 -0400 Subject: [PATCH 512/936] add additional PR template step --- .github/pull_request_template.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index eaa70695..6ad0b7bb 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -3,6 +3,7 @@ - [ ] I have followed the repository's [pull request submission guidelines](../blob/main/README.md#submitting-pull-requests) - [ ] I have updated my user documentation - [ ] I have updated my developer documentation (my integration README) +- [ ] I have submitted the [Become a Partner](https://launchdarkly.com/partners/) form **Intended availability** From caef56581aa51281a64f015e9bd1a1fea8a12068 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 31 Mar 2022 19:16:14 +0100 Subject: [PATCH 513/936] Back merge public to pick up Compass tile (#342) --- .../compass/assets/images/horizontal.svg | 1 + integrations/compass/assets/images/square.svg | 1 + integrations/compass/manifest.json | 21 +++++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 integrations/compass/assets/images/horizontal.svg create mode 100644 integrations/compass/assets/images/square.svg create mode 100644 integrations/compass/manifest.json diff --git a/integrations/compass/assets/images/horizontal.svg b/integrations/compass/assets/images/horizontal.svg new file mode 100644 index 00000000..bcb14b7a --- /dev/null +++ b/integrations/compass/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/compass/assets/images/square.svg b/integrations/compass/assets/images/square.svg new file mode 100644 index 00000000..67251148 --- /dev/null +++ b/integrations/compass/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/compass/manifest.json b/integrations/compass/manifest.json new file mode 100644 index 00000000..abede717 --- /dev/null +++ b/integrations/compass/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Compass", + "version": "1.0.0", + "overview": "Visualize feature flag changes for software components in Atlassian Compass.", + "description": "Add a visual timeline of LaunchDarkly feature flag changes to related software components in Atlassian Compass.", + "author": "Atlassian", + "supportEmail": "compassfb@customerfeedback.atlassian.net", + "links": { + "site": "https://www.atlassian.com/software/compass", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/compass", + "supportWebsite": "https://community.atlassian.com/t5/Compass-Alpha/gh-p/compass-alpha", + "privacyPolicy": "https://www.atlassian.com/legal/privacy-policy" + }, + "categories": ["developer-tools", "infrastructure"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "requiresOAuth": false, + "otherCapabilities": ["external"] +} From 39a2c31708125c1cec44389aa01c50ab7d4e6a0c Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 1 Apr 2022 13:20:24 +0100 Subject: [PATCH 514/936] [sc-146750] Add member template functionality (#343) * Add member template functionality * remove reference to new template --- manifest.schema.d.ts | 5 +++++ manifest.schema.json | 9 ++++++++- schemas/capabilities/auditLogEventsHook.json | 15 ++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index b103d6c3..23f34948 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -268,6 +268,10 @@ export type DefaultTemplate = string; * Template to use when sending test events with the 'validate connection' button */ export type ValidationTemplate = string; +/** + * Template to use for member events + */ +export type MemberTemplate = string; /** * LaunchDarkly policy that allows you to filter events sent to your webhook. See https://docs.launchdarkly.com/home/members/role-policies for more information. */ @@ -595,6 +599,7 @@ export interface WebhookBodyTemplate { environment?: EnvironmentTemplate; default?: DefaultTemplate; validation?: ValidationTemplate; + member?: MemberTemplate; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index c47cc88d..78796094 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -661,7 +661,8 @@ "project", "environment", "default", - "validation" + "validation", + "member" ] }, "properties": { @@ -694,6 +695,12 @@ "title": "validation template", "description": "Template to use when sending test events with the 'validate connection' button", "type": "string" + }, + "member": { + "$id": "#/properties/capability/audit-log-events-hook/templates/member", + "title": "Member template", + "description": "Template to use for member events", + "type": "string" } } }, diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index b8ccc0cd..4c716496 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -23,7 +23,14 @@ "description": "Templates to use for body of the webhook request", "type": "object", "propertyNames": { - "enum": ["flag", "project", "environment", "default", "validation"] + "enum": [ + "flag", + "project", + "environment", + "default", + "validation", + "member" + ] }, "properties": { "flag": { @@ -55,6 +62,12 @@ "title": "validation template", "description": "Template to use when sending test events with the 'validate connection' button", "type": "string" + }, + "member": { + "$id": "#/properties/capability/audit-log-events-hook/templates/member", + "title": "Member template", + "description": "Template to use for member events", + "type": "string" } } }, From c29000333b8078d6a5e88072598303c026735285 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 5 Apr 2022 10:15:16 +0100 Subject: [PATCH 515/936] [sc-146750] use member ids to show cleaned up member audit log events (#341) * use member ids to show cleaned up member audit log events * create new member template * update member template * update tests to include tests for member template * update sample context to include target.id --- __tests__/validateIntegrationManifests.js | 27 +++++- integrations/datadog/manifest.json | 1 + .../datadog/templates/default.json.hbs | 37 -------- .../datadog/templates/member.json.hbs | 23 +++++ sample-context/environment/create.json | 3 +- sample-context/environment/delete.json | 3 +- sample-context/environment/update.json | 3 +- sample-context/flag/archive.json | 3 +- sample-context/flag/copy.json | 3 +- sample-context/flag/create.json | 3 +- .../flag/targeting-rule-update.json | 3 +- sample-context/flag/toggle.json | 3 +- .../flag/update-all-environments.json | 3 +- sample-context/member/update.json | 90 +++++++++++++++++++ sample-context/other/metric.create.json | 3 +- sample-context/other/segment.create.json | 3 +- sample-context/other/segment.update.json | 3 +- sample-context/other/webhook.enable.json | 3 +- sample-context/project/create.json | 3 +- sample-context/project/delete.json | 3 +- sample-context/project/update.json | 3 +- 21 files changed, 172 insertions(+), 54 deletions(-) create mode 100644 integrations/datadog/templates/member.json.hbs create mode 100644 sample-context/member/update.json diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 047cbcc7..2706afa4 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -9,6 +9,7 @@ const schema = require('../manifest.schema.json'); const flagContext = require('../sample-context/flag/update-all-environments'); const projectContext = require('../sample-context/project/update'); const environmentContext = require('../sample-context/environment/update'); +const memberContext = require('../sample-context/member/update'); const OAUTH_INTEGRATIONS = ['appdynamics', 'servicenow']; // add oauth integrations here @@ -90,6 +91,7 @@ const getFullContext = (manifest, context, isJSON) => { ? jsonEscape(Object.assign({}, context)) : Object.assign({}, context); fullContext.formVariables = endpointContext; + return fullContext; }; @@ -322,6 +324,11 @@ describe('All integrations', () => { 'capabilities.auditLogEventsHook.templates.validation', null ); + const memberTemplatePath = _.get( + manifest, + 'capabilities.auditLogEventsHook.templates.member', + null + ); if (flagTemplatePath) { const path = `./integrations/${key}/${flagTemplatePath}`; expect(existsSync(path)).toBe(true); @@ -427,12 +434,30 @@ describe('All integrations', () => { rendered.trim(), `${key} validation template must not render an empty string` ).not.toEqual(''); + } + if (memberTemplatePath) { + const path = `./integrations/${key}/${memberTemplatePath}`; + expect(existsSync(path)).toBe(true); + const template = getTemplate(path); + const isJSON = isJSONTemplate(memberTemplatePath); + const fullContext = getFullContext(manifest, memberContext, isJSON); + expect( + () => template(fullContext), + `${key}: member template must render successfully` + ).not.toThrow(); + + // member templates must not render an empty string + const rendered = template(fullContext); + expect( + rendered.trim(), + `${key} member template must not render an empty string` + ).not.toEqual(''); // Validate json templates render to valid json if (isJSON) { expect( () => JSON.parse(rendered), - `${key} validation .json templates must render valid JSON\n${rendered}` + `${key} member .json templates must render valid JSON\n${rendered}` ).not.toThrow(); } } diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 80252db1..a956e1a6 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -75,6 +75,7 @@ "default": "templates/default.json.hbs", "project": "templates/project.json.hbs", "environment": "templates/environment.json.hbs", + "member": "templates/member.json.hbs", "validation": "templates/default.json.hbs" }, "defaultPolicy": [ diff --git a/integrations/datadog/templates/default.json.hbs b/integrations/datadog/templates/default.json.hbs index 37137c93..03e415e2 100644 --- a/integrations/datadog/templates/default.json.hbs +++ b/integrations/datadog/templates/default.json.hbs @@ -1,6 +1,3 @@ -{{#equalWithElse kind "member"}} -{{#if formVariables.hideMemberDetails}} -{{else}} { "title": {{#if formVariables.hideMemberDetails}}"A member {{{titleVerb}}} {{{target.name}}}"{{else}}"{{{title.plainText}}}"{{/if}}, "text": "%%% \n {{#if formVariables.hideMemberDetails}}A member {{{titleVerb}}} [{{{target.name}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", @@ -32,37 +29,3 @@ ], "source_type_name": "launchdarkly" } -{{/if}} -{{else}} -{ - "title": {{#if formVariables.hideMemberDetails}}"A member {{{titleVerb}}} {{{target.name}}}"{{else}}"{{{title.plainText}}}"{{/if}}, - "text": "%%% \n {{#if formVariables.hideMemberDetails}}A member {{{titleVerb}}} [{{{target.name}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", - "date_happened": {{timestamp.seconds}}, - "tags": [ - {{#if customProperties}} - {{#if customProperties.datadog}} - {{#if customProperties.datadog.values}} - {{#with customProperties}} - {{#each datadog.values}} - "{{{this}}}", - {{/each}} - {{/with}} - {{/if}}{{/if}}{{/if}} - {{#each tags}} - "{{{this}}}", - {{/each}} - {{#if project.key}}"project_key:{{project.key}}", - "project_name:{{project.name}}", - {{#if project.environment.key}}"environment_key:{{project.environment.key}}", - "environment_name:{{project.environment.name}}", - {{!-- The following tag was added to provide backwards compatibility with the legacy integration. --}} - "{{project.environment.name}}",{{/if}}{{/if}} - "{{kind}}_key:{{key}}", - "{{kind}}_name:{{name}}", - "action:{{verbKind}}", - {{#unless formVariables.hideMemberDetails }}"member:{{member.email}}",{{/unless}} - "kind:{{kind}}" - ], - "source_type_name": "launchdarkly" -} -{{/equalWithElse}} diff --git a/integrations/datadog/templates/member.json.hbs b/integrations/datadog/templates/member.json.hbs new file mode 100644 index 00000000..dfb8b124 --- /dev/null +++ b/integrations/datadog/templates/member.json.hbs @@ -0,0 +1,23 @@ +{ + "title": {{#if formVariables.hideMemberDetails}}"Member {{member._id}} {{{titleVerb}}} {{{target._id}}}"{{else}}"{{{title.plainText}}}"{{/if}}, + "text": "%%% \n {{#if formVariables.hideMemberDetails}}Member {{member._id}} {{{titleVerb}}} [{{{target._id}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", + "date_happened": {{timestamp.seconds}}, + "tags": [ + {{#if customProperties}} + {{#if customProperties.datadog}} + {{#if customProperties.datadog.values}} + {{#with customProperties}} + {{#each datadog.values}} + "{{{this}}}", + {{/each}} + {{/with}} + {{/if}}{{/if}}{{/if}} + {{#each tags}} + "{{{this}}}", + {{/each}} + "action:{{verbKind}}", + {{#unless formVariables.hideMemberDetails }}"member:{{member.email}}",{{/unless}} + "kind:{{kind}}" + ], + "source_type_name": "launchdarkly" +} diff --git a/sample-context/environment/create.json b/sample-context/environment/create.json index 56237e46..c7b9ea53 100644 --- a/sample-context/environment/create.json +++ b/sample-context/environment/create.json @@ -85,6 +85,7 @@ "type": "text/html" } }, - "name": "Local dev" + "name": "Local dev", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/environment/delete.json b/sample-context/environment/delete.json index 9ea47aea..a56adc0b 100644 --- a/sample-context/environment/delete.json +++ b/sample-context/environment/delete.json @@ -85,6 +85,7 @@ "type": "text/html" } }, - "name": "Local dev" + "name": "Local dev", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/environment/update.json b/sample-context/environment/update.json index ff6ba419..9a1fca51 100644 --- a/sample-context/environment/update.json +++ b/sample-context/environment/update.json @@ -85,6 +85,7 @@ "type": "text/html" } }, - "name": "Local dev" + "name": "Local dev", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/flag/archive.json b/sample-context/flag/archive.json index 94d95a99..3f7bbe29 100644 --- a/sample-context/flag/archive.json +++ b/sample-context/flag/archive.json @@ -86,6 +86,7 @@ "type": "text/html" } }, - "name": "A brand new flag" + "name": "A brand new flag", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/flag/copy.json b/sample-context/flag/copy.json index 7d5fde56..99ec1b2b 100644 --- a/sample-context/flag/copy.json +++ b/sample-context/flag/copy.json @@ -86,6 +86,7 @@ "type": "text/html" } }, - "name": "Demo flag" + "name": "Demo flag", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/flag/create.json b/sample-context/flag/create.json index 1645effe..1a50b69f 100644 --- a/sample-context/flag/create.json +++ b/sample-context/flag/create.json @@ -85,6 +85,7 @@ "type": "text/html" } }, - "name": "A brand new flag" + "name": "A brand new flag", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/flag/targeting-rule-update.json b/sample-context/flag/targeting-rule-update.json index 049a26d1..683248a0 100644 --- a/sample-context/flag/targeting-rule-update.json +++ b/sample-context/flag/targeting-rule-update.json @@ -100,6 +100,7 @@ "type": "text/html" } }, - "name": "Demo flag" + "name": "Demo flag", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/flag/toggle.json b/sample-context/flag/toggle.json index 7fd51cba..8babd763 100644 --- a/sample-context/flag/toggle.json +++ b/sample-context/flag/toggle.json @@ -100,6 +100,7 @@ "type": "text/html" } }, - "name": "Demo flag" + "name": "Demo flag", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/flag/update-all-environments.json b/sample-context/flag/update-all-environments.json index 5b535ebc..8d8f4ef9 100644 --- a/sample-context/flag/update-all-environments.json +++ b/sample-context/flag/update-all-environments.json @@ -100,6 +100,7 @@ "type": "text/html" } }, - "name": "Demo flag" + "name": "Demo flag", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/member/update.json b/sample-context/member/update.json new file mode 100644 index 00000000..231a7b38 --- /dev/null +++ b/sample-context/member/update.json @@ -0,0 +1,90 @@ +{ + "_links": { + "canonical": { + "href": "http://localhost/api/v2/members/6241dc4740fba70b235672b5", + "type": "application/json" + }, + "details": { + "href": "http://localhost/settings/history/62445f5140fba7f67892484a/details", + "type": "text/html" + }, + "parent": { + "href": "http://localhost/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "http://localhost/api/v2/auditlog/62445f5140fba7f67892484a", + "type": "application/json" + }, + "site": { + "href": "http://localhost/settings/members/6241dc4740fba70b235672b5/permissions", + "type": "text/html" + } + }, + "baseURL": "http://localhost", + "_id": "62445f5140fba7f67892484a", + "_accountId": "569f514156e003339cfd3917", + "timestamp": { + "milliseconds": 1648648017342, + "seconds": 1648648017, + "rfc3339": "2022-03-30T13:46:57Z", + "simple": "2022-03-30 13:46:57" + }, + "kind": "member", + "name": "ffeldberg+testtest@launchdarkly.com", + "details": { + "plainText": "Changed the role from 'writer' to 'reader'", + "markdown": "* Changed the role from ~~`writer`~~ to `reader`\n", + "html": "\u003cul\u003e\u003cli\u003eChanged the role from \u003cstrike\u003e\u003ccode\u003ewriter\u003c/code\u003e\u003c/strike\u003e to \u003ccode\u003ereader\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e" + }, + "project": { + "name": "", + "key": "", + "tags": null, + "environment": { + "name": "", + "key": "", + "tags": null + } + }, + "tags": null, + "member": { + "_links": { + "parent": { + "href": "http://localhost/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "http://localhost/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@launchdarkly.com", + "emailLocalPart": "testing", + "firstName": "", + "lastName": "", + "displayName": "testing@launchdarkly.com" + }, + "titleVerb": "updated the member", + "verbKind": "updateRole", + "title": { + "plainText": "testing@launchdarkly.com updated the member ffeldberg+testtest@launchdarkly.com", + "markdown": "[testing@launchdarkly.com](mailto:testing@launchdarkly.com) updated the member [ffeldberg+testtest@launchdarkly.com](http://localhost/settings/members/6241dc4740fba70b235672b5/permissions)", + "html": "\u003ca href=\"mailto:testing@launchdarkly.com\"\u003etesting@launchdarkly.com\u003c/a\u003e updated the member \u003ca href=\"http://localhost/settings/members/6241dc4740fba70b235672b5/permissions\"\u003effeldberg+testtest@launchdarkly.com\u003c/a\u003e" + }, + "target": { + "_links": { + "canonical": { + "href": "http://localhost/api/v2/members/6241dc4740fba70b235672b5", + "type": "application/json" + }, + "site": { + "href": "http://localhost/settings/members/6241dc4740fba70b235672b5/permissions", + "type": "text/html" + } + }, + "name": "ffeldberg+testtest@launchdarkly.com", + "_id": "6241dc4740fba70b235672b5" + } +} diff --git a/sample-context/other/metric.create.json b/sample-context/other/metric.create.json index 56deb899..d8f9ce7b 100644 --- a/sample-context/other/metric.create.json +++ b/sample-context/other/metric.create.json @@ -77,6 +77,7 @@ "type": "application/json" } }, - "name": "New metric" + "name": "New metric", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/other/segment.create.json b/sample-context/other/segment.create.json index 12a41c79..71c79f00 100644 --- a/sample-context/other/segment.create.json +++ b/sample-context/other/segment.create.json @@ -77,6 +77,7 @@ "type": "text/html" } }, - "name": "New segment" + "name": "New segment", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/other/segment.update.json b/sample-context/other/segment.update.json index ca187605..19100840 100644 --- a/sample-context/other/segment.update.json +++ b/sample-context/other/segment.update.json @@ -78,6 +78,7 @@ "type": "text/html" } }, - "name": "New segment" + "name": "New segment", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/other/webhook.enable.json b/sample-context/other/webhook.enable.json index a43f8296..0acb0401 100644 --- a/sample-context/other/webhook.enable.json +++ b/sample-context/other/webhook.enable.json @@ -84,6 +84,7 @@ "type": "text/html" } }, - "name": "Test webhook" + "name": "Test webhook", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/project/create.json b/sample-context/project/create.json index aa2a6b5e..4df031a1 100644 --- a/sample-context/project/create.json +++ b/sample-context/project/create.json @@ -85,6 +85,7 @@ "type": "text/html" } }, - "name": "A new project" + "name": "A new project", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/project/delete.json b/sample-context/project/delete.json index 53a96358..d6e05ef2 100644 --- a/sample-context/project/delete.json +++ b/sample-context/project/delete.json @@ -85,6 +85,7 @@ "type": "text/html" } }, - "name": "A new project" + "name": "A new project", + "_id": "5e38c13206121d8aaf10000c" } } diff --git a/sample-context/project/update.json b/sample-context/project/update.json index bd1e3201..aeb0fefa 100644 --- a/sample-context/project/update.json +++ b/sample-context/project/update.json @@ -85,6 +85,7 @@ "type": "text/html" } }, - "name": "The big project" + "name": "The big project", + "_id": "5e38c13206121d8aaf10000c" } } From 3ebc581c54e1ae0476565632eb9f01b9212d7244 Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Wed, 6 Apr 2022 09:42:24 -0400 Subject: [PATCH 516/936] remove triggers from EAP --- docs/capabilities.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index 71bc540d..bfb8181f 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -210,8 +210,6 @@ Alternatively, to produce a sample `curl` command, run `npm run curl $INTEGRATIO ## Trigger (`trigger`) -**LaunchDarkly's trigger functionality is only available to customers who have opted in to an Early Access Program (EAP). To access to this feature, [join the EAP](https://launchdarkly.com/eap).** - The trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. By default, the trigger URL contains a globally unique path parameter to provide security in the form of an [unguessable URL](https://www.schneier.com/blog/archives/2015/07/googles_unguess.html). The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. From 8e507854e408b3c243cc04873daa2fe9e67c76ed Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 6 Apr 2022 17:37:11 +0100 Subject: [PATCH 517/936] [sc-139170] Document flag link capability (#337) * Remove unnecessary line breaks * Trim trailing whitespace * Remove flag link stub * Begin documenting flagLink capability * Update docs/capabilities.md Co-authored-by: Isabelle Miller * Update docs/capabilities.md Co-authored-by: Isabelle Miller * Update docs/capabilities.md Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> * Update docs/capabilities.md Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> * Update UI block element to be more accurate * Add image * Remove table * PR feedback Co-authored-by: Isabelle Miller Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> --- docs/assets/flag links.png | Bin 0 -> 83317 bytes docs/capabilities.md | 91 +++++++++++++++++++++++++++++ manifest.schema.d.ts | 4 +- manifest.schema.json | 4 +- schemas/capabilities/flagLink.json | 4 +- 5 files changed, 97 insertions(+), 6 deletions(-) create mode 100644 docs/assets/flag links.png diff --git a/docs/assets/flag links.png b/docs/assets/flag links.png new file mode 100644 index 0000000000000000000000000000000000000000..20f52a8bc999592b62d743b2317361345f064e09 GIT binary patch literal 83317 zcmdpd1zQ|jwl?nW1cxBO8g~iMKyU~yL4!-Ma~rOLb!aK0daxrZYCMvl^zFpeG<$vdU%g=EXG$K^-{+=+upkN1nVu2mqIgpvCsnIAo zEMFNZ>|iZMRx8PduTNiJHNRfKbC5$R<8;0AA_kytxB_#|-cIU4DZ7NNy%p8u==+3Z z{UII(TO-P05w3$`E6G7>tKTG#W&!CC+K=9;X_5tnlfb`J%x^5yPcZlcj9-zO~-j3w8S2#Fn#H zp)ap2+UXaA!XwzUs0E$zVd`RIr;1Xp#Rzd`zk*{n zgX_)PVU9fUBI9}44mI+UQUgkii;P8Hj=&@zZT%!iTUJN@qFE`1akeZH9QHv!^h|$TBxw0{ zj5v}nObi2L)&W^8+6?#w$WFw}+Xcu(r0nB%0^Jj<6WD%LZh{W@t1HC5u~=lHJHv&r z>+Kl+bE@s1aiK8wU~^xLhs;%?g>ovOYNgM&CtHyzJdO}y!`|atK-n5X$@|e(!pHo? z2g4X(`ArjJ2lg7mGawWg(#)eUcCuC?PWuP0BUwPx|0K4D)`On= z$zo5z@DmCQ9r6>A4Mq$LBkw)e2NI5;5lWH)Y-90NWhguZNpWOljwFO|D*jp`9r$E% zQ)Sv(lJB7y68&E}f6*2rHltpP1^&|AM~w;?tVAfq%;@Gcq#Fs4*suVTXCmzV47SH^ zB`^20UWc{k^g?KdSqs2FLj@DTE5F4fGYzViWLL3K<7325j!4K$$&*#yDSo3y^BsLA zyxIR_u6~|KewD?WFaGtCo_T>2>=xt#h;4Xn1fRmoC3y44zk+ffe@X105}`<8ngpKz zv}Zd{|gFeGZZnb(h``3ISfJXqcfbUimbG*60B61ceTN+rx1+l z-l%op;RERL#Y7JG;&0V&VXP}|m2V-~Lsow))haecm{L#VIn(*h-SeI5-Qiu)9d^K* z&Zu=UB>FRCRAdq)Ph{JmA3@MvNGe$tVpr5sxKrUwVfZ~#o9>&in}RsupXD9tN2$U; z49nnullT_-O=QxXBiTm5EHQDw@xtRm#8L2`^`0zPoW1DoBhI^~r0XP)A?+cWA$t5T z5m_kG!4=i=1+oR&JIzB(>H*)=8RcBst-e|{{Z^Uz@f|ROWVLH$!(G1kv5v8B%c{+) z`!|;h;{9j)!N zoGbF4o}9Uu!LdlT;I>?ue8?O9h4E|b*Xp;Gyk}*^GLte+X?g?mqA~ZZ)aEzM+08;L zI4d;Gw^xS3)@>i!Bt1N@ny*5x(XRrpXdjlY$A5Ql<&xaJ`9@;H&S%PI@qzP-2ani} zUC8z>^Xs4?I|ng-lv5NHjc~ppP1A&3zFj`H3F;QnR&t+0AErVWoqVENA`2ZEokU?s zVU0Xt22a{5CrujrXpq^`h`^}G7u~e}^a>sjyRX?-)6Ob}T8m1sp-k0P)ksxoRjXxi zow1Io)^TOC8M|}i3lTU2no`^+$hJ=Q+DD#) z9?dZ|WA$Qb$SZ_xg*k<8Jw-As*;Uz`PDgwICV=ueJ3ugRx8TAfJt#Of9&@g!Z?CE% z9I)0fd;4xUB6&>Ur^k-@DgCwJ?rr>Wr+$~+t@J(Oed?VXqB5*83?nQ#{2RnVcpf+m z_$D|O6f4X=xKIQT%E`{Y6FAdjOgT(-MkWUqiq8jb@D|E94AFz%I+o&FVqD-TN z3TZUBdEV8F+?Ztg>Sb!3$!;5Doxg-@oF1G zjT>M?ZiQXXpo6R9852r+YH?{Jc=KbW;!%+(t5~4K-Ld=KW=WoEei5n?W`o?KLAH$G z)LK>U*2}_O4e$6U|D3nT)l)C3KjD~bwSbbrRWo=qp}$}&H9b|gyiwos#PLAjCSw@X z-~6d1qoVnfZQHI-S(&-nc*&v2-1zcYhr?c)bRwpD>f)m7rGOBMLzRnckP+jrS4EY-cfPrFunEo-1?W?T^s0Yl$YR@DiYVWJ^tMoO~ux3Z=jrR&So+#Iu)Pvd8@uJ(}=}nuP z&l)=^`_sO}Y-oHeZBDJ|jJKK3$rH})&cTNl&E>fWkjC0#d#H~u+ZS#D#tqq~t$ZjH z6+Ui!zlO)SCO&AWMQ*4tC;Hvr4*qoQ@O{Wn^x0``{k`~pi#t#~_b^y7^JHOPXk={> zDPhhfA7SPPWlCOgw7(~A0a-tya(qdOjcJ$ImCD42TJw;Wme!Gy?wFzOU6t5P!^FLO zN()+m$rVT?BP4n#+Z%Q~<4sSyex2T0V^P*PBYad+;36i)O){y2__-RUS~6w|3Q&xY zG7=PYs3jB}qy!B)-#|_%DA^CrDj_2S`BgP> zG&QwzvH&?_#ml8Zs+zM@({k2QkQXok*|Hja1{s^Of^F^p5P=c`3qXptrp`u`U|SnI zCjqc9^*^2vfRz8Z44|g`$0N?x!qi#{%9IiyM^j23RyI~PY7rDlN=hNe&t?K2fl~h? z4*5@*+QQk{UH|}ab8};L<75RnngiJR`S}5C8~_du7RVDUPVRQjMqm~@Cz^j&@~?V; zrcNe~miEq;AUn!G>NPS3xi||`Q~%M>pMU@CrzzO--!0iW{m-x<0|fkW2f)tC2KcjX zh^WvXR|S+U!KOCaKucSQdLV6xaPx5r{p0z+-1&El{~@XMZ%KA`PTv0%{f}G!TU6c2 z)KLOt3u)6?MA0HBLV!OfO$5afS_caX>OGVU zP)rRBeUycq89hVNpF=E{WFhgby6!ZCN9OCKe(jHMlZD=oi4g3m^}TwH^UVp)wYi-zn~mHF=ZufE-F_PLTs`$%z0AH89Cu%hQXiA2gQ2GU zyQ5MccR;Vgsc0nJ4=L>L4loRkgBlj_J>1_Mxp-J{VX7#s3DpdLS2yJ!q6mK@2dV7; zKhd3LJ|;V~iuPpF#14H^RUfTOUh{12z-Hp!tYmSD(-OiOn_t2UH~mlQ8bz)lZI3eb z+@-pXi&|^#&tgV%43Yl0zyC-nQ z^=0X|!%H3i_fyYf**6pY6uPwZcx^(irRcZ|_OIbWdn?T(rL~{rnq}2} zQ`FlogB&#-nR{~4WgIs75&Ux6H(OWgyUu8jOUU9G>Z6sVHZ`maVk~o-wS(X;e9;mSFazW+ZDF|FlA#4-Oukf-zus{ zo(U_P=R}41Lt|&#VMFvs=};fBM!DV?|M@F#Y6T1LaOH)iUdcPv_L?l$#ff7I8AFAS zRUjmC-*nstK0)$ctN|qn8X6pW3Gqo zPZvLe+@lSMv>c9Ko-P4D)U6Na=^_bO98GzrzN?ks=n_0v8+O8^&P6+&Ln?js;{PeP zt4YsgyVY7^sPv$RT7$M^^@BTGLR(wA-ud98Zd>D52#}8uQu)w z;Lr8Ve{=LHM=|qYQE=ErFN<;uF2);kpfaO^@l=w~(ec$po5xkY-d3BY`^9xh&qtfz zdgAR=wi`L$mccl-irLsmHMH>1QdCZj?LgZCkJs6ksiS4#;W4W$OT^QhgP5AhH#`HC z4XY#dS#E=sf&wXS*Tr8-&}m-n-e3$CZ$+Vxe3 z!>`8=8!RzHl^BG(+wj=?F(OR1-!ndj>^k|l%3QQ^SJae9-driI^?72 zHhCo*_`V#J^rly|zbxL&o5U`shdpxd?o{1WKmJg&q>%tNT_wobRJ7e(>29=DAC|W) zw%83}!$2F4v1GjvX24wC;VOBY67-M-g}D;e)^%f8lL~h68u*$#KVsIR;4|_~l(c?w zx>nby&|jHqA>elqukN{$$KW5T_yaA*AZnE zhyG(@lhVy7@0!k3VQBv>r)`N*H^R+Ut)+gC_wl$7!? z*dGtqzZZJkR_n;zmOJfQH#{;#UqK{n_PMV?Ypb5erl|%F=}ayBbEMecK^-qVPP^mT zpe+f^I*7@9V7C9XJDOoWRiw~>uZTqQtE1vo*y0RJ;+q(F$t=V6Xg9;|?EYyZv}6qR z$YIZ=F3bCNMz4ej`U15mUvjRM+jy(j&8EGU7aJ*1kZ~v#(s1k-RLt#H*(tQq}HruN)I0yXe6^EDF`j ztazTV>8G#8JMVUqxc9ammTx-y7iODG_?Mhg<-3P>TO&0Vk^4)lj~fOnzhaiv4vjf% z4u&#;vCZ!Wm>(~1xuwC|;mm@A3KLc?Ui?l}I!`x|scHPjR3%gqq%LZa-ws7zy%H2M z?_#cxr-pahzIzLrMxeV=LkD!yHRADSTpZ&a&Q-*k3IO6fPg~X$Fg-gX>BHch^z>52 z+|cc-%y=3G4SX!SLsnAddhWNU#-BVkH|;Zho*$P!!6JfH=)aWEXOr&qrWoC#ol}op z0$MF@F@1m89WTFY)-FGt`M#qu@S#ICS)nbgGvspFxkN{|;ylDiJNgZ`&50hN&EUeU z!=b)?zs>TUaz~8spz(bV&xf-edR|GZ{kTr{*f(RhVTB51l99WsG$jVF&^MEECZ#ha zMR#r3x{D1R^Qa*%xAjE|3K4ci8oN4t5J8 z+iqVT6-zBorXCN9(p?`8iukF@+nz6m0j^V{WGhv=d{ssD!UCJ@O9RL*w-_Y9iA7)T za6>}lM2R;|7e@bQV+Fq_iaI~?+a zMm){VS#h`h4Ws}v9MvdkE;N}ZT~2+=)Hk+OWZEliE9LLf&`tL~2oS9?*pW5k)zcR# z@RRtZU${M8u5PVB?XV`|0PTw@vj3jmwd_pQ&uX^VGK_}P>l%BGM^3Y*|a)9xD@auVXlZfl0sv+_=+{c5?TM@wMo>zw=cIy4@4P)Tq6Q?N@# zQ;FtOkx~O^CR9RdH1VY)GhmzP%&?<7gDV`F&$rR?6Oz>9QBABUz417y^DnWR8BOa# z^Ulfxt5_nwEay#Ro&{v?&YM-wiZs9O>O>`h2}4<|y_`=%U!(OZ&0yXlO2~IFA$DID ziv>Qg`qn(34kps;9%>YM#4;3`);X@3{&lA)$ao*_zNxqDdYs0Wqd4X|C7*dan$;AD ztEu~(M+?jlyDh5)WEQJV^;VSV@*;}p1K{f@*DGI-_)`BYV?sZzHs%m=j>>AKI+jhIWy|ZPe^4lrUgxU%GX|8s z+`Z4V7hKbS(h|Il<1=QTP12fmu%#q2TIX}Xf#_N%x%Hirt5olR;}C5;9+BK@ARNb_ z#ZrmeX35qmfSz-dem*5WjfGjFHjVd`m!6diDFgf!;e4+%l-yBhHWL#xtwMYMOL%(@E9cd%M(MoGwdl_@^TSz}|?+rh& zyaLQDxdo$M+$hBm(Fga1)4V*EaJmT8q4%g6xh?u)tCby#+Y_K(8YkHIi$2H4Dql)? zr(7&0vPpH=AdmrM3?<33=TUYwwVk$z@7+ysILW_e;qk!wm#CrA2b+N%n;tvFb|vY% z!b)knCnDY0Y}#DS2tTN&P?UYt;^~l|TH*sJn%P*&_t9XlATT$f%A?ndP?|n{$K~ns zBdyL$_mvIFmhml`%ic%tIxVMO1v{TK&WpObjE~n-r8Y}0{iNm$tu86eXRMt_0bUdQ zJ5OtFqGn6BZl4#%&^gMC+V+V<%0_!r?-y^D+}5~JalC#QbYx?0lN6r5oqu~ky~-Nw zCX*%t^xHzlrQ2P6xn1*VSkaTuG6Ww@muD?;B7ul|B7amg4%C(Ym%vd!0#bhcz`5#)M}~5bdm*7v_?fO2vxZU{M}f zrRw&0{Jaa6-G^PN@cnkP^_y$G{0 z8Ysp1)6-#(gU8*@9O*>J@uA(J@x+rYkC|Qyi&K^3ypKu*FY}&@*QEU1Q0g$YF5`WJ zM!NU8Lj9<-YF_}^j8HcM<}lCZK2{Gn4%JW3Cpt0I<*0u0OunnWJl%+|j9I(h>@^M} zr`3C3mvGqZR!GR<4Vk@P+r#f4KFyeq?9W9eMPrt|vhNJaTQ4&=ShRPZ&->ah7-hDr zQ~TRDr>I5cwKw0u$7bz^AT}SUDhWS3%g5dA=f{?T)?Owcj!6vCM7}vdaCbld=$8a0 zI}qcAkHGb)s{hVJF^9byVDg3l^m)-G_0y9_3MR2fETJS47U|6`Q{*~@KA=_D>S{mr z>3nd`godJlaOKo6%&=85(gjS@cDHG<Nw~529H0yRPzV^JuPL^LboU z&CkA3J>r{FQ4-D?&SzM0uFd*ONd5Ccg0gB@4tcjich7M)-#6v(X%{>{y%5u&x+C9W zIl(ox`p7n{C<+SZSLlQf8Z8qe^Z8I1?I}1M1FGvH_ok%3J1Akd^vI|ysS(S8ICMo)TTDd!Kp7n7oTt)llY=HFZ zt_|-etKXQ`h4ERgj)mw=fF%ULc(pGeZ;c=DI$tC)I8n<=5Z#S;0??+-XPveH= z)q==a+M4Mmjw~M?Yl>~Y8J|+?$!)gB9))hJwU>|m?X6_)z^OXdjpGk+bEZR>Rjzi8 z8v=lb9?-y#)=<&2T$jcRE5OGjrqqMA1pJOqSGPYZ+IP1)*Q2`(DxH=xx8O2UPFS?A zk4kIC?ESx-y21>KhRjXuq&Bq*P{ENLz~Kiamb*Elwmghy3peYoG`l#lFzv@?*tJd| zta&$Nh~Iuu3YZHraOgFy+CD2z-`%{|``welOjwuEV2Mq_5Pu%wI9BGCBQn-q^nI^! z3qz1@k!z!x$8L?v4YO{T^>m%M*10qOd@TO2NJx@C4DlEfWtFEiat>}b=a@gG5!+e^ zVY#E26K513M|jjc|AakNknIMu=ItKtarJDqTEBty79MI!<2!@b=Y}C3H_&Rt7gVRs zaX`;@`svt#*X_-BY(=jKyB5QE)UZ}$ed38WC*S@j9I{XqR=R%g=M_9EjVF%!|*g49UGbSU{3BxlwDrk8cIR*2sXE#sPSw0U^p2SB4T zbeXBA$g5*$j9+-FI_oEwhfTd_cfx|7-3|*e&D?3jgp%~GUfCFRmHv0lHLJ2Yi;5Ob z<)OcBtB@B1JSa?{XqJT_jsl5>tEisf8ts19sWS6NRwR9{^H&LqdkVV z(BXW+aK$TsRm~sRRW2XWhn{yBLjoaxUq4=gA23rKX8PoB$4;$G3ioys57CrN;x9hq zKV||&<~_9{6||Mx|Is-N$mk;it7EACe)Pd_DY1*mc5rL4gZRVDm{4F#X_MQqEqMEnwkN>)n|6^);#UNvIP@ZM~KQO>J zxFJGE-@lbMP524Ht85plP3yhx9d)aWgH6rNA1_BnM*avg9S1Jc|}IfaxSA&9OatCZ^%}kZZYA z*6YI`Y9-X{MZoge5SL##*bZi+Urb{~9xP-hA%I&YH)vI8hexuCV|%AKKc*TMQ;2Q+ zt?%=-rsw|G&{FLhGuHvC(CsE~AKqMQB3`>p@2B(rzN(uAa|*%DFdCcGPp&dwrpHBJ zZDNIQ(w^_OV(TH%wDwkC^zpQ+Qk`;V&*|Omn(q?C_uh!@Jb%M&^_fMdwi4oR_krF# zDrAd1?9(iHp0*ta;VOo)0Ac{A?T_UOX>6UW?RUmY9*1R-TXBcmM4*o6`nKCuPuKgM z)TI<%yC%h$ufYGcuu-H92NP)PA*N-?c}fA@h>lF+?0zrDw^XOjs{Xu>q^Ksc9@`%V zn*lqgq6q@7RT_1FG~=V8$=3pA#-&0YDxlqbx>*8=oH}hyFfRCqt$@c2A|mp&&d zlzLqMz8PYw(5ldHv)TXk6}dNYT;y>Cl_!jS$)+YczQa7*y{|8d*n~zZN-L5*ZzkP5 z+wu=w4l-h*%pC6^qE~ z&goaK>avjFU})dWH%f$JgcQf^SEv>#QpJ*t(Ce{^@7nMYxKi@7p#U3{wmiyqZa=R@%gwFiX9FG(O@4}fhZY8atI`9Qq~h;3GHs0YoH;3^i4x{Hqi+T(VHy<)4G6x z3xGej{ykfESfqzx8lf(EtI!>6f#EdzdU2stX9; zf8nwH-HWw3`OUhb{oy;IAOttVTyp3qd*&)q61jg{wnE6Fv&{qxmkEZr`t1fmNVwda zJ@$5?9~H$X3hJSyIgYmVi>h5^w4|WDD?i&_hOKKX~k{rn5I{H>KW2WZ+D|F^SDYv zMtX9E;gZ^v@>$@`@YzZui6tM11FzN$4U4dS0i+(aCl50?NNGEmDtdfpfn;jG!v_`~ z{7;k0BM&pD?^zb>lKws4YeJInp2w!zzaQ)&;uO-5#l5-=jpV3mIgL?dmr#39~PXrT8kwxIr{2WN-4^DW5k2JvG$N^CKbc#mLI%&M zUB|QQT2<^WDhQ{CNJtY46N?LrI@{y-JHfq7CmanO=d&i6w0`g)ZR%YbEfRt}O;;oh zz!TD~qb^jy6+Q+bfxkb>MUtvw6`_F_d&Nqb)y#L-!?K14sP1zT&H|Lkz8{_4uz*ZD zg)euFJm-&aA zD&VXcVqCqwD1!(Y-!MjJ3wti2^Dbk_r2>R37yv!+d0v#x4z^+JLD*>z0jR8JPYm>7 z>Uy_6&kydMgP__613t{2Jm(?uep8({{)O0~V50n=IX({uJTAYdEhga~L?D}t=R-*m zZpy|TT$3n{uv(X^dl}{u?c>u~Am%5wW6MDePcgKw=l+P~&Z?Jv6%91lkl3Rvqdu+m zYupuFo%p}Ezsa}nePJrx1d76=d|=7M7ZZ?J4u}BnsqE;U{hgx~d0?Y!eJ8o$!XaS$ zTK|c>TTXyoe^a;LjTgt`VMWIi$=8H3z<}f8VXG;lHfaWsoOgqd!spKD?#p3f?FY_e zUW^@TeI(>?X8qRr{yF51xgC0M;Dh>o6$F`G7>K8FI=+C|&&Sk@Z5=H?iX>Gy;UQjM zGC|j?xsaC!T~M34A6}##VW#*1Mc;LS5J5xo2g5D<1h@+Yo?Zl%z}yxU8Xr`0yv8CU zNM7fh91ko96xJ$+QV|J94s;Bq+Rk+pxfq}cDMC;U%Yz_*0C$)4E+RB+D6u_=h0~Q| zKv_D2Y=H(3w#pm(`-r!Kt1vE;GW6~hXvV`f?f1JA5Zcz5f>IP|UM3A3+}83tF8LhU z&yZO-kIbi5%sbW!@qCNV3EC6ie<$0W7#`zwwTwCxY2Cw(?EbA9c`hlGs7rntoIzl$ zGN0{ow%xa86iOC#wH~3uen!AXUV4Tx_p8GBb&|z1iBQcFuDdu?El0%rsJ!I_Wf1@F zvX@ZW6T3)i^v!BFgSxm-W=9$q|J-!b{*8NCtX;yOHp(tlzjTLGIVm@?xq(3_T z+as+Efda68o$~C(*DReOH-?JieKX+@%PT};HlBTKU@SfmWLR55U?LjYWfl)@ z&D(@FZ+s=+2X9iQ?HT&o2Z}@SH(zbZKjj<=dQ;uxui+l!cB1gKUeQ{i`8nBzuMWtO z!xZg{YORJM5Qn%3{m4Qctn09(HfW8Gcq9Ajkqt9Yb)yHuBoF8K+@ak^tKE#AGjhtEi9%TtA%A`@cFKpk% zk;#X3yWh~~*`aKA&>?w>dC@8So}bnWHN-;dK9@N}1o;-lJ>Qpz8Gox%LB=Pgm>z@B zPt%%|5((om(C(W&N#t5KNm?j< z#bb=`2Q~#vb?*3nc>z;QF`SKkNaQ?3yB?VKEiQ; z0W&9@x#Idr0{Hxy2BvfPoyy{bDTVi4{Ah;YI071}p)J6|I`EYIb0h)l1&oz*%URY? zV(Z2|UR!F3SAIwLjn~CGUBx-UWS7ESg{TwLR^}X`f&2|-K5*{?ykc|s5d;ZS(#8z( z=0haM7@XW7+K#?dNb*ggUE(E`$oX?M7Q{k%qe>lb2_u6~E>pBxoARYd!c4)n2JSn_ z?cT(#tqU==kksMH6896`r^Qlm^dAVYh#D;Q7-SI+TdiTBW}kzrr4c)cdp;w;4qI6B z*e*_=L1DVS-0wX?EBl0Qi9BCTwU>>`BX-I3U}|k1P?#yR$@yC<8-<8{NNt@YeCv(y z@_~~qe~Mh_d5|}7rM8m|!9hvzxK?lQ*Pi8UX*w;ci`Wv{_|xaUTpzJ0u1iiAmI{;g z*7sp3<(zY2@ASc}@PRansAyxVuKP?iwr4gdb1^=A-lk@64TF;RXUlXy^ck28bwUi_ zsk!Pp6n5*the$`@YZ@=nC0SLFb-!*hdrG`nW$TdUJZptgIXBElwjm;Sq1`l-r|W`c zUx**)!+rmG7JgN%^Q7fe#CIHc4TZ4O;(UO^bH2g#kv+y%E5JZ@8aK47cQkWAS!N4e zl5e%qLQNiA2rPp6TIxWP&!bw5<*^FhLhta*i@~K$d_;s#N1==VYWOkioG-iq zODipcu0zVu$hi5e{vBg~F+6)DhBe2QKNdg@*g!iDj>%2pP=6=i8DXb7f2tzM`AuC} zKfD|ppJs=8qICh-kKvx{r5vt;tjxnev%&p4ytRAsohKMC4;wst3~dR$B{IP)aXr@2;O`WEgAtaB@tBAyl!)}}`Db8v_wPCp-K@n$ z*4BM-Ptzl&7cu8CesfPT=aID3=PT{qvhuS>6+6%CBh#E_*%tA86rb(fL$XiC zG;H5o4hm8mExiEu)=>|uKirf=FD6?wK{+`s2&<+!UQgjJ9h`ecbv?rK6-V~Tnj7y3 zHJuxmJtrLAucFND+>~b@M&J)WCrJmD09_$zk%dS=>;A>Z6*ABEPfnvVvzx^PKB_@k zx`J!F>7TA9z@8=fU#xKej_XN$=! z-iEzLd%Fq=??UL2^ANN2#c`v^1ZN}ZzWMj_9~+vnV|fPov-UtgPz!rpeQ+k~h>F9m z?X-;LOjAH4XAkyweK14A!|e}JS`0!X!p%t(!Sxotq2Tx&Mq$_+nB}92m7YNEd>w)H z+wa*hNZJ3Fcut}E4~;%l!+ocq7uaWhAwi;Ah0o4+s&!3R5_fW3Y?xc0rM`&0m#Ig$ zT>@4)ZT3=-q8iFuAdO{+pyrLTG%Rnnsfs_0pouAW%7vs=gz*P8g!Nq+z0Wutv!33H z?({BSfH?Sv!6ccm4EcI;K@<;BNi=XcK{EPZ0;@(LA!wAVd2e~oi*>80Zbo|DB=4^ie(h1?O3QGM$3>Bo7}+@x0YQ5yxG zxSgw(8-_0tW;5xv+E1f3_ap%q%tam6|zf!@C=)t5BWydJ4L~B~7VJx8XwO zBKPwbmWjnG0}>$tiubjtvwO?q+fjQko4$NH#lk7q$s9g8z-EAS!;hP?|gD2g2}cu za?oj0hJGyuM(FPH zK_j5XqWVbb^=r3}26lrwjL(aHM3MtU0tb~=z@h&o;KNUfO{l(VH7SU%GlX>h(||fM z1gcXP)&FfK?_Bs94w!#p5B(Y6xH?3HGSfkJy%{J;`rsc9M|$x-C#2Id;1)r@$Ez1N zlo><(aYpC?K}N`+O5_3aEOuGh1FIOST@8d@zE7Nx20-W$mcXC+nJ&55i;l1ae_ zNOK@R3T2b^6$tY@;J6`X==7y!+${ZZS%|Y8z$qN@jysGO&k^sS_&1rbPj!Q`N~iH4 zkbG7}Wql#uLKgF|3Yaa)Z$0~>Bp{Ex71F)Kq!KKSm=M9L-5!{WwQ7U!iw8twBx9Ui zmm=&KZGQNqteArKAc{SnFkGo@>=e{3N5kFRf`SUqPzwp+mlvATqkA3Eqw1B{Ok?P;oETqZ2li1;r zhOLEZh_+AH12JNb10#2}_J{++F3+VYmMn{M2riGTApC)%0NxKt>K#$C7lF5;XH&)C zO2?n#m6Hl`J@ruXE_2Fvw$p0CYDUhv7SF<`w?7_*0SrB+ZVknN5}oO=BX%lJ8%u&yTN z_3$lrKklUH|14z&61cQNv7(fN=OBe#-+&?*kXQi=7WX1v&qI%=AGE1)^RGVf+z)1G zdeVqrx+od4)<08YSjHm;!7b{diA-fH@SswW3f6kxD;OZEP=ae|P&S?eHRW3;l=9JI zD*enqPN$_L$Mkkwr#zog`qOuzi(^fF-mj!F>|_J46eapp+nzPc?6@b|bf^udqa<1U zBCiU#MCNhW1Ok+SZT?swKF|r)|GPbl^W?z2%f8U#}8p}fA4U^P>QX4|LR zfFuAg6RS3ZW7K6Q`cs$&k!jR{y4X)6;%BqgU@bx*sZcV*INEk1!ee(vr#>k(gWy++ zI98Jw^#qMwAZZfUaw(Rh@^W6vcU%R-LZH-60Eymr*{Ci*>X^kWiYmH^^Wr0WP9Rvk zL=oRGa*VZtAoE~ztH;wfh}W3*%ST`ksD}#0RVW|m&iLCDey5ka%NAgzro&uBjoDd} zcevF-6SUqtvE=>%IAc-2waXe69ExE|Hv!9}gS>akr^cpMC=t56<@S8qVfr$vtTrE} z3<0x#%s3m%Ok;@#geA^BK##jswLT**|6skPqf#5u=74@w8lleldX2KOEW(i^ zEqFcJP1>5ONAfp#Mmcv%%fLVfW?=hzZ)hml_ouo!ee>iM$DUMNMLrQ5@<*Tr37cUq zHbeS>+4b+4+r#SWn#^L(IV-ga?4=Yym_+CLcsI=h)+XsW<92hXN?c`|$e*aNEC9L? z?Y!A;b25sEy-O+HIF3`lr_%`@6Q|Wur!kd-Ejq}5{)uSyr#rE#DbaMnE6_$7!QVaE ziQ_cx^MPcnr1=}A{Q9v(hE?$nlyRCxeia&WV*vuunJ`z9e#}*Qc?FYtXm8rZ;WLF@ zv9WWD*NKV`TwwAX3SiQDIBo~)3$JB@D`Wm^TCq1N405QqWd*er95xNJxpKCvFGrwU zZFIU#OQp~@??j!POJ=3-leyS1A?&wKk|?3x9Es`@D>h8kt#w&ZY-~(Swn7?e!wm&s zN8C;)YN!`slEV{!#o?N%V$at~r}%JdZ0eJlVV!;u(v1w{q47>C3 zJSV=bg#uPcbl)PEKIxa6hhZ->JFo6@?G`w5bR=h_y;o^Wf$z=;dVco}!c{_ve5N0E z;O&tJZ|z${YvR$D7DX9~gwiYiZ3Of`Vy7UeK!huCX6`|vevzBTLMS#wF;U}cWc^4m zpmgQ2)z^Ga0h(Ooh_UkHq58?ec`uuw?3& zd=#!8@19XEGY+f?A-t$ps-6w9n#(c4od^h@GGDr5J1|Z3`ijB8fRcd2BV?u`_ScOZ ztL9uf=Uk8U;_8m~*fM|nIrfRnSUgAa_mlJR!<>I5nckOB|D47{_!zD$j-|gj_?F`V z3!Fe%4wo<738inuBG4Op$0yGXSw~vU&>`J7=Q(JL9F;O_jJ3A&AvX$G%x9I-pF8D5 zw7k~0DurGW$Aqht0^%`j3)iE?bFeT89~{AP+uV|ooe~d`;XqPg2G%#;-|)CGWI|3| z=2~O)mQsjx`G*&eWU_iQvc- zmRbB-ulP{l91Ur#7Y2pMGABkJIy06v)>#16BpYRno8m9neflZIqK!N0d`COB0n_Dtdm0 z>za}=8HgPVKM_gU9mRu2#xY&;8hU^H2k$yb?2D4XJ@9b#SdrfE1mto!>mrs)FA!Vu zj+J$+PUN`j$=VT&OEYj`+pxAvF-s#Ya?*=2Mn(2Rr|kRl(Q=SesJCMKo&xXc(bfi+ z<5Y>&-1p;QnLLjl;`bLR>G1~?(@1jTLYFqoD&&nVN6nGfM-#(iB74lQ8sF(ZDQ_8u zaeouuoWP#lUFPvo`|aZv(;3WVQ}ic+(|=M4s>=U{hfHA+%9#O|7*?Y-Em)C39O_tJ zobIhByL=wkX6nXuC;P$AP56;@_I|1t+W;nMUH|KROk*ro9PDA;%uo7mt9@Fna zWOfMkYi=Oa%|=M-=3E@j!2qk?B9Z2;q-4(Let%SUo%z^zhLzu*$pkKsLivKExnZrv zf@D(k&rl*Tvftd?E zuDX4|UStkE*dkoWs+0R}8+GDPMw{gD*x@`P&vHInF7TdkQb9?-r1Jr7tV4wE=%#3~ zbr2%OqUT5KUvFX`ERgU|a>N1=?tQ$|Ac1nIz04~WGtKCx@kkYl$sa2^0kWJOzG87FxZ5ZrA#sE-j`=LxguyNoiLu-u)80$>iWR*nz>XyqaQN2A zfA;3cA~=BodHE?#z@IjZN9y$f$TE(AyL{cGbVN z{ISeDKfBF?sM8seL*(zkytEWtNywL{I0?cfKO!`kUcIEg@PdR74-o%Sf>f|*lwTx_ z?G}a_0Th=vp{!+n+G_l8eR#U;J${piOwK3lv6}8$UDPr!(y%t$3ol4+jwxE*7s#Rw zW1i_Ag5GQ$=S#_+bN4M#NtP%hoCtW@dRd<3HTmwvN7T+mFFVd|uKbhUazW^FMxBQz zc5)hTn0;s1rIYlWouUxA?ZS`hHv5p&t!1jeP%M+XUW$`d|q4#g&nqW1Xk7w%} zQi+a;`^gA^it~K02WVpNuCNQw?!qZ@rH+ir$VI8boU4VV&duqho#}vH`@x?dLw3UW z!LGnSvMD7wdOPzEG&A%dLKDg_Tfd}(-@y>o;3p)1RXd>7mDZ+FASK1J01FE~>miH= z`gOO5IVC9#q3?~*2cYjDOT(JgtXtMY)@6T@ZzstNg9-STA!#BZoMZ*fT+YQn8!ntU zLgNCRKyt)$WF&h(W0YwlhQ=x`Evi!x&N5*IL6VF>zKUk0ns(PSYN{Y3q1{6O5p;hs zoHG3-4hSW|C(m2i7+E}|Qp}%KA;mzSVG)U14JY_KyR#d91FbGSqNF(bBGeo&!nv3& z;(;i9GSc@N{KVs4X3oli8Em248iz2P%B;V+7Kfiw@bJxpib4A+b5-r}TMLFiT0sZp z?YsNUuU~S!37NIl$7w1!q}|Q%=tXQ>-SUQsn!tBoL+5Z3<}sif8-K?*yITwX8E__0 z{j`BuG(Cs)2p&ZDCSUx1MHVm-@|7$sR8i%PEy-eF$!5t}0^;nRW>hXqY^qWo^ryu# z=b?jb=^`6iLEc4=+K#hD>7PRtVYrj%0SJ5Yo^=crx_k)U3X744dC_Dso%9g@A}Rdy z9D-d^zJ+h-%bQ23rS`+`Uhzsp9QSh5zDC|+rHw>{Z$YLyJ@1gPj%ohLf*%I_OeQO@ zMnET-S7Bw_0F`&1&xiFtS&uE%wHSUPRkV!w^LwwK2y%YV2AdD-CH`*m0bHSpJv_v-UPGn*m-% z?lJ5=HH7YhqcXwqFXjHp2>K(ew>0W$dKboy9$|SaA1KSEz@+{qsL{{^J6lwKI3fIJ zGbJUq`6p%dFMlGdR35yS8lZew7vIaZApWAlHu_7%G^OW{Gg#lw z5t)Mj^0oMcgU{|IK*#vyMYQ2zAE=N?qpPv;60DLkjOza3Rc}X<%~pzkIs? zyz7Tl3JaNtS!gxdcYjgLKd3#D3XtBb;HrE4+2DT_Dlw3f3=k~|_y&`iG#9H)hi&dJ zcIu6LQHICHSnYKdRp2&}Kbx891f$@W8uvzMlzgORGVp0*d^um30sUp}p|J-fDNT}V z^yFmM5&y~Lf$()${PPdvNErPgJRw~Os_=H#rWpSH9?SpkZ$Z@i@JK$n6y~a6RKgSv zn;|=GYUMH=?j`V6^zh`n1HC^d?9ajw^ZZNrKn zC{mKrs7Q!(H&W6d-6aCjoeLBsq?MBH?rxA)x)-p3MR#}eP4<5Fz4yNL`Ht`V^Zs~$ z$Z^SHUDv$EoO8@M#yHP&%1X$lq_$pzEq!|Z3$S*C1d|EO+yFKj`BJ4u%=bG%P^y#= zy$L{rYQ%_7pze&2=*s+SvG@-J-fvo^JuG z>^K&+xQC2h-iprC13(jIS@E_3e1`+V$8gV^CGH*o?b!?yMlZQKfx~N^b`m!%v<*8$ zDnL-#Ovq}YClkwBa*H0RcR8@#x&hYE2qop)yoEn88Fnmcs1ghG@g7J6H1kftg1jlo z0%&jLuq;n6C_06v!=mjcq+^*1eutio&pyDp;ECF^r$)0%Ss%^{Wgsr9-|yn4c^*zB zR|$&GGoZfcbTJ>uusNn_RRJPw^=NwS%e_Q^4gz8BN50cpZ?Hu> zFjjN}2y9#F;j*PO4Q?>d5=&4^%L*pq==(;uoOr!6OxFYdb&&1T?*e&X#d*|B&gE^W*iMfUf8_z#@ zCRR;5YMS3@J57(`z0!CWt>c z@ub-?K>kepqDnG9+JJKK8qc_HyaJ7i#d0PnN(X5&o=Q)hrH^P>#k(5w4)f0Z8HN!G zpNaoC?&S~zAl$eK=k?|QZQ=-^Ag-T$au~K?RaMR2$eoUE7h6>gD_vm1S>4h?LP&Tf zjiR;jG($Ng0gfz4jUDA~)s$_Z!|DJ(BQ;-oqe%-$iDq#6av+@wOJW1V-A%d65 z0s%FDz!lM**y|+QStv*!r(DVf#L+xZoG>RE68+e`Td6;Z)1q9OBe>Z#C`L2^0J3u@ zLYpWT7f48_$W4GP*H>0QAMkP$ymPWxN=i07b7z+^n{6jdl zSj7AcJf-0TYwctM+Q0i|eyZ{2+Kp!;zYIXlNev^b>bsh6VOQd0ka8xrZD6l50FCg` zR`keJ6jOYW9Qj`!^B-RIDe#*(byVohMhDE?*UlZ7{YX5(JGdiX1CUYG{*qm(G&0E! z?q>|{RcVgYvQQ3m9WH-_W?8-?C5BS+WAn0Jb`K_)j_ohX85ojW?6VNg7L@lrHV4d^ z3=Uh9qxaDWad`Rwa&dNHlGt@M#bv8;%(c(wl*j)G!Cl9>&*a|Uz5V)HF$6XbewOT& ze<4i0_Y{9Pi&iNcQ(O5t9BeMP)K&A<1_O1ArK0cZ$ln6W`a1ytMlVe~^q7=wFlf%k zXP^`y6VKZzsu^d*P!yYe(Mi^axxrtyK9y2N2a%)0!YQyy`N^?i?Z;lo0FmOK^;M-u{dHV#R12A_D<18v;C?*jXUWrRums`Lq%2uPLN+obR7;Jo>5jiJNOqz|vzc+uX_lXG(B62~p6~7&Yg;=D! zeoI2x3!KsmueDl*{i^x>#T9@_suMvnDZm19_VHg@05X(;%apNVmnZdICYQ(OzpZFs z+_VebLaOU!KU`m)d0_LJrVa=0W>OqW6|axx`4utkgfpVOKi!?{fF*smY-gnk8mHeQ z#Tz^{gBDr<; z%EY;)eE!kVHbFru@7%3;SU>S8M+E?ZQUsc^p^|hZ&vj>GHjm&aCJGB%YI{-m-o<=c z-p!wB)V2JwJLOXkCsu$TuZ*G3M6-(UVw;}d= z{@UvOb@6HFHF!82^A&7!uH2=y>Ej{@LfH)Dz#1-R-1oD_ zNsw$me3|)>Nz^p2pz>i|*3qxS68l%NRmE~Tk6IiNqhBO5iDAA&j3cl7Z1FfF)bH_d zN}}iW*>?^M9j-GbUMtS`jQih0eC|xFnde#jwT1ZiMRGL?j+@@XDLSYmmtG$Z%T<9D z_55Qq*hen-;OnS$hrjTE?-E(zXTr%NE^oPqpv>W?T*L1ojDsNKeDF5>g^X>%3bFxm zD&}xSi_(kFNuXymR{9bw`r^4f$PlPQpRl|yxC(zIsP{C~d6uyk6$AI$YYx&<{i}R4R?Y=__Hl@uUfbbdV0PywYs&k0>FlwSDTya>{W9)g~1#qvR@SerE46vl~IeG z2_QqASoO>k*zZ4J4dN8+!JV(!CA88pODx|BD_EeA~_o82rczy1CH0$GS zg7ZlKi)!dWM`p1=65?xgF<0kCOetSeRri(Px1#!M%;a)y=goN!LjZ_SR>M#H`_m4L z<{*7|rG;kTeO6g2ECj8c@?qKQQ)!!L$Fkf}vQK2FNG$#lM*Yo8i%O8UBK2!4M?6@L z#G9e}r4vrl#L(=$H%q=P0ScY-sw-ziayXe!GWPRN{{f>b_|C43xxhBn<_G3yhGgW! zZz5fg-Q?!F7lap-OX!rv%nbK$(dR)AABX$Se~HGrc)E$xhT;oW=p{Al)%u~24k(53 z&`J%4zwc~s{ebB01d$Dr6(DhoLCLp5#B`g#$5UkGqU7=K5%{nDB7lju^Cvv)0VT8v zM$?Uas2c)p+{P8<+xveHUi7>v<)1!9S5$t;%=f{&L6UpVfI={4gf-VdsKEPoE&$F) z!7u)ti*^ga9I`xO5_kKg>ih*8Q7}1UnQ4A!pkaPGiWL0P*7l`k_GkieC-RG+1lEsx z;s~-5gHW5lw?q(eh*Ez3Df*M8VC9?Ziy|+QEVt2e?XQ^R{!C2PtUkGKtZA`+3m85* zNb5CV+O%*zUEbBO(aCA}XXJsNcSwWa0|2NoYq}h|B?h85+|FM(e8h79uN#+iHNZ;=N2mPb zFasY`N`nyVf$kj=oj)`W^zIM^ITjU(H3-MV`8VtS<0aqtf!o_tn-cx`V`}|d*3K!y>h7Pd7lsaQza~G#{^yV7 zTR?Ohv5Pb?_xpgj9oXa~;Pyi)>3?##;N#@ax5Sh=)a2H{{|;;aXY2}cgWIPIOTc~~ z%eTJ~d~h2ax8Mu<;s0lc{&oGy9#DcL{JvFU{q?K=y!ijn@zhBP2?>3U|6AXQBqKg} zmv5`$)d@}cvjIT&lP9k!nF2kmMj7FOtJ zq@FXIL^aNxRaXf9UC=cOT))S}Y77r{@o0kxIElP`4j!#EP{fz@F?k}g2k}sNNWx;In$tZycfvDpJeWd;I`=-)jNv{<$|ws|Ie#gplvRRTA> z-OK$qZmo6M8-q{qmCxq6ZTXBg5!V;N=~w>2z_rmN!;=|&(RF_va*rCDpA185(GB}<^(DgJJavWtiX(@4f1}9m z(qY>Cpx3-^t5T|V4Wt{)o4t@!z&0Zt7O{jo=SrFDXL<=}OMR3c=NpO;se8*O0@uaT zs(3GzvcnkIJ*%(uG=A|(6$4qRI^)@jTd|h0^0m1$Ni*RIf*B~>IvfH}wPTCLtz+C< zphaC!4&0Y2`dZWO9Yo6SM><2J_0oll+v=S7<`dOEfvZiH+oYU@CNzXL zzxQH`qi(Jv4g&W4qc6>E&t{U)4OjZACN9X_^%S$NO*+Y(@{Qi%B!q?SJhDjU;XQuW zXP8*u#$Z%#;7y|wVMypb(=g2 z`2}VwCqLwg#NoO=(eCOLH>#_TtKed}vZFuzbP)3+p381C(QUgzT%7lPKi`cPan6er?(0QFQ8$r8urp=LZ2G+BleyM31DfdWxfbuY*Fa zTa_*puGNGpsF&duYM^ki$ZuxXH{tlP&T>sdMMaihg--XYZ8Yeqmg-J2$YM$aEOIn* z&XtXO_G1O%0vZvXmi#M89WYcbpqFQkTNO~)tzZFFytR9y>_Ld-bU`1x0}$4+I=t9> zRKJ>vT9A1k;hU|X>N ztr2hM^W~=Q1&t@Q4CK zaPH;rX~P}it2Hs%G8vVFgy~#`&&)iEIN-OmQM2h<s&#liF}*vOngn;JX!zsISQ%KFMM4hTk=Xjdc)H+vnRFN?ZdLSQen4#N1)D0;KiL?-D1mm@=vx>ZC-@5E!DU3I%S zT2TA02+g)1eLp+sZ)AyDz0~i35EykkvSwGq*$cI}pq6VhQYpmp0wTe1f&SR79p!z3 z2KuSE5fW!d3lzs$pQq_< z?rUFtJ#rRQX&0*P!DgX@|AMUcQ(|`WJPY*eluK5E!Ly8Cg?BGRCo*Vt=LmSAHBo#0AKx8`9j$As zxB8m7-CMe%>!x|>?A#mAH7tyK=wFhGbU{H$+z`u)U_2zux%B`?#yCh z2tQmRkhyhVp3LV^>VRs6<=rZu>{Pbd)x}W-Dok51i>JBNsfe_)pWh9}($Blm&*K`x zn8dU|wX;O1O?pKN@eq&h^wcfZ({FJUx^x^okF(u9;(#wsKA*7jAQOH&}2MWAOG{?r`;&ovuiz=|%}WL8-nz z-`FZ1O^oN&+?$PGpNu6q*$2tVh`g&re`M$kWK?8gu|9f)p* zSvIr>R!}8cdreQC;c={16;OC|XqH}34%)FO$I(u*2h5ncRJc(ufTb_ALa643`bObd zs5!R9fjG2C4i43ni?^qM%sw1w4do@=IDB?pZU$vvo@*W%B?bn^5+vNaC0eUp1TyTWnckw8hTkpBVep!0 znwQj|k=RxxaRh3rH#I^o?HTq3Gu*$Mna{tMq-Y&Ybl)s-lNI-8CAC>$y6&xV7wvM1 zciZMV{&5du!eynhBfRCqaBPuY0FAEc@(IO5NFj`qwNZyUn_}j zuAkZg$0%L2)_jjWHp@F&Sdhdje>$bu+lGJFb|oVFaGbqbO2D-WI;bluLI>336}_jYQ#q1gH4p}`3+w{caqmbH}H+)3ZRQ-4$mi$9fbwQMRVGvtIF@Jzcv z8xH#FJl^5G0om;EY4_pak~LwM(W*J_st*pi4a?h9Vq$Jn6TN_4nCr9mFzV zx$Aa5w<^Xi3OX;D#LEo)GeV9&n-n<*v~jB9?mYKFYBFZ~?=p$JT*O`39G15IcK4~j zjS`jLqs}{-b_<0wOdC(!Mc%YRz1Go_7Vf}2sxGRWvX#2gJo?%hwxL@cH5U`M{=`e| z2cKU%+;dGQ?ezFQ)W7ylsLo_ib1i(LwSt7Bl)u5vS2W`~+*X1rSJDd2zM9VL$cjC{tK|@t8vl~UXdJwRtXQ=BkD!_8j z`@U>`7MhelN)Wrb&IyE*-(rq&)_Fh(xz>1$vScF+$`Wi$vSfdL_~g2pS8mm8H-AQc z6F^tXShTq^_%p7acnl{BfRtQ5VBTMAs5*Lo289I2{w=%*gXI>mvD?ZNayAwObFJ2X z%>Xb}b}!1X6;F5^H%&m@%d~}6a^v-R`AgLkZBFF-3kw_7@;c#1S=f9WHOSv8a;n8& z!>C72fNT10+HBv?m@Esk07byc=}Oqy^?erx3rLAHv$h7>QVikZwfFSSd=a7>*i|)sHPl2PK(xgfPfEu(v3j z<~yaY+igL;G}!dn*K|_P#=g_$@Cx; zI%#v1;#g%@UY%oDTV9M7xSjB5QI*!=uLGgZaW|uZnB>%ukbU@;ec^j{kb1WbWz5%rp|>veFI;w!NGF|@%tdLwxl zWeQR?y|qV`*rUACwvtnRbG=bS%plsfx{EIsv&PA?_9ht`e7G#9Q4AtJEt?c+SKSA{!PfdYq5dkue%6@CrxAy7MX z+T4q%-^;w20KudMpEgN-7WP-T>xKnY+j5X2^TQF(AA$_WyL4;tqENSDD>H9o44e7= z7A@0I$P(_x$lm+93`KE)mAH$D9Nr*qr!Ct$c$6=r(F_0LP+sPiK>iUXpc43@H;$u> zV=5UTk+^M7PxCV+H>csp#d=OwV&$!VSeIe$1r5~KXcoC2 z&6!C}_=-5l_znrrx-#7;8_LCQjOv*Ip943E{rZL!gXvD!KE`pt#&`W+>u62P`@n}h zN$4k;icsic4we-|bMZie4Xme$IAERV(n=jYl5n`ma0{M?5nWWTxk=|3$0{(2h}=g- z=b`JgqoZTkN*d1U-F+>yh3LSvXKf#rHeC<9SY2 z0xvqPtZz^v*WPxitCRLh-y6djvj15zgqs-Hi^C!V6r`{9u+Y3t^NL# zSHOG80dD8+{8SR4>^>%V&eSww9C#72whg&t?nx&CS*mGAGh?E?)mGUa&ej!th6S|g z%(}+TTV;hw463vJ;Bl$Vc#$z6;K49E5c<3loyitx5s++*6~tNHJ91od13Cse&l|UE zH!jO)6}U5O)LHP4KUa2dRXH8qI{=%Qe&vu>t|f=2=dPBS9~6D;(~@!~`G8d7yOTPP zrzJ9V(}Sbi)oFo5{%1oKS<9W@sDmLTZ@0cE0z`s9ZsZm%zZbRs#dcMwQ$hOUT-_#} z&3P?|GO~bV2ZETijkd8;!fP+4r&6uvzrJN$bL7q;W(_2)@(Mf8>hZc~xt}B)3^_yl zxHldN$B0`0V0TJdq>4%DVy^9aLz3Vw*1sx3E>c2f!?7C1$Sj4N__4P@GijaA=39n( zY&6Th;KCQ#p0DDhb43rJsCdB9WZm?hA$|3e#fKsu`;pB&U$(Ik8P2?wQ9aH)(5oHL zZpE~^(_w#(J@GxdlMsV}H-4PVP{3=-AWk`Nx#8tyXtk#n6|EiNuKx3g9iYXUF{e^J z{RGBsRn)LWxgyg>-EE6+=Tqv>xaWg<+3EiPLzUat*+)OUv$ZakhknVMyvtrbhkye| zSi~Ev!$Fv?Juo+?ZcIuQ9=^NGy;Z&ta{Tc?PqKqb;N~QuIw>?;|uV06S5d{0r+Tcb}o}0stc|ErX z5;7F!v-;Q_%dx*Qe$HZO{Jz;hlkG{s^^DB9{xf$v{)0K$$a@( zLBk3XDyLlL;~wkbB6Qo=D%rx+9L^?4X(@fHawr~3p@ks8{ zL*JAC$t%(9WX1BT1J<_eR?K>rIMRefy`1f=Vj1;w^G(2p;oR#m-Qum-y&uPF`t9WB zA{UqrXb7S8UHGI?RJG&oa~kt&-Ya*E?no(FeJ*b`_DD2xHkx1av5{kn<(y`FQ-W5) zFR6s@LO^r9bo6LWC%EZm-!AxZ1qZr)KT9H2glIiKradMxO`g%O_czS23hgS{jfff7 z3yUTTlabt{3bg2!+xMkwE~Ki}(%ugty~2ht0TKg_(;5m9D%$uz6)-mkV=_3fmbiE6uc zo2W38wI2SA85r{cZAB0023gA@LazG3V#q(nKC2!~u~}|DG2|A?VK&xNbV_Ud0@nZY;z% zRrBSRNlSbKL!3nOMWyo8G6z+WU@VaeNXMw`N23~) zzxy#uI4YN79-CVD=DY3VATt@{FMia%)vc?E2#gY zj;mkyoc6xOFZeDE%5}XGB77oKe;I%-D?j;*ki_}p!QzL<*x%A%(UCg^vV851c8P`x zsD*Gk;de{id}oV_Gg4a-qX~Vh$IjAX!RIGiRaDLxl|4Z{yc@7$t5P?f{FU$!H%!B9 z*cmD5RDMydX~-<;)Q1|UoE;ZCjgjgZp!E?d>uVQCGaP~>{kWo1QhoE2B24h23Z^T$a@{$oAR1v~9mRFK4R~ zZ6DjTS(xhCYyT{IDqliH$C$^`T&b7oW~{pt{0YYDhZ^7bjp(I4$1yj+syPT`Ph#`J z$vjE+4<0?ZSY9Edq-BZVyT4Ab)lL-j=|Q44uVL4>(aBns{H^fydS~{2>-lHHA!%Dv z@<}pwOzMtK{RH=yj^PX^?0Xh-rg>R6v!AqU_G8i6PMqB#BuQDZY-8nY4=4NNjGL^d zOeQ|w_5P{WDVxyxqOh>*%a%WtKBmpv>5~-m$3J*J*c*6*SZ=AjG^?9pI0^wX{W;!#1zClp7xW!s2F#~ZFmOhcN3FmX6 zk^Of%cRaG(uhS^RvT*gOKXlLU<7=zpH9i{~AP}qmVMZxk;>9KX{q4a*sN%F{SM1sF zs}&q=x|eP;#y;?u)8(9x+BrxJ6Djvh#A-}Yr00HxA}IrW1GoHA_Y!dvP!iYSOlLO4 z3Hj=%!xn1BG^10k%wpj+7^>&&gEc`yx+%ViPWn^nBhlxjN2HXz%G`_2kVR)%_cf7G ziJ603;KUoUWbL!u;ZigqL^2%b31a9*{?!sF4jBBW#SOgg^WCQ3C8f^@4PHqtoJ`5dmQcDX&B7#_Ke0y6)mj zT*CE_ecM}Tj9mNvnb+!~_r6xmEq1=Xii(U(FyqKX3coSwq)t-riPSN@63TkQfR@<@ z*`4##`H7lXDe8cx=e;s&Os~g0qZEPPwwPk6?m?&9U&ga`A+PHyD<&2 zvr-LMVEI}x!-;7g3unD60g*LGgON5(-A2ph{cEfXTqG5j_V-aI`xsU|;>nI!lfERf zIcRZxQ4hG_=PhbsVXc%~lp23AXw$-ihUH(3=p4ipc3v7s3;v;xOgH%Cg&f?O3VU_V zyX3lL^k^}Nh=U%F#qX2bc{YZ?WpSLr^*3xA0muF9~e9zwp^`K=(>ub&F+kcPT8 zO|gAHCVh_9q8DS=A0sO1%L>xzo^!(t7LZ`5L~%Z8s$L8PB2q| zOG*2Pr2ojaat^%LZH-HbvJbG3E8a)8+8j!)X}%nOOh^yd0Y39ogF3T1CtTr~7|zKn z%Z0N7tF$$ob|-EE){)gizuH7@udgux9<+RcsU9N4m^p#jnO^Xcs*PChTn8YqTh_Ib z_7EKGjk0wc9iLh;*1vYPlwTe;HSxXbnqNr?dHLwOhLqML!f!&SUHxot+I_{y5YUGS zs5c^Tm&X~btysTQnKWQE6;dY}rRSVeCz{X0*Z74~PjvN*u#CRuC_dt^UqSTbwZ*#W zjvWkH&;on8#tKA20}iY-N|cw*hV#J$7SPY%KQ(Wp6y{lZUhatt+`&_WlyQq0oKEXG zXxeNPn02h1ZHu;*0=Y!~am-_kBqYc-j=exgU7cIZgZ{|YX{Ej0{FGoR5?Q)PdpcqP z=cCV%-8-HWKBzxHfG{`MdgzgfgN>IABhiM$#Z_j}@gdy84N)P3lT}!-3bU09;s(A%~A}eRARWe zAa&(>RPW@;%1)#6O#v&5^|*b=PWvZv_WTrU_OJTU%wPJ!3F}CCfichK@{3gRuFh64($r9-m;@oW*QZgv}hI|{1WUr>LAhBv@b9HLsfq#&NVqMgY zdn--x&8r&*C@k|bfb|9|Ek!(3XY44%a%}bEy(tv2zNv0jCx*zlxv`E`6rs=eos`Zx zr2MK>DWZJ*m^VTl?h41a{qlb~{MF=6{RZJ1#AoPe$4ZP{sy}J=+XP>i8KaM=L)Yx*NWr^4z7wngFrn)Ptfn6t14p zUqabNNv6Y@7lMZ-DrE?mq_Y~)I_cNtc)1?<%M?pzE|5Qd%oE6o2eg1I z?&ta3)Q8k9t>=7{P9Ps=F);sLDh~OmCn`Kw^7R>1GS{(S(nAA5G0oXb|FRsFn*(fq z^7y#cX>?~Q9gV({Cj>cSPuU7{BvL&p4k8kmN%NP@kUSw=Y!539P+fw;-7VlXv+I#s zo$;r}gR(THZBU|ml2;!@_voJSwJm`?cR;E1iW_%-mBsGE#t#^kueq*mI!QNRE%l=j#^L;ywqKn^Pz|*oMlhaagK8~YPy*J$5%frt!vW1uLs`9~Rh#;*&IcgK zZAB$bx@`P>Hs-|hc>CUu9D}Xa)40vI8Td2-sb1tV5eD~gk8;&8yDOZEaE~U1HXp7l zD{UG;`)7CzR0Tybk%ZD|-bT`sCvRFdp7p!F{?>ck^5UYW;rn7ljGYHn-2QSxj8#YI zNzz?!>5bIO1WGr!^l=RBX^$GQ@R9id2Cu8d-hy5&dAJ8=AVfyCeaC=?q)nk%7+>rO zQLLm2M2@W*`qGkc$19-G+Vq%eD=m9!AGce^8#g!3*Msdr!284@zvove8@)nu@s>P0 zo5ms!D+h~^2@l_T+tTKq{A|TQ$_sGF<0uijSG3EJ>dG?NC%S}O{qq#$J9YD2-&z>T zuodDrk`G`JH$5GDIA89h&3R}Bk!R)cds<3}sjOSdIuOtQoY-@!r1^zt?I_u{D8BaU zd+yr4;0oI!vcpnpp7p>M@@U9j^~G*-xht-bBO0Nzi~S42SHowk!763Lh=zV9m2_8x zSwEzA^TI1f)zD)t%to>?EOwQlKq^GT6Qn^*93mOkWr4VsyIX(olXUguL-+Akq~UKe zJhb_xmzwLt##ZnGIhH%7(%+;QYQ|+STq+w*Tcp?zmo+aLLStoB6phTx)9qg+)iC8A zGE}ZQ$dRQVQM}bPi2RzKnp4Jh-E9~uFlRjS;8?+0#wwO@K-JUpVf}^+Sww36%zaqY zQ9O9Hj7M>l#?V>!dlXHjC?7PGy;WN)z<+J!lRs#dx^9|!W8_liOTueK8U)5{` z`nnr*gM8gmCuAr{o2ssH>EUVz-e|!JT=*I3u@H+x|Bzo|*);O5<#r%;`xF6ZgS$$a z*Z$U2=qsVY3c4;fluCwG6>Js#-8pOH^r#p~{M+#D_+$=NA24@>wA%uMIgD^DK{4gLYLw7n{1yBN* zWe;nXE1)yG0$OX3ZzMq2iR7tJAT2<<%)gXLP(w02Y1bA zUB?{HS0fnr2?GRU4%Q3t9wm}ZSBLRXLf|xO9$iCYvxg6pr|gI2Z%Bmip1-7T;@w6y zqVU_&6&S&lS&n@o7xhqw#PuhI2Q;-lYmE&YT|?#|BNXG4>z**-i9<91*VbnBO$Vwl(v zn`d{`!rL*bC#4MUt;;Vy3A?<$mUIpFebg`kl#)zh?`sNdrn?PpWHl0Ru;nMG_H$3Z zXo9|O@TFa-EQabsLZEtO4+(J(W7P*r5H}>x8x@DH4t26mnuk1ml`dknUo{;tZ1Twz z1(t@8WHB-3NLN8Ftakla_Je~3HdQhgx_8tLbqaQJTto1x(ucS#b(tNvArzUAUk2u?9Inb1fcg3X5v@0nP*!6`f zUa#To7Uim zb@qKEJek=J%8^?S-BPHn{KoOUOFslM7$HgF9Xn+=bT3%ZOjO8L=Fg@X7a#^OH@sIU zv~w|~{ircXp35)YdEeST|GYG{r@lpU-s4xLs&>7~^Kcqxb%i3K=8DC_QHE)s$kax$ zh;}!11sLt-_hAS`zv$K3)fMgup=msiL(OnOM@#O*yTp7>0q5uH;~UXB!ll&^gFIQH|Z(l2nA8W@|{4WseLJoKR=MS(t}STNF)K&oUtBYmOX`B62ls=l2H zmOT?xw?axc1}U(Pl+1XM0)`ob2lJOJt+C`6_XgU;2-`G;sEj%(qgr&59#_GYLWiIF zD{Ao~xwGO<0yk*sT}Zs?1SR@Z`+lw0Q4uGYjLB}9&TU*KCfh$PAaPX{o$&ig_m50Y z{z(yXWyDiW$;g-OHcvm^L0F?+?JlYeEgNR9;@bPi6_E6Zxe1VXil&UK2 zX2F5dpo^j;Rr06SixYt!jPgRJE+w2P-e18~;|*?AL&}X0PGkeOl_-xCi{Akmb^2G3 z0wT?1Q7vfhw=wm}tBCE4iIDZt0`YhC<=;1TGmuU-bBUvM*R~1El50^DqhDy2*v6xY zf4YN!fAeQb;$X*8>pY599F4^@WZWnEoqFIa z;p0y6`-eU%ZQn#@QU~WdU}bg{vLg3FQqeElUC4p$Q2zR%EUkCbVB1vMc>E!RMv5{auupC!=W)CfcM`*j z3iDkrPD(pN21HE3J9q#3@yQl%wHPvv&dFItG&-QKZc6l1;g0x9R_ej13-GNkql zo6C85huKt-8(&l(g!+=pQr1%wKmLyL#@Bg=T{<_`Ei?#)~|_dHVIu5-(#&t~AomHX21) zTH)WH+$B!V3Xmf$4oiko1^+hgzpeyh9=ropiL4&lw5PwD`Oc?(te^P`X<}z1(tr5! z9R#BnVNcLm=wxF|-(vmuaJe1u^0Ejb)?E*xKK$MrpGtAa{S~8PM|}QsX8f~N5#e`) z;%&V$G=6VTG941id_=|z2a5liQUCbf(sMz~ta!Z~yx%*8S_)X-C`Us3U$6b|hYE5% zz-*(TQp*+ngYDjeepdhR7XOd0hG_GD?W@HsDOr6QrPnEKyH=~1w6(Q;I29842iqB8 zqxiL|H0fx=>P?3q@|6#Oyw@|_iBts6_Y^RLz$iR)AKFsW$=AP|R`OLC_Lp%lBvfs_ zuMg1{m7JYujb<@_&>S83Jp65v>R~^irV%YcYv-gbRdU7@*UtX=Bj=}-wB~P3k{?3| zuuwW=WWptFqcLM$|HFjH^#Y?S*E*6*{I}ut#^rXBdOqO#eFSAcL_oC3ZBbq({%tIi zFM%>C+rqwd)``y31 z)d54YOZT(DqK z5;OlbdjxY)>km~bgNboVz={wR9=>j@SiXQ!cNo#D`8j{*E(K4muGpZXHOiznGH=(qWKIN7KCfbEI-g`_VR^8KgB)V< z@BWdbEZ#lw*LEiiPKThkbN z>Yqlh^lmnNLowpuHTe{z_Lw|l$4&82oM;Gc=3bx&5B8d^-68$&KgJIEs=A?N4rb5}?HX>tDD5Ymw%DF>VSm3F?KoA^ zsYZ=cCGnLsh?Hf_aV94Z@UGo5sUm=Wzz9I(8-cS!zyX`i-Q1f4Gm{lCe*L^tzn3b7 z_wt zvm+>GN|y|#iBs_<0fDD+fVGRT*A`_Mfp-Ehss%VKpn?QQfZOx}rfbKo>H*MEZ`z91 z^(X;gbNKZ^(v8|J^|Er|?mw-&M$c%sEPbmV0WcPnV-JhLEoYJ9nl>oEz$a1*b9 z-o;px=S_7bz;9~C@w$|PGn7qjx?RFz5lFcGHc!*+c$Rptv_g8nN8R+OysCUO@v*Fx z-NT@5#+{F9?SZbFgKxq0FwpZaJ;;Y!-GpsT^O(!=hZ~ke(~%6ze&K z)C{TUNr39tSSRm0fy?z53&nTYD-YeM0R;@hXW}7; zRJnpb!HGfdf%18{=Ty2xxFmMlpkH&GW$iBzBpU-!2Hh#-w@4O%1x`fP76YUo;M;B3 za?kz4ujO?6FmERVx!5ewTd0ttuW54}*GIlRK7|kD8n*o=9FK2Ba!>ld%LF={0B!nG za5_tY+NWrMaP0#E?TTjO#VG&@r!#oWe{*T)298S#R93ZLv8`47cJMMwSfb_w#yErd zH22DV8xI)ATRqGy6^jEHz0NldLF{;EsI0zb39}1%wozah{HEf(=58`{rmtiVE*gOI zL*Z%*_Bp@xc)QM$`sUbsA)B^J*;bm^A?59TSp$XpA+^fAv0OYh$|<2I;}8y>`Q7V5 z&x_6B&Yj^@Q9GW~*+za;Djpu#*mZbG8VpF=Q5HCDO*#y2eX|UEH|KG&Z3eR}3)W4$ z8dZ7zxMZnYwHo%Er;Y9{rh%}EioHZgTwnq9g(>oALfuw}*hr-ZB=l9T9iXw41nxI5 zL<232&H}(b^|=s+V`{6Y5q*$aA;WR$OkB|Qyo$^Uj?8#vu=+180D38j&L^6OQlBf8 zwZT|*(@MClnrJ1IT&y*QsCP;TCG#Spb1h=J0WQO(fYJ0wp*GLC8d+%+gKpxAm2Ce6 zP`)@@De+hXONX~nP16+;D&C@-f3EnAq{d;hQuF(U7w+I_9m)dVtAB0>-e`UT^KJCz zG?k1)$9+%q0_c*MuaD#$12Ar9LK%M+y;e1&Wen*mOBVmehX!U>rNfzmoH*sH7B(L6P(_yjwyf`_9vqAwhhWF>h5u(A|x$2BWk$NEkak={imKs@=CE5Z5e zqXFU2@n8Dy=(R0;lbEt{g{|p_9-; z&6uuOHqXgXs214?(*A`+_*UZuS&yRlycZx<0al=EUEpHjVcy8m#yOGiDf@k0hhWI* zV5f(RzQvTyinYMZSN5^EUucCPUqR9BWYja!<2+_{Z@JPYe46c2r*3_HBh|vB4xCUm z(h$>V4lvLL82qd)khR{@_Q2@sgX^RwUug9~JntE@1>vjp*G^Yx92562LW(Jbt!&h} ziD1E&Z6t_Y>a*ZzuX4i>t{0O52m$LJF5n!HGYlghfQM^>XGr0by<3|o%Ypy}gTbv8 za5OhEsdKVvoooX48AkNOJ2@uPP1i>ZL_Ch>_80G*JZ`R>nu2TJtVIhV*>~jmqTJL{wYXk&I9>J;XyM&2qK-B=%hlVLTxXzU3&Rcl}KCn`h0)@n-I(3gE zY@9ojcKv)?AiI2YvEDfV$U+kk1pz*d=xq#Q&H;hGBGQ5p44H>7DgYY!R+H$)YN~o_ zhv-)y!=&I{r_;;X(hshm^BrH6F)i4dZ*p*{6v_UqwTBV-o37Q;PrKMiI+dkhYDCOWqcc08WoIbM9$9hzli@>W?+=GG{>!0}18=Am3C&D#~E(#3NTS)!;CftQj7RolsT zqRcboTC;-IW$ah|*}*ibscPN!WZqOD)F_k5>QGdC2{`Mjb+%mC00qZ*7@!WAFoowO`^q+ zE#T6NpRm}bo&B0jWYkYh@R-bTymC;5A>qfbbS}jRcz%+)S6~dQ!-su=TU@?A-KxU2 zh)(4Dri`tfY2&D4eK*{$pKDly)oS}5S3mDXePDUwVtrwySz+T)N6^_2vhhPRVO{Pl znTuagKI6Wkz6xI%yQ93--naY-JWl&fTD*IU!;UQvIw#Pex`wLgwNq70zmO8Vn5Un_ zgKo6Es%VVs1eBBY84RKNc!0~h?V5c!L(ywg_%Sv?3?dKha|9k)vq%h06f}NW} z4C#YuGw48y@KwtCy;y#=_Uo>wP2yY4DFMeQ1b!eFRgD_pVczBZGBCB=4$0i$9#^wr zLE1kPF<}o8o;-Qt*vGXp4)lS{z!6%dYYpnt=`7P#1_g?Pq2#Wibyvr*>G7!HEuiiM zfYB#S#{lUnDz^uIR)F*U+MN`~UN<#|zMMCeh}z72c4Y<+8?~9>IN^&jqDn|KBJ&`HE2g9o$z^R- zQe4b$5cAAM(A8}vn&+tmk;|5X0+i6tzFKgo?f=8xTZToser@A|0$UJKDWxqsq`S5v zN+aFUH8jH@F_en5N{OU&Hv`NNA_xl7Im{4(G(&g(FZONNOS;5eH8{R448H=A8e7wu=F$a4( zaeVwvgvN;(aUm*9ytHgljj+SOsge9RC)c$+9bQat=%+(Tzz)(jIpV2mzeuMnma7dQ zjF0|wr1;T5w6Yo>|3g~R%RQ`N57as9Y`oDjwAmEQh~8T#hxn7I*!Y`KRvC036R*`P zqBLQ5=qKLDZ$*u9t-yh1XQ5>W6}cOo!lt5Uv@4QV}PvB=BxqlXSqzlHKFZX;;& zHrktKLQds;=~)dJeM&A;ngLi|VTI2w2SJ;P$VpAEi~H>rCbcg7Gr_Ob?qV`1I}(Sj ztvJg~?u{FaHwn zV;?d5K~G-5jcpq8OLj@`XpDPK2#Wf7T!A#3g1~F?3(l2FORRr;FPWkKfg+4PYXOX> zXVs8AQWH>zmne>(rl+sZY{B!32iiwOfo|22HxSV)bU4_-Emc?m2PQlC#H}7*wn>_+ z-+P}W)rPZs)=T&40w87|zS+T#|KMktQmpjCS4Brw%?JEfR~|hNDv7(P9(CM9ut;jRrVg`=Itg=oFDpsn|K& z6{Tw=oTECGDI?DqM?2tyi`YwhvO&}DZQGl=Zu=umi7p}}LpI#Hvz`8wS?IicQ_>Wn z>*dvnZeKLWg`#*sc|j@A0r)+pdfZ|~)co7x4$FXYABrg2R`tKDt37}jIo4ENV@^Ac z-3MaatNT2jG@hae)=ZKV^fIlc=$71X=DPy^d9fX#&gA^31x?Z z8%Fx_wF>5&CmY~JBvO}*JkXZC+sF((zAgQ0g;53xKn&}fKv3KXn`eIda4i5GW6)_G zO+;mBfYF%rJnZBBGdDdT<|-&08nilFxT{xh&GEFi)z|t4ko`L~y*tlLnWP3n5yu;o zWpGyRrSw8d0yS>r{H=*?v0M}Bt=u2GqO#H(^OAl?d+Ts!Wr92k_ZyO4l@qE)RY19J z@ukon@}n2h1Gnf`SPK|HIM4xG=cPGvV{E>2u(kT-Z_EW7d32I~e6>{9F9cuhn@;wA zxxB=C)u4=B*rq>C{R{k*%j}{F6f(nDyF`mzz7an$)0XWLeK$V8M%SpaWju=89cFcW ztxO2>eEHAe`lZpOf}NTSExuP7EJ1++G}Q7z*EwEiq(#QD`D^s$wVJ0|e6BB%2?)d^ z7J$@#rh>yPBMTL;Pgd7#Gh>Xe`atQufHMfR1WhV6R7Kg43F*6Dg@y4h6XDfush;gn z9CEyI?V<3&TvuOK#}pNte?Qi;E7xXpvsm22#VEgF)2N&{vCnX{sWp>)( zThW=gFQy`WtZ8CBE+50G#qnS@9iChL_R@pnp_FJvSY|z(W z3{551z32?yJ2ccT)NL2|muG3l-4(I%N5g{|rcU!Xh5;Dw(im4+u3dx(FA6>UBL?M< z)RY8ui=6l;d`zc^Vg?+Z*9u%v{3AkG#ToD5a?%>DRcYoj_6cI6K(T06HDZ0!kk z%iDp(8r3yfr4DH7e{8^u^KIl%qrSteakuUJUq1vhES?u@V*1>k9^un_9tK&ad5-BwC(%R z^z66NI)!`OCXp(zNqifVf3PpB;agzn;v1)&5JM}9&h!5A(m2)@SZf6(Z59|Z>4(ey z^}qt+Z+-}W>kv$TopD*+I+&CCzG%M5$k3_fP`y2?>QJ~-X85VwLK-KnyWC6M5Eq1q zA<2BTk(PX)Z5qMu4PCdr9(!!lvA5^*Fp>moBN5NE`LJ3xPNkqDwe}%6BdV$}O-QVk*Gb@`o3j#b)M0h}QTBd7eD$~&2W|x! zSGhfXonU&-Cc7v~dVhd)cJyQPjm*kJt`oz@wNI{p3on z4PMrtOXt69=@`xATpTPhE|b%Ex2SW^_tAj=D}$PI<=Mi6!E&UxJV8+4AT0-}muDXf zRuciHboh;d%E_;xfk~hM?E4A%^VEy+636}ip){=OOYPfO|EC*#K0v7|Ua?WbuN?#&?3N&Z52KRbz0Nv9gPA%eM3e6aYVsu{Mx$xGH z{ob`!M(2K9kyk+K!gS&JWyh>y{NnSeX(IGZOjK+i#`hNDCARnd_sc2 zt=pC55nJ_l<{!WIgg32IZX@!2;UnKVX9vvNN{ieRgck9$Rt*k>pP992pV}fix=afe z2qjMTf?n0H!x2@Zw=Aqv-r1)5-8eOJezUY9;PW63MKw!wGlgH+tYAn}NoFSHu)@~> zxD2+PW9wRjPb~Reh>?@BGV(V>+lSOkb8dwqE%FR{f#0}llC(4Kt(uywVeByM(fl@b zKehj8S+59z?SmyQqB9anQPbSR@Gk_>LNz?5Z4dqAR3#!My?4v0O}x+%K8>S{tG%aE zd}0qH5e^kbw7Z{Pn~NjQsR&XFuq%l6lHM!ak*|d}5iyiDb`Xo9jlK3Mh3OBy4lx9O zB0a`>qfE&MwA5(njdq1du~hDE8r6Ie$7Rp@nR_R7g9u5NFU2opZ0a5^>sMoyU8Yut1h8*?Vg%j;x05o>Onqa!(psd>=V0cxVnZ8D<$;nz;*G(?&366 zGxby$X>QWH{fvNXf?vu4MHD)-|2DqW1_`zrXzO_Fmah}AZDn*!HU(uQ2iAQods_C&+h)0DzlC7fq$aqIhl0m_4Uu;|l(x#=X?8hil%!#hm#u(lPmsyQz8=lG z#MZbSg4qw~eu%#sw&JT-O5;8Y1 zuqyJ*Gsi-tagE>F+`iX>F=YBlYq4rw$+E65GwFC+$HB39WB0|7 zHuaHd;JVCR@zu7a;Pj7T`dnxCaFM0DCV*~0I1iXRN2kA-P<>w-;tPebI2#*6(b=lJ+ zT7=9QS;VtPw#8t?_=yTK3qv#))EZZkpUo!hcfHP*THGgac3&obz|3*M`E6e5rN2;u zfVU*`ZE=%C@ke%SD(B>(^S)9$ZoYbresjB`HyfwBou0{VvzoK$ont}o&*(^ZTz$j> zV6g>vL5|+qBR=cMjwg8w4H7BFj`CVp9bzy|8oc;3oTcsyPoyJbtXxE9Vl<}o`-w!d ztf(zRdu!;Q{emqdYWg#EG0&(@wCSMKlq$UB`=jm^PlH^%qE}rmieO0S+Ou$0^#cTlX*e+ z4E9OT2JN)Z|1MnKr`lJk3E0kK9!dEZTTA_e6Qt@ zaeu?C&s_VhyUMwf#p0etr~2`>!rx0ZgMgpfEL7trz#G&w@hm4<{VRr3>O+wvn4cO( z%?h8VKGxy3yc}db{ngBm7`>`klFYj^&Jzt!GG(i*HmYRruba1{eI|wfAtd$2DBjn zu`dQU$B~C*qB!P)e}m|3Inzd7n$c0}u_FXwR@+O1RUn9d?MvR5f`3ECt?-E_SrH$u z%gg;WemEq!tk&P&-D%4o1VF6Dn>mHw(R6>AJc5{jjB{PH%87Bv;wjD2$AKcBMP>dC z6ufe;U~NS+?e>4h$4|XWVFEDg_0Ey={{Sh$zq!s}X`xh63Hs^u|7ru7bpWeVOoU7R zMh7?-Kn$>Rjqg7MUj5c4fBf&wew~j0Pd6igkO3Zs+S9-2O_3Ful$7+menTq!!7c3= zTxg&1_^96Bp4!i&WPz#lYmmrU^mBW@xA|cto!-q9o`$`2dgqULLja`009`*EC@{jU zjUvtjNg^#?yDJW7dhlnJ3dX@f38)R4Ehov0Ud+ApOvpUNb1Fmv!)b&Z=#tzuJj>>X zu3*tB66+5VMcu5h9&!#mjw}p6P3*sCh|K6kNFP(zkFU`pp)H0tpFjH_n_sOb0+z-|V872-N{qc6d^FCa9 z2NJWB0fvom9229J@GKRCjP#tT&3Oa6FdcKWJ#6AJpe~Poev$m>L@Z^0a}IMRHgN_t zyQ9)8smI=l|27FJ%UP<6Jf7zV|2xThnv;_CTD^c46w@0hQc#K&k$;JrjUN+)TS%$#)?v9)w z5N)d^+)8b9ZsDTmH4a};I^-Z@P2C2yboM)A+4?K2RRIS(ehi!sM+1v(2_?^l%C+iz z4^J3P;Ij;kV2~V5ogOJO_nqwovL|+<#xpso@ba_b5I|%H0$`gY>EiUtIoPc9?{7DR zpU6or-$X{BGQhO}3K>^Tx)kmJlyN4A21p9#<3NN`%FQw-*<%CE-{b+7&$V?>Kmx;! zS~dg1bAe=w7nXtyEZbRG-CJ*1@5zB$9=s898JE)1K}<3_P)b#DJLb$3ldXz-^Trh5 ztQBXVr={IA$PnK#$_+dhshvAkWj{O$(69Mwj0eU62i%8E*}IJ&kL7QOv&$OE*>0Ob(!PXJSwW%j^hH|Y=Z5=F?un;s(M~eHzb%60b&u=}zrO*^Jk{%w{ z!PAI6)0zO#0M1Nj|FH4oprG+gNCpB}2Rmqf5Q?u@oz;wyeNp9x8?ABxwHzuy^I?ax zPJMRJ)aJpsXnS!FLDU=424F z6L?Vj8*e0Fi)zF|Hc5Egv)OJS_bMseCj3Uk-3uxPns&a9k_@?o{k$stH8vKw z&i1!O?JW>G*0-|CW*qSZvfx8$vgdh{A^zr;ix=b)*u5m6i<%Sk?7GEGp(O0>p6acg zpzyB)7<9<)z+O%bpluPKhthTl3*>#TtPpft`e?0LN+we*@M#30eI%FtP~kdRqOcPK zYGgu3sQWXu3FP=-dsFs<1Z@q$epNig;6JX$|2&?|!9@$lPz?}njd9xPmOibFRuN-c zxgyY0hLrnEMXEq&uvG&DWvGZ>m{C)EO3!y?@G59O7OfED0PtD5$Y=6L=y`p5<9Y% zP>4YqUYCl_2RSvCBl9AZkG#ORQZ~o5P({RNKqs>O}m%Xdsl-Bbz8f2A&1eC zw|5nfWIlbqLBfKrWz(&2olyY9AQ!A1DFYS-bDB`L1A_Tc20DF2pif6DZTrd`74%sS zfAb||2FY{Rl#=?ca9n>vC1;d+?Yu}n44i-F?@C*G>Q!cl#fUzT{hjcrz)|{`P>35R z8$W#VKJX}zgnNzOBvyxZ;P%~@>%#x#`@c?Otv|QGl_i`>_}kB9(y(XDWN}{7-*)s@HwHf86Tq z-*zKl8`qNe|Icjy@4wW%fNlJL_-0HMSc6A>AE)jrE=Oqpboju8yU(8yd8CFc0OnJjcfmM;g~9aGg?YX zC8ZZcF6}fC2mkCh0MGniL7V-5mJj@Y{Kc4Xfg-!UaSjLa|1$Uc9y9SLt7K1fx;dPf zaGi=~LB#!5!}%oZrB9Fg%PT61jO)ED^;i3{6n&EcCzPk(EAQ{<*Uyu>PoBwv&*flD zqPyYHRC%ji;>0#{;D)GE<7V-gz>is*WEg29=HmJlD+<#kS=ERdQk~j>WsDPR^~ss6ZPF zU{Gx|APYEv1>L11h$t+cv+NB27Znw4y5)!R*(U~?;d)p;dXw^LwbynBTMM8(UT6*O z*D&5+PaCVsBn8ddpf?GS7ubt{9GW`5)GEN?Gu^Ztdv{z5sU6JK5O!?rv-)u%78LDT zLU@enqt*g9l>^=c1QBA^+vx3i>h|6addOzVGr+%qFq-wE$96NBMj^03q-6Rk(=-=sWW5moR3Ri&_!lcxDqk(YU6xsczWbsub z#;QBTL77GvA?TQt60IuM>xFXAG>huxaXtm8Yq&43SLK+OqT_JsqdR7|8Q?9gk;i>P z7zqDxD?7#s2xowjD`je|6w9q#zb$Z@w*q2Fr;>Io;*<|Qb2dZeiEGb=@^GKyU7IHy z%7Tt`J-a1!KdTU5G-P{vJDt(z7bivm z_Nj!G>^8St_1W2<6I$Lm)dOa|uTk|F9MzdBJ#i+!Nh`YH+kdVjN{a6ju$@f-E4gaU z#IqN;hSUYxMfxcRZ@E0bzletn73z7+(N`O2z`{Y@G?@7@c4~3r)6T@H$yX248^65^ z#4I3YStX0Dh4SM?g%Qgd0UJZmlIgX_)~lmK{RA!yVqB|vv6jR6X}F9?iCZ)ud&|!o zUiqr`=D{VJPybPl8K5pDguAI~p$lr(T#sA~Ua-hIrz_6V(%^q_Rx zuMMX4UToFLpwX*nu+RX}AHaezXoUM56BmawN;gHlsc>%k)8I#IOYh_tfEr7=3};56 z+!r8#Y)~4;Q~OQKWB#cTY|-v;3ymRitZW8sS@USaoo@e49svi`5;sa0csHR~QU&wv zdC!z*JE8@86%V(r4>%|qwfr29{d;n%i4r{Fd*yaAPCQ~^;7FYpQMw2?nYLCMhUeyn zsCD$e96Ke`u4ZZ1V`VxPeE*C?t+x6S*UjPceWt%P`xPiGf+Xj5>mSQ?n<@>80~Os8 zI#2n_I0PNLX5x+P8jtwe&b;MRWMKkum--!%3xug-{lJ$woG21T$#mUGTy7nEb`-*b z!@8l4fS3TaZ(zgR}Q0}KGdNVU1-;SHE+&r4xt1Y1wxlhEj6aO zZcD$tbCHKpGZqfcH$)3?b?|NCOOrO=61p3&Os3I}qiZ+PsgeHEuP@zFp564gh_9 zPz<(0fzb@u-G!QuA59U;HrRgYl=?%n-V3UM=yXJ_EbfYL$3)}C4;e~Njom}YJ`NP< z409i>zJQClIh0OE8ZDQ?gGUcDq)OEpedeu;#Bx^yK*Gg{4NAYU$?^z$`tdyX^~yf7 z%))7jop%`-7-yoNH`2fMLiYH-yo7e0yiz{jSrD~qkW@$_NDi_wAz|1A41m464tia3v_7wg*<{qO2yos;a z5t83J=Sr^HS){#P+5G?D&6p}IP-Xv;99gD9ue7)%6^ zpYQChm;d<)nl}S%ccpC7N95R+Mqn4NBg%`#=weftRj&57*07pF4YW2Z#^Cl&0!n(-sa7JN!wLpVP@#(hy+ z?n(};PLjiKO`P`RVz|`I@-6!A@6xk4N3BeHj_(iI7+Y>gIwf}+Bx|vcYD4*pU#zQaoB<>MAlRDdm|f;UG^fBN@V^8PUc)Hq!h(9{op5l}t?`M`7+kOn`;LI1rtuMHLayXg8s)w<3g5`(*AwUbm*mD!j@Nx-d7<9rGiApE3!;cM zSOtU8{h>5tR#ozTtJ#qwIjb?)CB5c@n+B-yGh(<4W)S_Y&^Hmg?ZOed_jD)e)v*9a z+Ykzgsr4GICN;2ncoi0jhHTZ)VM?1Ism5%ymNyDzH{db;E*B6B}90rkQ6)s5+~P~MN~j7$8V5b{-3Hk!=n=5t+z8ae{iAJP zX~DKQPB(z!>m$873OM(;%%rFtwX`dBOFuLY5hC%iX3?bikAHj$-9m;ah4Ns@}&gx!(CFeU-!34XC*_MV-u@* zlSIo3Lj&17b$(127y4?x9#V)uuhGmrPN)(XPGu4{7S?`01VRPWPH)Y@_{__p*-J_)1@lK z5pF4#{)1)O@(Jqq%ExR{_O~0SlkV~EhMoBH^A+yT-b@{I*=Xd4Y|dJdx5;yEsM5*Y zU|>lpYwD`!4EmgUP^Ky7b4VxC%s8D8muz-(j|Jg8TM?kLVl#{MD=A6tnGMmnwGz) z6;-Uw9*?|~?0_KF>uabPYgeQ{6TTw@sE1dDzbI zrkq^c-r#e(;aHBga;%`L_Lkwh`4nn$;%D4!0S(vb1uV zEe2+VC-ucd8BJO}U-GINjaa=FLuD{KQZ$S@*C%b%wBjewW_3(a1~Vo#Xl=bfg+f~< z<{I?5Ma{O74UR2W>9|6AWGaA;A{1G8hZ3rcoXNfvKUmJ&B{D{U?^q{@iR0-Udw4qb z!R;V*P)-g7gYIicXDi?M7x zi9U|jI9lGmfcixYgqgAs(At z=-$n7vjRF=p*syrsrc@&vE;L5P({^Al5- zQ{#+Or@lbg>D%Oq=#o__Q_MHZts^H-1Y5IQQz~Y)W1}hdqkg%U%@ zY)&Rh%ZV1k^h%`!cIn!0iIGNsW;4ABCA@bz(6LrAbZ3H;yJl-jQPg8c)D*Rl%B24^ z>nS=d;Kt5meS*gZo9SVb<;f*jKzYkXIi_)Y$f|nm?f1_2HFF))U8-olvb%Z)?I+Ks ztLT>I30H<{RNL=7*=<-ikzejqUw1g32@FxKDGMMpeq%apoNStml_HsaxLjr}?3gpR zmb|iWICi%^*$+MvC0G^Q;pzoAbLJtE+$%pjy)uIoHlQflixkg8JZmbXGP{FXds28i zG@p3L{U9e%6Y_d?w*LJCGEMXEEyZEQtTV|Sgo|PGtvngBP}yv`H4$`CtMR_algRpQ z?MN**lST2>Nvkr~G1o|OK_|vE{w`Lt72hTV5sKF)QbJ_+ z9m?Yps`w$T&v3c4w!DvU8BEHZU%coWslqZy1X?chr3J;}kz<_hM&&UMndZdp{uQ4P zZgW_ihYdAiT6O#>KUPWUGaE6h#DQ+4puO$R>bt@i0uopIya^^JheY8{BOyQ2$kYIK z7ZT`Q8nJIi959=?T1V$BE-$#zfeCf)!JMJiL`BK0{+PFpl{<6JP!Zp9_2;Y74N>?m zi|kY}+C@e$yY_3xTE$Q=ij0_+0>dhnlgV5m)ho3xM}_nZd_B5LxeR+;P(!95eC5r) z$h|Z8jx#Y^HkGW)DEpM1V-cSk(zmUp?!Q!7Q4Tq9KkYf43+gr;7KU;0)QdFlUN$jsT7;=qlzv|2Mg5dc7mhVVu6u| zV)VnC(%S9gj^Rly*A8b4f@a6RTOsYH@QJ)pDa6=nQ_8dv%HBZOI0< z?8I`F7tx~R@B(-mJo*bzml8y|6aO4bGqZM5z?PJ@;l>1p%d)~cp6q`atoID5Wr{?* zQ~RqQqdYLzHG6i>W1lvC4K23|d@@YRj2%_3FHXo57*bG2M%xyq*uS*U6ND){*0A%x z=gknaKjEL>(ua-F43g=8t?xWxG0oKO+}rHcCwO06FWO<9YPf=QtWtUVmE6Rjm%$d2 zHNxj>_{#2xQWYztFY7x!)Eol#rj)rZ_G`)*3rrC3R~HW%WRCGCU< z$*?~Td0}vmu`H_Exz85y^jYO%kE7(2ix?;(rZc$%6yX!slM)t22izd>$zT@Zypc+* zfg%BP)jxO7l|Pp6O=2e5Z&8+*QD9Lx540T zF#>CQT)5K}TyA)U#l?1II{9QFy&{2xuhLC6oPI3+dm4uplv<)@uMnsbmcw37L_0tY z{mu6r5_%Upqa+3_3$U*(OHhz-Nf^o9PQu4<0Xc(wyjQ{F36|tz0@#D{F$=efA|qz` zoosI_r$eIRn8Nccq_&o3kaH7*K*z@ zeQv0I_x6W;xl{LDug_371x`{dRKJQ@tqI=)nFzh1PnME~F0x-S6l01`R)^;zvxlU5p^14K;?!G(VOU)W4q^BW zvWDdny+jPXf&ts>vLVva!lz0uVfb?G#!p~(EQexr^p^4YgRlatG?n{Ed%m}Xv--#U zj$NF>SDdT6XrmqkR4w#lnOciG^sFvbAbrN14dNK1XP<+d?LFDA6~RJ7nn>?*{b}Tf zMAr-+detPaA{>8@cIa0y+qU~QoxQHiX+C)UkfSk>-Hdpfr3DWA%Cu>ZI zqqXi40SuC7lYQ|Z^U~|y)R{3MkH&QD@E$)q5so^N&^fN?)gJesWrt2xS}V7qwZ!c? z<`v38({Y)V6H>c|R|o;+r!^?V&WuKf6e&gN4}@2;1vGCzPA3`-V-Ev00o zm+1&7YB*G@nh8@j%6{`JAETZ{J^ay`K0nGF86kQ4EJ#Eh#P)v|O&{xsX--OVfr= zAMkVA3KfjVMwqMQe1TE2s-2UsfK)jr2$`sUTR%195ZR5v;w2~6+75J!ibI-%=SKV$ zg>+Nvn-N$7f2orm((B9k);aXmylQUUxAlZpI$jOB%BBu>Efxn)JCGggJak|CK7vqi zJ9QR*v~_)W)>+toSSg-sV2I$M)#wePJeC01=8Qh(x3% z@_awPY1+sUtANB;qT8Er(_&+;sd6r?#r;F8k#4tJJH4#J{x}#~%G0ec#8fz~9IZ6$ z%fb3y*6!r-3dwPz=uQ!>bdJN}Ya?OS=Hgnmj`FE!+dw1YI;|eNSBY^4Qq&SO{9;r1 z54d|Kky`Y9Jj-2GYftY7#G+!`t=_K^&T6SMv7kjBTGKJQG^JzDeZlj#9$|F6H>YZN zZaRzF?Wk;dT-<_%G1`=-o0XN{dS+bXWhB01NY-KG8$PnBT-rXaVapLoGHXn*(_|`Un!wLBu3Zb3pav1PN zOL5FKp2rTX2**y|5>IL+z3*{6sU%Hb7x+LLk#g9a(~WT2L?!Oj>h-G` z_T1`Kk-Z6p=5Ke0tAs2mZs=-g*)P*n6*a{QL-mkYD4Xl_wa<}36?su?HYO*FD#HV$ znua6m3t~n6Zmd?}S!pSs90!Xav9u&PSshz!1@_n6wK%$YUlWV-4E=1tp2H`&sFcDt zsH{1Vou=IGZZv8&6_fWwDs~&Udg})8;XxeIl34OycziLjTn_KgQ#+RepY2dNS8J?X zdTVM(bR*&&oIiHT)%D8HoAqCz&ez5GY~tcttJ+nNU9K^kGD}U(_{GfM0=9t0pq{qe zugAW|NrW5idDvZGyQ$sQy{Cb_uSR$oFKH^jO!Ajd(%Ho|Gi4NrTrSA1W!*~UuKZn{ zE>VHW5~bn5esAj;CJ+&XN z)5C5kA3y#6>4i%$pr@WMFhY4?`Tj|2&5QzX|HQb%I>on347zLsuv%3%dxfa6#yzue z5by7$5oCYnZ}~m_1(2*D8!ZK_snCtj^SlU_RU&LfTtUgl>{F*$Tf+Tr$x@_PZq8M3QiJucQQM)i-*&qSOX%X@NopoPp} z+-?e%`uJqwGN&?GE?@-!(G?cVSMI%mg5eeJAlq6=fvKxu4{q6dwI=;aXHkQmsVYv} zmlR8-`klPs0%~}OaXXHs-i*Y-5|fGQx5>#4An#&y_S^no3~!mnaPbh}(!8v?4zu6%5PHd-kP^w=N~=zxD92P!7UXdudgb~e z8n83%xZVp#A%-h$$*G<7tfWswIwQqbt~W+7r~+ZC&Sc?ksI{G=@6I>|+KV2kx9Lrn z6SDdikMQ|S47gWi28}t5TGY8`iF2^WUI(Ws&^bf~{j(q68;a&#ez;*5Temue$(I3B zuZjzS{WJ=xHk!)20c6@!(<#q|gW%pT78*^J;SqEo2o*!O(|N8Z786aqmXLrA|)zi~MG+)LQc~?795hol2hVf2cN6DxVH@Q_97orp-0}DG$ zRLH~Z`ZV(GVa5*Py7oYFwY5@Z^lKQDjm* zP6W2hAN_mIF#MS^;)k?S@$apeq7xm52uXM;!ld-S8%? zjUKh<0azN!2AgxK9zU)IAI`n*(sFQLE)AOKc53-212>dYhFRrJ9`S^l?0Zuf))J`Z zY?&0s^O!gSGQmK^#9JIp+xfmpwm53#Ar0!sS#4DlM3rmY;Z*(8roftq%*rQC+DN3P z=9vzNmGsfQ!O<$Gxdt`sQHSaYQ<{>ydc8Z~O5YmXa1IlQB1?xa<$$4!sd^(G89M5X z+ZJ913}TP5R54vZDu(QDPzoKbc>5-v<<(=xf#}YerjnCcgLs2!^U6j534tvIMa^N# z;qgIucqwi&QqeM)epK!}`wM!2-JUv-N$iz&I^(_BaXbYj)JHqG|9GPNW{}pY!4goR zs|E|T`Wbw;Tn%&XC6Y%O&x8d!X zc#{x>B>d>YS#lHZDohEKuGXimL$lEJa0@;F%AsHy(K^&H5oB# zUM&Lz>VvTykqRelnZ&_7xzxKHCX4cE4XY@GhH&*60-V(mx1ZMU3jikKKDNEgbJIE| z5u4kKbQA-<&$?U#7%7byC5LLC`~z_b$^PT;hbeWcd~C4 zG1c}0>{UlAx>-6!z_z?GLQ;wVlj3(G$4Eybu;yBzp7GL_?nAtx%u*1UR5{%7l*?$g z7eY-ju<4%dJEzergANT?^ zCGd9d*5#}UU334S{$g<>gXhS5xgl{iuwqcVC=?snfaU1_Gw6WOvWSEmFwyJOwTB+IK0FzN7-m`LzqE*eO0^m?*(&e&PDQV>xj z{;-oOJ1qp?b^_2ulE=KDDE7kn1KYTqk#v7`HTcO4wV%$4Q~h>iV@V-70q1OYDkEvn zv9$Lb9)nhu@494k!ecTnO}qtVO$vf#0`HRUos?s=_v*3JeYwx$+vv~6r8i#%>Z)DH zy8URCOEO`@Wa+uM(w~3gKlu7()F(Qjb{Ff`bv#Dfuv)xauL4qDlKqk(r^AtK+5 zA72_LOA%?o0U}k0rF_IGPMBpXylwlbrjWh|tx41nzFB-8v)Brv2jQ zA(n;}>Wcz)12%t{E581!HO?aXOt#-DZd5C>WuKS!m7dm*$9Ta_-bs2I{8nA=6MEW0 zw3kH22l6zMC;Kl?jZ^r{meo;vI@C>%$sXLqzs2BXIAs+iHCr-1weu=uYkLBA# z2G2}5>NIpm@W+{#E=|0z?_nyuq{qlfps1*8mUzNyJbRh3RnMat@>b}I`uyQ1$Q!7f z@+P;8o@%1Pl!8MGl~>apLjF|Nhowrd%*a27@k*cKtLIZoz*|RM+UTQ4>PEZ0ZzX1z z+qiaC3AbS8N~ol@)9$cWA~|2(P_LgnAI++AA;=zHg&z>Jw;sY67!YbHN0EYr;uhaM zp*!^b^nk@nO*fyLkB=YH=(`)T>Nr%GM;@;`S_#seX%zSNYHb~hs{(8ur7~Ep-XUBy zu==728u!^<;{{v$qc`}h3)7PGxFx)j#O}tuzWrIH1U}M0ZDH(fTvFRL0>KpW7Yr}{ zc;)}==i|$(x|^A`rfo~P3Kw)~T7s<`bjMxijCOS=;J(;q&Wfw^!OheW{zQ@+tO~L4 zQZO@C+w-q67VAw-?SFTECG=%EO?IQKjgFG>jU@*KcRn#9wSF|{Ge$Kk<&Vhk=Y3~B zRu=gldLT3!8}6Bp-)shch`{ z`de$uWpRiTIq(C&f7eh`n|$z*bRo(u-TEp4-2rX#_5?qD0Z%a8a(c3=vZ0rXdF&Do zc}VJ9SK`w18%~Vzg4R}7DsriAYAgX$#&wqhQ@$M4d;eDCbQf&gp7F{o_;0`(rakpWB2M*yS|UFM@>O4lh(3R7&pL@1nb>tgLGym0cun;_RuZ{+D1 zOoq&}PurHbzQ$@YTFLA7gJ3w|}eM@?^;x$hsJcr%W6 zl+?{Wpoq)vd0L(S^ah1u)t>XI*z-%RAQg;mS2b_(dRKtrpVB8S{VI3T)hfV@6OE!l zOpx8U4|2c?jeI+|zbvkaPEgShv$V<*(N8LPHtbtvjzQ;ef?bIXGAw4#+-Po{uFmL; zpVWnpY%$px1*8MDsK~{lZ1kQ0y@-^?tW3+AFIbV4?n(Bf*oxGJdnJbo;^An!=YQn8=kjER$U0aAX z7l`|GV%1XZF%uiFHLk@nk?^J^JmdZIxNUmKz4B6>qunRhbe8pX3~=QCd>KE!0GC|;|MZ;Nv?y<4@ zqFTwfwSxb-HvP44CY}#yL?tN{XgFMk#dfLxdiTE{hH2sAqn5`9in-+f?E1eNZ-nlT zM=fZ&;`0Cf_0OI6e|4)tu3fdpIyKUoT&fQXS~-8rFn@}7ES+{rv~}u#!q{_q{=iS> zlp1pp-}e7zH@b5T&4l6+F4-97wTWfTsHEG7{7R?Bhj1W3^+|Yjn!IzuZ(hpIz$# zJck~Rmo!PS?N?yE3jc==`-^4wvU*vgvgh&H*^Yn;OU7qM;>dN>6UM^MzIxDdGj_@6 z`+xuVzYizCA0r^2!1+f&-?LJ}f*OoDlbcW`cg=LnHdoJ((F2HWU1t+Dc(k6m?ZB~O za!&Y?q49Qoi24zD++-FfxHu-f`4Ir!ruy>QH5>T%#kjA2@-BDY9Msg*47H1E@9*Qg zb~QB2N&+W3d=yJpLp}6A${kG=8LI5O9=Wv6{ z+-~pE7o6{w)?!rcSP{a~Pv`u?sarm#Ex&dS$I=n_&UW*A)TU|`n0u%OAh-|!XKri@ z18|wZs4TGY61JUlkWc6FbZHoJ9?FxB+Phd~cnmZtwdeOZ5KiayZk#Dpx8*~^h#vsl&H;c8dN*w-T}G1#)6R1 z0p?triJSml>(9Gx)c&i=D96}m5`TEa{dy9R5AC(3x`HQ28m79ACW4-J%2}?=q&q4BM{2G_3%#wOcsKP5)$K$x)fJioeBnnw;S(n^6~8fVz5(o>YeLv z-nj*x2azem>s1K2*AM82@6Ma;4L^@_vUli&^9gO9P1(&EcsQ?KZ2~-q#zX(hC#ml) zTJ2YaZw0jY;~Wh3^PaMYk8c7jiKb59>v>`$Y&XeCfcwS)jtq<%Ipr!O3?Md`@5ElB0rzg|hP4bV&DfhKb#Vny!fp94|h7H21FKs2-VTI^U{gF862g<4ADc>hG5jm_K%WMSlvSY|NLs-C(pg5c5q<4Yzu%zMg4^#| zeFvz*HhRB*tiQ>4av@?2fc5eWT#luWIfs9Ql2_Kb>pA>vR5>EM|2>~Aw+$x>2rfzdVtg(CK#J}zq{p()NOz@qG*ZN+|HEhw5Qs`rK0M3#X zAbnER+ENAM;@0gq?pnxF`zAKnPg(9GR)=grfw?h!Vl&+aJ8Sz1FewLt^I$Y7z=x2j z#Bs+B)^<7h_Rt7m-30t8Ew4ex=deTZC6aY6r!*kh)ZTE{_wuO9U>kjB&=_UnancLu zcet!Fg#r;1nBE)5vN1Yh(W1WY^#&db3!PWzFbq0u`JwjrnTR;^t1AO7<0+g|5du8A z_gzAVF7(O-f!g2(+=BOQ2eoCpUrq&n1SLzQP7w$TO(2e6kQhvYo@0eb_!RUs>mHN>-9A_2Q9RoxTZCV>}-bKsw z3j4AOula&xgLR}FL)@>7XHGsc3hz7oW`7%MVb1b~o=5ym@d93UufBWyUe}VsNg0p` zKftCjRw*g1G`TEG3ohj1{HtzhRXM6o3SV_`n}rSz`T(j6C7<1;Q@B7;<;-~qu~DrG zqoC>eFaV9PV!_F?iXwgj8VIh*(@>CD-y|uI{0-#6)7Tcqx&4^vT$BRTz6Q)NeDbL% z2C|qJ4ldc&rWv1Ar|9Db;>=2jJ8VFH-iHmzzG14Rz-S&@XEv#@p5yYA`-*4LC7++b zQ8!}wx{YHNhLEQJ`fVk!8Av`pJslSV8bp12z?#+sbL^T)il6DPFBN5WEMrDVx|#9# z)3-_;>9dPl=~5AUeYBaE-e$lo78|% zXc=z}K}o*(sGP1Wm2)tq?{tD9uBY)@5TRz|N$ly0Q2n7XFfMq~+3Hd0!+U*mvX`&O z@!qf<6am?LXUF5b@xmP0?d_8K=8ggF#``p$1yEK7Kcu$(h|BF7m>gcQ6$&>LX<8h) zIs)y#>T-oMdm%SCu8t+8E(2ePN&?%hVU!g;TV@Q!H% zNq0y0V2W68w&X_hTPbK(2>f}rpX>GA5ZReG&;7{4z2a$6L-`4bSyO>Qo9J_Hy{nQv8Q9`|weoWn2IZIlQEe-v?h94vvA_|==rE@!^xKtQ#!$!$s_zCTJO`kx3n9b? z8^NTOJNgl#Wf*C9hVDP<-S^%2=gYJMey%=%5B<%Itn)@z$DV)<)7Ivsza3s2DgrJ(OH&NA4W$<_e=5r zIvq)3W<@NMv6+BZ}YY6cg8@quQxZAdEfY@?E2e-BYCF-iVf)W9Z^;tG;lv%XRJWBRj~zw zP$9a`OTT#~NLl%S|NzKAF8U?R=W2*!_Df<<*tn+3Sk(0o7XtczbK2~{a zF>|3manP?ZDcB!wog6l_+vjg6yte8|RGk-&+*qF*60c2%{kdei%|!Y<;VAV|C)68!$TL?QWoPpst93aIfDO-ih%X_{$Fp~ z{%{_F&;S4b!_z2JzpSBk1zk6U*=@xc>Argx5F#&MQO;sFP+&nMr_dzMF~dSsH#sS3 zo0w_A#N@|}6;?shH4%v+&&rzUknk4TEAUdRtNWIT37n96V7MKnqoPxD2fmBBW`El63IiWaNE*b}B(IGW@pT z>UjzyWUvS zhJQXN8{m|s3aFS5CMF9c>7e%~z12y*LKGkrLrPViR-NL4hV7AIh!EJRs;P~}m8a1l zlbbIF%O_ai$LgTby_eA?qPb$-P^z1(RehSs#f>V7gGBRI1fGW#%Q`-fu7fd%5gIsr z9AGKtS69{YSF+vB$Wu~yBwM<%7BJ47DVbyMZX+gllV!%<&^`~ zHq^<2Cv6KY1tikwkw5c^580G*S7chG+eD?qlcoUM6%>Zju+UDS!u9{zxA@mLzt|Sx zU5P-jJZ%Pz?aSc3bZE34Lpc&{cVg~~SJ9J9mT>d@B0Wu+*d*=YNt#|H6)KJTXBHZ` z{&G1MPQ0SjB#zYl&%$)6*kLPu>qC z5}}GVIo)YIHqjboL~R=7y|@l^Z(F{_T8IySbJ`w~4)N3s-OGMvzCw^pV1~4Hn&b0| z=)6Uv3<39*azjX`JamM^oi!*+7$|()D^i!gkVM>!#4D&9nGHk|9#Aj_*Vx6(S@Z-V z^SNxj1>(5MJ8n-PzukVNCI8{+`+_hapNEevFrYe@Wh9QUu-8KS6~#T@ceDZgc4az3 z^ykk}7hcmN4-kdMt0fxQTro$oIwE6+pH@?Nq9c)-Zzf9KGO@CS&^jkn=+`WroN7uY z2C!qdM&!mRvxM(us6QRl1|vJ8Zp7hSE0Hx8pia`vPw1iAb2j3bs_>*C;34vA`8!u{ z?LNBc05N85i8CNLMbx)dA%&wS<(m|3c(&DOTGB*s#&GZc>CU)EmYCUKw6i1>h%?l` z0W^~#n3}k$UT2D+x`F=3@6vn#S8(nC2vhnv8j3}33Ai?6s3p~Yq;gv=76XC_!2OGM z+(8{nHgmei%p$+pyz<;UJ$=-jfE(bWeLFQp(2n>MCeD{iS$nZ=E7D~iAYVej_r)4< zrzI*{!|wZs1uj5A0jOjsB1xVkvKOGJv0_02igM4Go1v&!~;EL7@%#FhcygSo2gyPMSqnHC*SnQ_4C^P_Rq`>@0P zs0S4W5W{Wy!f={)E8E8GsX2_r+q(et;E4SuXyy1gQ^RL?WW?ppITkNe-70d&(kp{5}!Zzv<9vyc(6fB($P4A6+4 zE^`tDHv0nnKX)_t{lyso`MPu|{Fp@4lwDwh87XOK$AW;$zkgh=Si7FP;=*m^4BCPld)G9DU2 zd|a8{)m^;vhcD3|Db3-RBPqT?N#(utMDGT;w%>0qe7Xbxk()YviD}~B%K;g0E z%mxYflQ<(H1AvI>h~#2`blnJCClYBgcGn$%q#Ji3yB-xte8DYH1ni41{r;#Tp#o$YaVh#}cV_-%;XF4j4&{1>`EyyWl5=pTv!8HZYAoa1MdV0z3l;sk9 zwQg(6y#+&BG?1V&T~4zX3=HIu;391km0V_E=*>H}BKR^Wk_m!VpeH(bVn#vs`}KE* zz|XAysoWZD5~P}>wJyMFy^;8x+v;u;VD?rX=Kxg6?+u3>l zBjqENKP>0szAu6On4*j(8J8$c&ZV)szN)dPf4?dMDMPO}zaR&|<#i zymiw6(d<_#S=-OcxXhZgFoZlw3Bw4Be3f`~ZNO8e0_39}s-Dt zbMdrNds*HG&UD{vEg<@0Nm!YwEqzH9rIG!D6Nq6o0M4`Z>ew|~)OShFEQ3FU-14+q z48s6Q0N4rIJzbL<`dqlVPPv@tHUH^piT6PQck{a)Lz*N|w&kP-^;Mxin{n0gqwx#nJ}6}^!f3h8zM@6*-m z!_bhP!+URi(z~2Q-;j3|1mBWSgI{ZYI1*pU$q~b>Q*X~9b<7Lz+rwl3LEd*#)c*r` zSZrvS6IRp+nHH*OsLY(KvXsaXID;s-JttLa8!I1EaXfqR{Y?@o%aR|KR_7k8Qcy4(BP3IqH1Uvf? zIBPdbJ4bI2`nnPPv)cM5VZ8A*4)!^Fn3|H?JQq5yK$)#*0$dwbk=yVlijA7 zZoX74L;5yvL9HG=Byczq-Nd38lbMn64WHt4;Bcu)wfZZR+yT_8w0InP%}dmM6d~g` z(eAV)gW9a#%K97WhmEidWP+8QH6ZA!0~^|sg*9%#6_0W{wy3! zSh|*th?o09->zf;*B?VuyI(7svnEnw#w#LyZt&Jv=AD%}8mG58VB@I%8vA<0ZK#|W z{F2`C*bXW{U^i)ut#cJ$peH0b(iU^ox*WppLyC^F>q(4hEk%BgSNbpfwFnW7Zp~eO2QDPoJJ@~ zid*NE#%CSKLTT=AEO^Xy*@%=dgCFuRHquL|+4z@ya-XswmV8!n&Un|WM}}?NUM*xV zlDX0euBgxY3jkTW`>_KEV~b2o`D}{opA%ML2b_rUYW>wd-|)as+F)BAm;z{0Red4 zP0jh%?KInsWfvAprqMKB$Y=xtcF+d4uM5dZpEJonPtoVdZvLVSgR(0sL6d!#GF?h- z9P%p~r^NK|TZJ#_!ft8yQ?6w(WczCmcAK@YOqJCmpVCf+p)GjhHpO29cItSrdE9nH}dLK9!Gvll3BxKJI{18j%?NsMwzVLJN zuZp#yL8<$_c6lt9SJQ6MltQx>6V*muLlYd$Y=JKad3Xw2oZLi3$hojPoWN`btze~z z(6a)we{S_Y2X(iJjM($pr0p9qZA9Pfd+aW@s41uw*WJBKi;!AIXW|Bdlq68zljsPX z83sJXmdjnDV))e`U!oQWO)411J!Vb8IZPkWMED-|PKbwXY;0uEM)PMQNpJ5YA#-&! zs0NvKC7%wFfk6mgJ`r^kCzr8F!pwHIx~7L=q1jJ^vpCwHIk@l}T4Vf~R^dIyNJ z)~>hFW&wi)H;k2=m$FRLLhtp63%IWt1TPh4!KZ3e59cr8I3Mjl*~F6i2~MBsZu~jB zEUE1tX`#-sBq5SCUSWzHF@!EjTdoTaqE?D39Ia64llcasZWeSUJ)u@nds`C%mqA3u ze!uAYz5frg*jl#CWA}z6I_hUc-{%Yt%NLKK!@k1vIeuk}R|JxNa*V*^7jOO-}aATC2ZR4<|!Nj@eyS3$xrplql zos%iN{lKQig-oX>5&;6y4lpwX2l%oAWY%-mG+m;RuZO*axM#t*%k$62nI3>b*jL^aH;i@z?^CwS2@xGKRs>~ zI5*hlTPfiWc6^i}35dfy?nVN&d|Huq4${5geX+D$6en@g^O@!SlB|C|v4DROe(Z4( ze9ibao>ZbtMA#=p{PpBHYbeT)Nx5*+=Yt?4h3QGI+T~|k5{cSyRreX+zy9Lie)mQ~ zeS1sW>kC1>grGVeG$uiM^Hh4xO6}89Mlm5Fai3mMzt4R*A)!e@DILp8sv{jvF8h<` z^o;3&G>KpAV`|CukVwTsLP9uHV@-8V=*)L{>Ululf}`Zi(dgnO|FPu$OX2^O_Lr~c z7q(t)Jd6@{We0@eP6<*%FvUd=HACWO%bz`%^1n9;1M!@Zn6*uWX3J_xYF&MXKQl=d zDl*CCj*R4ileNqt$vX?}S5dUvIWkY}`)~tKo}R83shMBlx<{7aO5{XHpvlQAH6;>| zkZgLB)%u%~@B_l6KAj?goPxacJ3`HB)jt$NpU`d#kX&vYjLaUE#~vJG>_3-Cs9J91 zhfem8r1Gnjb0a$=ODlkIbTnU&d|mU}94Ti(l$1vaPE}8ox-zlB4_(V)8eDT zwMnf>hc_g=%LOcmYBiX(7C#q2logSmpwX)p44-@pRZ{#q%gQ?Po*cCPh6VxIM*_5- z_*C!-3wu^l!n#~@WMm`@yO>yNW!LsA!2g8v0(W!L6OB5i?Z5ZQM>zD=u+#DRep%|O z^S!jk0>fjeX7TP@^K;;NlqgPyL}5O>_GBQgphJzO^pa*!8z~SQDODYfw}jSwvzwR! zIZ(+)28>KQUwsxyuW4ewT&~+l!KEBwVP#>q;Dja&`jJaB&B#B;#XYsW!!bBKGS;}X zWJwhAfR)S|2Y!k^Q1JE+jPBG~$F#7}t5GOk8dvm0`ymu8kZ^3@>^Nmjx#mtHdG+A!cfkH0eRDJO>K?J28>1oYpm9h#p{^u^6@3`FgN z(;aJJ4jss;0iNd^jepmc?@1q>H|T|yv~7h?f|Kl?B6G7+-t(8_zK4hlYJ3?SWofc@ z-JP^&hM67u?uVPj)=_$_jHWfLJR9s6JQ|d^B9Qw^#&2&os>|nArd423NN3A{wLPE@ ze`SovqGE_}x}{1&$gWr4k8%8$9piG~Sdd*hjb^?ilZFgge+C5_e+f9Y%cZE0^EoQ) zxRdr6$gj~Iilrp)ulDhpw>PtlBvvt}SI8Enyq7rbP?+g-+|y_J0F3Vi zH;i#QcOyR~Ud;9%lN6+2lamAn>H#EnW_oqO?Peq)bLoCndzF~|?4Hg+`+}@#Vq)U_ zwDnYV{q1!GjUlzL-(vkwKI_S?hHIKKdU>#y!mix_Zb zeKgbH*E*MQ0Jz?+cN%j_oWY!pX3#WV7-&^JmJ2O&OR{kWd57C#WE$f_OT)h7CjKzv z1{jd5IB|O`Tv>XPIdp7jNo^QU-gMmFVLVG1XQWkq2XNq{FX+thf)hqgb>`d*v{qL- z-R=}U=Q4KsSCPk3H{Qd&Lwt`7*LjU$?d=-wy~jg(>3kLTQLMTPoR8sAN-5Q|zB{85 zhkq-$ze&>wLQ0H{-&cjvjHF89T5w5PgE5}aGe5`2VYe^8!0xaIgx(rlFrreJQH)+J z1zbHBilX_+qW4ZaQaHSzCrBGCjC_~4p39CVwLy>=ebmDfh}sMY<9$-7^y+6VIyED; zX*>f#G(1!UipS3J>|$X4aVWGKu~A3GkCrM2Lmx#6hSiJ;*r@b`j34eQq#;D-fJRA9 zorjN{>#^cFCxSLUgh)=^9ryYd8UPHJT1Gs{k)`U9qS9QDTvSFhM>TNjxteWJD|%&h z3_J?7zMtlOwlL}Hfuhx%-u9c^>pd~LD<@u2mP9CO%g66ao4o)p!1#BMB4_jvwjXbY3 z_+NS~39b17%)dT^pLo<;*`SSghIRKBZ7VCCvOVn=#t{*zKN@+m z*V`>jQZ@U3YJve!bMv`Xr!VB$2z^gb_Z*8dZnH1%`>*o*a5DnezA-$&&KF(BLFxTC z!VF;R$DzCZf`^Vh%_Qb-_Svpjk-=DDfNQ9RAvv>rNZ=??#9Y<91WfYVdO#VnF>9K7 zE@NSiA#WGI+k2mm_TX9&E%0g?5gzg%_W{il)40vnI zwbJr`q{=;&006#ODu&mg!eOA$t}B=`wuj(#_~ z6eE-S3ZIS+uK!w79h(1wVJ#?v*M5qKQ~<8S2YMMu97oM;X0ps|evrR5fV%KZSm4ye z-!}-SFp6^!u+P-7Bw7`iiULVg J}uaj?&Hsjn^T6VO7prs{>WHtkv3o(v~Sb=oFpvOP z{p<>8Q=#qlL_YJVySCsz?VU+&asI3EEwP_KJMN6?aG~5j)T@ z8w^5w+UaFK7^|WW37=ha`qL148Q_r0nPTr8&OQj8#Ro0(i4H4f2@fc~K7Mo2ae|XY zF7kdGnq>z377HK#CWTMh&W9Zydd%S@P??s~%C@Br4?w*hfN5L=;LHc1cG-tfyBFgN z&c`kpg4XHDKZ(vUbY5=Ax7}acE(@om9{YQ&SgiW;F9P{%TFEgVSMLy=56xj;l!Pq_ z6fUbDfcA!7+`%%iAXqvS1C$iO?}dOR^$0iZNzJZ1nv~H3kfdA>;J`MUWl==Ti?ZBh zke~G13jAt2-1{y|#ny$=7X|}*xTsy32EZumxr1msdpfWE_TZ+EOx*nn`g6)fk80MY za>H#3L7T)!tL?$cqosDKV`vre`egcJmum*qavS-fg;GB$c~{rakTk{0Y8aKSpCf2z zvx6IP`_bYHjL_~^k^-$fC;XT1Khj~t?DyO%_74gCsU4cvU)wgp!46(Aw04~#Hxa2I zz~|}&^CROPydwO4(9y^&#_eS2^V8pbA^=sc-?{#8%FXBOPhzA>xvoWQ?!!G{^Y0ik z&4G?11yyrw!`C?Bk@KIc)Hvb$N7aWx#ewi1+R`_)2gcIQ%zfUtC__B2wHx%A>MGyj!6}v5>A}Ee+KHC_07+kFurmlJU3x092~AZTasZq`WL8DX-mh zlMqi$4wXO|)zA=5Y@GIo>$w`XuVHXnObnqFsr93EBN#A$Nit56EAi_c1C=ANjhuQd z-^6ELc_S5`*DUcQOkzDaRfAhavfo$-6JmUSv&x-u^ah(}cYm^_4mM5=eVtQ%O!)?d zozWfeto6Qjdo|vF)Hrtr7?+>#Z9Uw=MuY5i@>~!uv4_qVk+@B%Kx?8xNT$!Ku#C1| z6T=Nzbo8?4Es`@gPv>pQsAd~%iM0;;M72fvuq+gIvOQwCtLc-0o?@Rv>oLj_#5TIo zW5Ltv>!-dS6S*R_o{bHpWecq_yT?HYq{#BI1AA!{iLbc4!+NfcP6c-|;EP9TN1gkz z@4>y&6ei7F8gAo`3woslBM$58YHOv7I1lNeI2bYzmXfD7d_4n+>q zk;(oV9Fd9&6+a3rP>ty68m=pcH^P{~%GFqqNU!syS2Zm+&@hlFrfR!MV=q94vB!xX zeUD>F&SSGQoV05f=0Z6L97T){FaD91FMA4}lth#vS4Go&FHC>kS899Ygg#OVnwWxG z6Ix*AgKMRU7KC#;sv@c(2rDsYV_mo6781P&f*3YN5i2#uii9FzQbew1+~AFA?W#)_bKZF{5`#EnkuZM=pjk*m>@!8uYn5 zN9l+h4$;w%ShryCgtY?@&_k%`V*J~^C`m=O=w1=mpJIg%>mx%4tv6X12JG6^P8GIV zxlcM@WHBHUaGhUQjNWyM^pjc&9g`^pR4D>GWjm`xDbBLUdx5UlJHiFY{l|Hmq%ikY zs|~8%Pj-3zIpV!8wf*xc|GF(kx}+$w%c44XK^#bX_>{z!lq%(A6o(xTxweo=@xSRt z-C|+l``L86-vtl5E)0iLmiwKA9Gtt!lx zN*TRYG8vYG>G8~81Phd=nrGdCv{wxPT%MoTSoOhr`$BIv=({eD(=NC zh!LdQkT;|H=D25n1_LfKQys?gljg#>MhmaM4oNG!?uN~&~ zP`Og|n^-(-Eok|PrbTJY5Snx)d1cr4*I)a~#$$y9Xg^&*_C0P_Ul%=-NGC(QV3>^6 z=N_YvUJbf_);=3udH@NzyPWo`Nuh2+B>TPKE!|iwMYRYO!CnIzITj?)$WMpdb7PETr9ER_HH~VUy zb)A3nslE_=^!`uMF6I{?S6~kID?3(Wf{@tF`Dw~Rw%bZdBp}i#Pa)~WD{qcz#>UUO z-pN}VSHK$UoJ=~Um1QjMr%%esgb9YUH+o;BJIS?#2SGD1(S%jDwvKW;b8>Lyqn|gR z!gQ42Ve@@Hl*E_VKT%JM2M|HM3VpRq;ItQHFqeyTM=ZWH$}0K(pW!TsmPHePCDAh* zIw7aOQ8RLEyBG_bN2T^6A(d0Ph==U^%=;c(5od5nnSEeS8SRPwt1=Ca45?&{)fl@y zI@kJbnBFqU56{O};s7If){u}A@_1X;%Z4IxvpgG*(_sbpL__*q9a2j-4sC}v**+&F z%${afDyA}OA))9-jMX3sKjFg&e1_H&7DplOY+dmeCvVssy)_OuX(J0H2%5kT=| zm^jJ!Y|xx@H$I<0%XPAU{N+!;MN4kk50W@F0LQCLFQ&ZRQcd^!Km)x=*dAS2xb)Sb zJbRgE@;g+<{($y;nH+%z`MdQRXeKGSZJkjSSeTR!yu1omG)9BWF#T>Q8Mc%sOsbJ= z@#J206py<7Uex^E$=RirF@=43m(PG#xBo**UE@WXvQ~o;>~EUh=P%+{+0ZX`2XD)J zMpXSE?`2Uixg5E;q`*m;@4U$vdX@FjQEs(eC_)D&_~-~cXf}@6*Ghhp&b}aq#P4kM z%%VO)3sGab{{(Y9>N;L0>^&|a=_jS;mO^E>6nfLElGu|I9T|v|Pf77J)=V{+oJ8!o zKxbo57ns}3c+S9GXE)v;K|=C@m~29mSihyDy1JXR%7vZ*gZXi6&%phPu#%vxb@LMU zUCmE#5(>wtFg=u}W7_mG4NkS8D8QmV7uwehM(Kqruf39dw5T($=Y3Lz6_4ucHP~32 z`Q0zX^h_putoV*!4S~$+9XdkNcfQ7nSh{XQo#Bc+E`>wy;PWL$VojN4_%%ocg*hDD z_=XZb-?P!tv{|pqteJL8Vl#2FdiaPP>3;`by2;Yf?e_I;8Svk7j#P^eHt&BU&eWq?*yFMSZO*dyPZ#8=-*{S&Wa+!Q2Nm z_}Ym11$Oher=`Y9(Lbtjz~;s6j8F#QWuz704EcrihHPt4053$4vqwBKB%TvLw5$fA z60j!D`7+ppI@%?z{)2_Iwsi@QW0ExOg!0(&0OR?Z_8E0|qpC2{i3A7bzS=RdlRrkg z3k^2yXt#mez4^_D;JjEt?pbv-=>{w?_A&b|;Hnta4XaKp2KX&wYbh`5HITWbo8O$N zDT&z<0~ti=wqIVx?0=SL)3w@0M`nuT2U5)up$Wd z7|6vhW0m;I*`l<6kGjg&?XV$r*BVHCqq-dz-4UL{qAu1Mfg=yK0r+^ki5%JeG}|f< zR})PH`L>q|Xcp^Ht^5Ri*3{Q3!nvKa!c1zGEiKSE@~T?$r#Lcy)|e zBv6Ff-yEp5aV1fSw6?V@yN>_G|Dw+01KN9kB6iSzi`Pt1wy%S}ds^Wv>bg%SrQoEk z>ZVYOeze7WHt2+@?P^=E2GcVleOE)vutp`7og!s$OiApt96to`g`|@0^rB?o97>Gs z6s9{kV=|#p0(L1vu2!2F9m%i2Q{8T*(^rT=)IR2Bp-nb5Ve25m1~bN!B1rPEVNTzI z8X$G}-VYGtM%3*Abx9+?p?_Wb6TjK*)N9N zzW!`%lfggk38n6^u<6AjwdtNK#lg~du(fp?vp`ZBJg~CKHZ*cQNEefRyIc8VL~cD3 zrb$6@H33e&1&4qPIZ$Lu7KhWg7BtgPBPddh6h*SCs(;}0kxh%ZTDQhOk!2O)UY@Ko zE{+t{q`7%nBy9_^Zb5!k=L4SNn3`0slzxIL)ygQ9{#IumLnTZ4FnZR$iDmVe|9&e- zC|TBVzWQ90cUMTn5?clBbmaZ)1*pnb!PUZASy%VhYe)lQB}bo`frUbx=(PYiR;k8y zOcX-iI_M$#7q@po?G6@qCSN^4cq*Q7);<0G41zg4;z%E4r1l<`Vk`y)o1!QfAny!7 zi`{A}9a!!~T^2x*QCT^v2C&}?hEpQ-qP`jq5J3h*2Cj~^-l+W_Ut{Zi&wo-o8m8}( zIqHvwVO?cz+_H6UaW!FjxrHugxWc`g)0jT|ZJxVZ2AAXlb~xMMS`_ocssa>3z;%DkorlbW=QlGF6vs_6ow#Q6*N`|xT+uVx9Scm zUWS=E+;Lg{8_EhCgf@)@_6mgHBf<6?&}9Td0Lt_iCDti_XDWU&Dq!$g(z5* z2YSByd*0v%hv}D-)iVY9r|#@lVS-bqrKfr3+^()bo7`r3tvSY$RXK+;ag8v?wt`km z4TmbloJHj)VL{3SrQebZE2)|nlngKgGQ|8>`QCJ|*APhAxQZ;e`{osTfAGDQvx7`F zJ^~5H1nzj6yvPUg#^dQ5fRsoK9TVX~K0r}9EETOfJe+=Xr`obOD?PWhvi^$;x`1nG8YW1|FJj5j!cM%k zR~FDW#gLQCYxmf+aU=Op8>5oua3p2Xd5Q(M-*7`y^tr(ljfaNm>9+rJDckuWsVg>I z8MtOTQ{vBS8>PO^ifxsbL^$)aS#EXfNN+*P@bY-aL;GKU`%(|RTqF9dDYmlbZ;SZ9 zU)nr^Eh;!l68`J2{ksEYrwj05_*ng8{?u9qWZDKg8oVOSlke&w5YU*U}$KT}W|9Pp*{K$a| zc^C8VbNOFC7*9Qm53jSnvi z8eJ3B=YRg~^Yy@Iv(vpN`{y*)zpl;yT=qM+7%+>D&0`y&>gp+xwgAQbE(&ZoYiB&$ z(Za$)ZVK#`G;Y0puW_SNW5|AIc3l73J-;G0 znk_21qj&wr&XX=k&S0PbO(Cp9s5fbg>x$NXp{gKd|4-ZaJk8?`hNibnd3M5Fwb+e{ zx&Z99OmM_*iw)djM5FjF4^QL8(V5K=VgC$ zz3aFK1Yt%{pLTbL0Uq|D{;s(qoNT}I)Qy>mcm1Y~0iH?D?(C}LQ$k)H(s{wx1- z|Eu;(QkkjyinK|3o3TA@7{b^UaTx7Jzun1MvB+=rX(CpGHUon(S>M0kA>G?DG}SGc zPQJpccNefZU_9B8zoETd*c+ZSxBobmdpai4rdW8huw$ehMKoIByeZ>0X{3><|8f0l z`_#VuW%FMPZ!?(9W=e&bSy-a|t8A7OTJ{0vL)z+LQ@Ug4cP_5UUGrC`JM7gsqPN4? zf|oS5tCa?sXF6J$cHeug3|epO=9^S*E;yM8Tkn3Q7yn+GwHkGS7&&%rH;E6tBwXB$ z`p13KeU1ONWj&PKLFb{5?=~DDnd+PZ(BSqU|M`TkT@O8J0kUD(`^%{Xg@w9NVAef= zcu?~=q(~5s!~(mr*wY3w6q^;&ga^=36XIm`Z+1fg_<9d;t z&us9$$I=NLQXw06aL~N5VM;D??fr-gQ^@2Sb@^_jscG3hj%H)h`LHhA89<52@|nte*h+3oLotMFMlA9JstTr)(E7|<{>d|jC=)JZ?=G%qHCMA zf&x~)6E#7oRDf#cEingjH3Qv0T^_Oq!1z4y`OZ&q6p@zF(WhSvgkAEzfUJTptBCPny=x4rwkgT2WI=w)%tHLXoSv82z>nDCf%k~(*LAFz?} z`7a?Aaz3ueQ%>6jyHVsdAKB>GMHscro?d&H>L{bKXN{c&)X-PRhT4~^0XfQa7GcOT zziQ#(w}*=NX-D`S2j4Gj>nWR2QE+<4nP$J}EsqU;(O~pVZQbl%_OTVz`EmSsZb_;gIm z#VvXd3WvPSojAdetL_ZCTpMUwjjabdb>oYT_O|=5rY67>KQt&Q{`TFm-i3pKLEXV} z+n_W$2BDJ3T{+NEYjYd8PfYx@479?&#%~OyJ9g~9`Rcyk_z~e7_qeE|il~Vu{#2oo zM<9|1yLR)0jGxem=*`(vXh{tI>nzZTHAAtwYx8Kj&^VxpTwESRe0eFDP2-S*E1_Zq zAeI>`uD^+1ZK-8!wkfjYDRciw7|JjnXk@u)eFzB4_@SbzYPu>>+&wEyNVDyQ9Tep?_@-e4xNV0+XFImV0LNGFVb$MJ#&bhBr!rCkW6O_)W{bQKf01 zsk}C8b-Rwy>Wojk4`#wUZoQ@#rJQW07OfDe!si)`lE^P7KL5&N?o|w5G$Za})uyOR zKaBk3e3e4&Lsi2-``Yd2UeM7--B5NcFjC@OG#7g>$x@gjOe&cjgm- zD%(Xd$8%Eb!^#V)LS^?Ch`*jgE_usmd7F5xDwO`VUZ*oZNm84sV^#`)KQ+%+7S8=4 zZUW!MTb&0=EW&Z~pGzfQPDg((xA89`8Cc3@iweyjv>pB$E0h{KXA5FLF2MrY#jq9M zLqwQ!7-jj>T0RnjPbr)(z>?BhPUY~`iN}1{%Kh59=n-FXYipn&@sp+kN_h^WW|ar5KHeIV;lM?y$oDz=RJ}v zD8WF8n*lm{=Qq@()#fkZ)8vGa( zNK>Wnwh!tWSU)Y?9F47RlbIy!H7z}tYLF$juIInv`$}Z4 zZTvuVr!?l4daM*@>DzCD=u)l-exyX8_Pety!4b~B4UROc(jy_iC#Qv&b8Q)+NjROI zfZpsDtL9E`oi~FRABS>0c5?$u16uun-}FGqvSi}bf*r0mTOAL^>UW(M*lTxBNTaka zKX_ddv@PM_P=+51QJe@{_gNV_#jTl_D!z79Sd$4$7E@pWYVT|?F3-h@sEV< z)KrRuWVr z8bu8!iCI5%&m~$Z##a}8&IcLRWpG)rpGdMVdb13)wl1+5fjgwFp?-ERJ`vp4d5@^P zFFO|#orXd%6+9cl5gV5lMB5@`+FCkvAU%2)uNa?uCF9wNFna}=(aW~j{pQI~t4zJ_ z>zgu^z~a8UJXahU+Yz!WgO<$U;C~cuZ%4dwZ zjlylINw0^)0u3J{kp1jKszf0lXW7OJHG17$WDZP}ScXG_MekY9@1!zv#r>s>>4bbw%yVVUGg@ZNjB=JC0X#~U1W^P0GY`V>9N zuWIh3S~L4|h5Jk6lBwASX>fgB@kk8R zFOBiE+7}EhWhth0w9V+F77GY@GZh3Cb1GNOYTe#z zfWZA*I3+;&k zSKlaB7%yf5|c@%`i-bBQQi{a!Z(2E7{M)fEB2$+ z3|sp<@Ju&XO1d;5@%>~IbbmL9-wl}qZWs)uq7v=CwxhDUwbddW@*jF%qd(`Q|5K7f zpd`~s!_VD#EvhA57Uj3Q@S@OSruietX{e(C@?O-n;bD!6yZ>^Uf#Eft^x$Te9T=NQY)^0Pcnkf_g_so8#HzTw%7H_?7`Ox#gx~G>n3Y~V z{^ICY5$2(5X@Y~@&f99w>yW#p`9 zpUpo}Uq-c=7B;4wxwF}wHA^?TGK|GXk{koJNBywGu^j=l+loK8UaI&WkTP0dY^_oB zTN?^sw6#_&V3h~eMMKJm7jtBN@(^ZT}d5*DduaEe%H5Uh1|GJVpP(g9AzF>)B!I#&cgl zn4+!mG$5s4!*{+71&ks*gva8}K zAmu5gzs3==GYuPGS^tFESY!FwYrE^@&>|MNf@R!vf`U+*oP`h092Zg!%4hYia&RS& z9aT}_XgStkk&wy?MqdgEo7TJb;M?2WU<|@}*VPqhsUvU$( z{HC>Kn`>4wU{$fJ6>`${bxNiPXGa~k7x8F(=hP(=kIjXr#S0WKwiXB7J~=R!=dt?> z6f78jad}InH!fg68M%2x?@5xzYr7AlbLA#&?(^&GE2CxX5h+_^vBR6yC@4!?;{_{{ z;`Wls_P|mcBCitte%#>M(+Mda#h&?Y0`gn2Bz{!+XCq!+tv(r|H`;i>MxXpbM5R%P-V#|V;^?dwyB%Tq^5V5eR5!iA z_7v_UXTn6QTfb_)aYvh(lipbQuIG1KmLCFkJ&(Z`J_gMT*GGfrzB;S-e0idM?{@7K z9mAY?`Q@SDd1(wiBHm~7w%ZCmFlB|(e>;bIPC58g*CHsP^Dz!SWO}7xXlIGsSFJ6q z>mD}Z;Wkk41!P`rb|nY>49zKCbJ-){E^2GCB5hXluO60;%5(w zfM8(lF`T9?K8B732W}Gq%b@ebn|zBkAk6Zaf+D3$HF@yyGC1L=%gPw4ulZZi8X^LQ znPPekxAdLPe76oxl4}y_)K3z7tDgTt)bmSAcBq-M37z#~&uWVil=V1l-(EQ!R|#x0HSJc~95gaRu@ArledS3(`LTf+hLpU*#W(lX z*9)DQXCFVaZ3W#@E)U7)S?nKCoJUtl_}~a7?qJejdXLUd@{a`aymdQy?E2PNuPy^Z z23jITu=GDyNXN(`pc;0BhL(=8!{!0Bpk97IXPox*b;`C$<$;*omn&YDQugTFAT9E?@S^bOl{b7ja`fq9rh}XWfjS*i|@V94?m0$j+1)T2z&)_<2mjRli-Hfu;m_T6Od z?oC@e%ZO{nx>C7X&i(wUKd7NVbvyppEzRE~=E%zyBmUrQG6||YX?q=c4?ev2 zIc8&iwxSIL6P!Le*CWRu(sO_p>Dfe{3o7~4f70dx&J#acWw#lZvwGwoKDnWxD%>T# z>MIN^*_1xBQe>03GZDMCF!)21)30Yg5Yk7$byi)*y;Uh*{M(ZhB0cc6ORTlS>x9+i zb3`k9mbr5k9CYd(VK(@O4NB;tD;E?<87Kdr0RLeEi$Hf$7)#ETTa#>mk>js19uAfX z>1Y=)z?Z*X`s0bJC9QgD+1(GkOm{mAU$pdjEua ztwtjV4Ns1`aClWE!UByh`u*kqo*s7O!7=&>`BU~h=s!R3?-l=dZo){Zk(-A{uf;Ic zc`-2VS9@6te0x*Z+&i~vjUTYnbUB_l3w28^CLy8fsm0a01MGiW?N75ieNtVU zHZA5GCI2$Cz{u#mkUOt&*wbJ!fyPTG;R=WR8K%kyIFwHY^)D~~d~+n=x5&>1I){OB zg#;SkVzZeKFaGrhfRxwD=YIk6ql=LD`?eu?m@yojEE62Zk6kjIVDx4R|2_T}ARPcm w$AJGA+t~rOv-9d@J?x+VIpIG(GO`%=^fyV7rHVdRJOVs)wV;{>>USRgAFSx@S^xk5 literal 0 HcmV?d00001 diff --git a/docs/capabilities.md b/docs/capabilities.md index bfb8181f..1ddabd62 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -233,6 +233,97 @@ Here is an example `trigger` capability: If an integration only has the trigger capability, the word "trigger" will be added to its name in the LaunchDarkly UI. For this reason, do not include the word "trigger" in the manifest name. Review the [generic-trigger manifest](/integrations/generic-trigger/manifest.json) for an example. +## Flag link (`flagLink`) + +The [flag link](https://docs.launchdarkly.com/home/flags/links) capability gives LaunchDarkly users the ability to associate feature flags with resources contained in external services, such as Slack messages and Jira issues. This capability is used to apply custom formatting and metadata to flag links that originate from your integration service. + +For complete examples, see the [Slack App manifest](/integrations/slack-app/manifest.json) and the [Jira integration manifest](/integrations/jira/manifest.json). + +![The flag "links" tab showcasing Jira and Slack links.](./assets/flag%20links.png) +_The flag "links" tab showcasing Jira and Slack links._ + +The flag link capability has the following properties: + +### `header` (string) + +This property specifies the sentence-cased title to show for all flag links for the integration, e.g. "Jira issue", "Slack conversation". + +### `metadata` (object) + +The `metadata` object specifies the shape of the data the [flag link POST body and API response](). Additionally, the metadata can be referenced in the visual representation of the flag link and may be indexed for search purposes. In the integration manifest, the `metadata` object is a mapping of a metadata key to a metadata value object that specifies the format of the metadata item. + +For example, the [Jira integration](/integrations/jira/manifest.json) has the following `metadata` object: + +```json +"metadata": { + "creator": { + "type": "string" + }, + "iconUrl": { + "type": "uri" + }, + "issueKey": { + "type": "string" + }, + "issueTitle": { + "type": "string" + } +}, + +``` + +### `uiBlocks` (object) + +The `uiBlocks` object specifies the look and feel of the integration's flag links in the LaunchDarkly UI. Any combination of the following properties can be specified: + +- `image` - an object specifying the icon or avatar used to represent the link. Handlebars templating can be utilized in the `sourceUrl` field to reference metadata submitted by the integration when the link is created. + +- `title` - an object specifying the flag link title. UI block `elements` are used to provide design flexibility. + +- `context` - an object specifying additional information about the flag link. UI block `elements` are used to shape the message. + +### UI block elements + +The `title` and `context` UI blocks take advantage of UI block elements to provide flexible formatting. A UI block element is an object comprised of a required `text` field and may contain one or more of the following properties: + +- `isBold` (boolean) - Whether or not the text should be rendered in bold face. +- `isTimestamp` (boolean) - Whether or not the text should be converted from unix milliseconds to a human-readable format +- `url` (string) - If provided, the block element will link to the rendered URL. + +Both the `text` and `url` properties can include handlebars template variables to reference metadata submitted by the integration when the link is created. + +For example, the [Slack App integration](/integrations/slack-app/manifest.json)'s `context` UI block is specified as follows: + +```json +"context": { + "elements": [ + { "text": "Posted in" }, + { "text": "#{{{metadata.channelName}}}", "isBold": true }, + { "text": "View message", "url": "{{{deepLink}}}" } + ] +} +``` + +This results in flag links context messages in the following format: + +> Posted in **#example-channel** [View message](https://example.com) + +### `emptyState` (object) + +This `emptyState` object species the message used to assist users when there have not been any flag links created for the integration. The `emptyState` object contains two properties: + +- `title` - The title heading of the empty state message. +- `leadText` - Text or markup content detailing how users can create flag links for this integration. + +For example, the [Jira integration](/integrations/jira/manifest.json)'s `emptyState` object is as follows: + +```json +"emptyState": { + "title": "There are no Jira issues that link to this flag.", + "leadText": "Jira issues connected to this feature flag will automatically appear here. To learn how to enable the Jira integration or to connect an issue to a feature flag, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-jira-flag-links)" +}, +``` + ## Reserved custom properties (`reservedCustomProperties`) Custom properties allow you to store data in LaunchDarkly alongside a feature flag. For example, you can use custom properties to indicate flag-level associations with data on your service. If you don't have any flag-level associations or configurations, you don't need to use this capability. diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 23f34948..8fc57cc1 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -404,7 +404,7 @@ export type ProviderFormVariables = FormVariable[]; export type SuccessPointer = string; export type ErrorsPointer = string; /** - * Title to show for all links for this integration + * Sentence-cased title to show for all links for this integration */ export type LinkGroupHeader = string; /** @@ -420,7 +420,7 @@ export type LeadText = string; */ export type Type1 = "string" | "uri"; /** - * Url of the image + * Url of the image. Handlebars template notation can be used to reference metadata fields. */ export type SourceUrl = string; /** diff --git a/manifest.schema.json b/manifest.schema.json index 78796094..346f21ab 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2945,7 +2945,7 @@ "header": { "$id": "#/properties/capability/flag-link/header", "title": "Link group header", - "description": "Title to show for all links for this integration", + "description": "Sentence-cased title to show for all links for this integration", "type": "string" }, "emptyState": { @@ -3037,7 +3037,7 @@ "sourceUrl": { "$id": "#/properties/capability/flag-link/ui-blocks/image/source-url", "title": "Source Url", - "description": "Url of the image", + "description": "Url of the image. Handlebars template notation can be used to reference metadata fields.", "type": "string" }, "isIcon": { diff --git a/schemas/capabilities/flagLink.json b/schemas/capabilities/flagLink.json index f954447f..d6f2ec72 100644 --- a/schemas/capabilities/flagLink.json +++ b/schemas/capabilities/flagLink.json @@ -13,7 +13,7 @@ "header": { "$id": "#/properties/capability/flag-link/header", "title": "Link group header", - "description": "Title to show for all links for this integration", + "description": "Sentence-cased title to show for all links for this integration", "type": "string" }, "emptyState": { @@ -83,7 +83,7 @@ "sourceUrl": { "$id": "#/properties/capability/flag-link/ui-blocks/image/source-url", "title": "Source Url", - "description": "Url of the image", + "description": "Url of the image. Handlebars template notation can be used to reference metadata fields.", "type": "string" }, "isIcon": { From 9e2f36e5f302bc21ac79de465295e21d40483796 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 8 Apr 2022 16:38:14 +0100 Subject: [PATCH 518/936] [sc-138415] Add tests for flag link capability uiBlocks templates (#345) * Add tests for flag link capability * update CODEOWNERS --- CODEOWNERS | 2 +- __tests__/__utils__/index.js | 17 +++++ __tests__/{utils.js => json-escape.js} | 0 __tests__/validateFlagLinkCapability.js | 81 +++++++++++++++++++++++ __tests__/validateIntegrationManifests.js | 20 ++---- jest.config.js | 5 ++ package.json | 5 -- test-setup.js | 3 + 8 files changed, 111 insertions(+), 22 deletions(-) create mode 100644 __tests__/__utils__/index.js rename __tests__/{utils.js => json-escape.js} (100%) create mode 100644 __tests__/validateFlagLinkCapability.js create mode 100644 jest.config.js create mode 100644 test-setup.js diff --git a/CODEOWNERS b/CODEOWNERS index af8cb6ae..a34044fd 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,2 +1,2 @@ # These owners will be the default owners for everything in the repo. -* @launchdarkly/integrations +* @launchdarkly/squad-integrations diff --git a/__tests__/__utils__/index.js b/__tests__/__utils__/index.js new file mode 100644 index 00000000..344e5b5e --- /dev/null +++ b/__tests__/__utils__/index.js @@ -0,0 +1,17 @@ +const { readdirSync } = require('fs'); +const getDirectories = source => + readdirSync(source, { withFileTypes: true }) + .filter(dir => dir.isDirectory()) + .map(dir => dir.name); + +const getManifests = () => { + const manifests = []; + const integrationDirs = getDirectories('./integrations'); + integrationDirs.forEach(dir => { + const manifest = require(`../../integrations/${dir}/manifest.json`); + manifests.push([dir, manifest]); + }); + return manifests; +}; + +module.exports = { getManifests }; diff --git a/__tests__/utils.js b/__tests__/json-escape.js similarity index 100% rename from __tests__/utils.js rename to __tests__/json-escape.js diff --git a/__tests__/validateFlagLinkCapability.js b/__tests__/validateFlagLinkCapability.js new file mode 100644 index 00000000..9ebd6a8d --- /dev/null +++ b/__tests__/validateFlagLinkCapability.js @@ -0,0 +1,81 @@ +const _ = require('lodash'); +const Handlebars = require('handlebars'); +const { getManifests } = require('./__utils__'); + +const getMetadataContext = metadata => { + const context = {}; + + Object.entries(metadata).forEach(([k, v]) => { + switch (v.type) { + case 'string': + context[k] = `$${k.toUpperCase()}`; + break; + case 'uri': + context[k] = `https://${k}.com`; + break; + } + }); + return context; +}; + +const getFlagLinkContext = flagLinkCapability => { + return { + deepLink: 'https://exampleDeeplink.com', + metadata: getMetadataContext(flagLinkCapability.metadata), + }; +}; + +const compileStrictTemplate = templateString => + Handlebars.compile(templateString, { strict: true }); + +const manifests = getManifests(); + +const flagLinkManifests = manifests.filter( + ([k, mfst]) => mfst.capabilities?.flagLink +); + +describe('Validate flagLink Capability', () => { + test.each(flagLinkManifests)( + 'uiBlocks template variables exist in metadata for %s', + (key, manifest) => { + const flagLinkCapability = manifest.capabilities.flagLink; + const templateContext = getFlagLinkContext(flagLinkCapability); + const { uiBlocks } = flagLinkCapability; + const { image, title, name, description, context } = uiBlocks; + if (image) { + const imageTemplate = compileStrictTemplate(image.sourceUrl); + expect(() => imageTemplate(templateContext)).not.toThrow(); + } + if (title) { + title.elements.forEach(e => { + const titleElementTemplate = compileStrictTemplate(e.text); + expect(() => titleElementTemplate(templateContext)).not.toThrow(); + if (e.url) { + const titleElementUrlTemplate = compileStrictTemplate(e.url); + expect(() => + titleElementUrlTemplate(templateContext) + ).not.toThrow(); + } + }); + } + if (name) { + const nameTemplate = compileStrictTemplate(name); + expect(() => nameTemplate(templateContext)).not.toThrow(); + } + if (description) { + const descriptionTemplate = compileStrictTemplate(description); + expect(() => descriptionTemplate(templateContext)).not.toThrow(); + } + if (context) { + context.elements.forEach(e => { + const elementTemplate = compileStrictTemplate(e.text); + expect(() => elementTemplate(templateContext)).not.toThrow(); + if (e.url) { + const elementUrlTemplate = compileStrictTemplate(e.url); + expect(() => elementUrlTemplate(templateContext)).not.toThrow(); + } + }); + } + } + ); +}); diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 2706afa4..86432b2d 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -1,9 +1,9 @@ -const { readdirSync, existsSync, readFileSync } = require('fs'); +const { existsSync, readFileSync } = require('fs'); const Handlebars = require('handlebars'); const Ajv = require('ajv'); const _ = require('lodash'); +const { getManifests } = require('./__utils__'); -const { registerHelpers } = require('../helpers'); const jsonEscape = require('../utils/json-escape'); const schema = require('../manifest.schema.json'); const flagContext = require('../sample-context/flag/update-all-environments'); @@ -15,13 +15,6 @@ const OAUTH_INTEGRATIONS = ['appdynamics', 'servicenow']; // add oauth integrati var parse = require('url-parse'); -registerHelpers(); - -const getDirectories = source => - readdirSync(source, { withFileTypes: true }) - .filter(dir => dir.isDirectory()) - .map(dir => dir.name); - const getFormVariableContext = formVariables => { const endpointContext = {}; if (formVariables) { @@ -64,16 +57,11 @@ const isJSONTemplate = templateFilename => { return lowercase.endsWith('.json') || lowercase.endsWith('.json.hbs'); }; -let manifests = []; +const manifests = getManifests(); + const ajv = new Ajv(); const validate = ajv.compile(schema); -const integrationDirs = getDirectories('integrations'); -integrationDirs.forEach(dir => { - const manifest = require(`../integrations/${dir}/manifest.json`); - manifests.push([dir, manifest]); -}); - const getTemplate = path => { const templateString = readFileSync(path, { encoding: 'utf-8' }); const template = Handlebars.compile(templateString, { diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..b487eb81 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,5 @@ +module.exports = { + setupFiles: ['./test-setup.js'], + setupFilesAfterEnv: ['jest-expect-message'], + testPathIgnorePatterns: ['/node_modules/', '/__utils__/'], +}; diff --git a/package.json b/package.json index 444c8ffc..ca6fe4da 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,6 @@ "preview": "node preview.js", "curl": "node preview.js --curl" }, - "jest": { - "setupFilesAfterEnv": [ - "jest-expect-message" - ] - }, "repository": { "type": "git", "url": "git+https://github.com/launchdarkly/integration-framework.git" diff --git a/test-setup.js b/test-setup.js new file mode 100644 index 00000000..ab20ff4e --- /dev/null +++ b/test-setup.js @@ -0,0 +1,3 @@ +const { registerHelpers } = require('./helpers'); + +registerHelpers(); From ec00dc6fc3ab9721b1b2af9026a24a72f3e60815 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Apr 2022 16:49:59 +0100 Subject: [PATCH 519/936] Bump minimist from 1.2.5 to 1.2.6 (#340) Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4a40a2bd..78b639b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3982,9 +3982,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/mixin-deep": { @@ -9447,9 +9447,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "mixin-deep": { From e868e22154e72f6e849bc7dd1b71a16a690dd2b1 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 14 Apr 2022 09:33:35 -0500 Subject: [PATCH 520/936] Added flag links capability to trello app --- __tests__/validateFlagLinkCapability.js | 4 ++-- integrations/trello/manifest.json | 31 ++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/__tests__/validateFlagLinkCapability.js b/__tests__/validateFlagLinkCapability.js index 9ebd6a8d..f4727781 100644 --- a/__tests__/validateFlagLinkCapability.js +++ b/__tests__/validateFlagLinkCapability.js @@ -30,8 +30,8 @@ const compileStrictTemplate = templateString => const manifests = getManifests(); -const flagLinkManifests = manifests.filter( - ([k, mfst]) => mfst.capabilities?.flagLink +const flagLinkManifests = manifests.filter(([k, mfst]) => + mfst.capabilities ? !!mfst.capabilities.flagLink : false ); describe('Validate flagLink Capability', () => { diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index b03f54a3..e4cad82d 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -14,5 +14,34 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, - "otherCapabilities": ["external"] + "otherCapabilities": ["external"], + "capabilities": { + "flagLink": { + "header": "Trello card", + "emptyState": { + "title": "No Trello cards link to this flag.", + "leadText": "To enable the Trello integration, [read the documentation](https://docs.launchdarkly.com/integrations/trello#overview)" + }, + "metadata": { + "cardTitle": { + "type": "string" + }, + "creator": { + "type": "string" + } + }, + "uiBlocks": { + "title": { + "linkToReference": true, + "elements": [{ "text": "{{{metadata.cardTitle}}}" }] + }, + "context": { + "elements": [ + { "text": "Created by" }, + { "text": "{{{metadata.creator}}}", "isBold": true } + ] + } + } + } + } } From 134228a39356472cc3681f4a562fc6ad68f8506d Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 14 Apr 2022 10:53:05 -0500 Subject: [PATCH 521/936] Added avatar to trello ui blocks --- integrations/trello/manifest.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index e4cad82d..57310bcd 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -28,16 +28,23 @@ }, "creator": { "type": "string" + }, + "avatar": { + "type": "string" } }, "uiBlocks": { + "image": { + "sourceUrl": "{{{metadata.avatar}}}", + "isAvatar": true + }, "title": { "linkToReference": true, "elements": [{ "text": "{{{metadata.cardTitle}}}" }] }, "context": { "elements": [ - { "text": "Created by" }, + { "text": "Linked by" }, { "text": "{{{metadata.creator}}}", "isBold": true } ] } From cf50918470597acea5145f2bbf29176cb643a049 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 15 Apr 2022 09:15:45 -0500 Subject: [PATCH 522/936] Updated Trello flag links docs link --- integrations/trello/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index 57310bcd..4a032590 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -20,7 +20,7 @@ "header": "Trello card", "emptyState": { "title": "No Trello cards link to this flag.", - "leadText": "To enable the Trello integration, [read the documentation](https://docs.launchdarkly.com/integrations/trello#overview)" + "leadText": "To enable the Trello integration, [read the documentation](https://docs.launchdarkly.com/home/flags/links#creating-trello-flag-links)" }, "metadata": { "cardTitle": { From b8f8a419ebfb11b0ada03951e683bccb00079bbc Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 4 May 2022 18:06:09 +0100 Subject: [PATCH 523/936] Update link to Datadog API key (#347) --- integrations/datadog/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index a956e1a6..bd62792b 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -20,7 +20,7 @@ "key": "apiKey", "name": "Datadog API key", "type": "string", - "description": "Enter your Datadog [API key](https://app.datadoghq.com/account/settings#api).", + "description": "Enter your Datadog [API key](https://app.datadoghq.com/organization-settings/api-keys).", "isSecret": true }, { From 482a0765703c0462f1cad088eb8a46af99e30516 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 10 May 2022 11:28:46 -0500 Subject: [PATCH 524/936] Added new servicenow manifest and created new manifest properties to support oauth keys and allow specific integrations to be hidden on the integrations page --- __tests__/validateIntegrationManifests.js | 2 +- docs/manifest.md | 2 +- integrations/appdynamics/manifest.json | 1 + .../assets/images/servicenow-horizontal.svg | 1 + .../assets/images/servicenow-icon.svg | 3 + integrations/servicenow-normal/manifest.json | 132 ++++++++++++++++++ integrations/servicenow/manifest.json | 2 + manifest.schema.d.ts | 15 ++ manifest.schema.json | 28 +++- schemas/base.json | 19 ++- schemas/capabilities/approval.json | 9 ++ 11 files changed, 210 insertions(+), 4 deletions(-) create mode 100644 integrations/servicenow-normal/assets/images/servicenow-horizontal.svg create mode 100644 integrations/servicenow-normal/assets/images/servicenow-icon.svg create mode 100644 integrations/servicenow-normal/manifest.json diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 86432b2d..f4c1f4e8 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -11,7 +11,7 @@ const projectContext = require('../sample-context/project/update'); const environmentContext = require('../sample-context/environment/update'); const memberContext = require('../sample-context/member/update'); -const OAUTH_INTEGRATIONS = ['appdynamics', 'servicenow']; // add oauth integrations here +const OAUTH_INTEGRATIONS = ['appdynamics', 'servicenow', 'servicenow-normal']; // add oauth integrations here var parse = require('url-parse'); diff --git a/docs/manifest.md b/docs/manifest.md index fdca47a2..540cf368 100644 --- a/docs/manifest.md +++ b/docs/manifest.md @@ -58,7 +58,7 @@ Many integrations in LaunchDarkly use API tokens. However, if your API requires * [Client Credentials Flow](https://oauth.net/2/grant-types/client-credentials/) (also known as "2-legged OAuth") -With both of these flows, LaunchDarkly acts as the OAuth consumer. In order for this to work, LaunchDarkly needs to store a consumer ID and secret. Contact us at [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com) to register your OAuth consumer details. You'll also need to set the `requiresOAuth` root-level property in your manifest to `true`. At runtime, LaunchDarkly will look up your OAuth consumer ID and secret from our registry based on your integration key. **Setting the `requiresOAuth` property to `true` will not enable OAuth on your integration. You need to provide us with the OAuth consumer details first.** +With both of these flows, LaunchDarkly acts as the OAuth consumer. In order for this to work, LaunchDarkly needs to store a consumer ID and secret. Contact us at [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com) to register your OAuth consumer details. You'll also need to set the `requiresOAuth` root-level property in your manifest to `true`. At runtime, LaunchDarkly will look up your OAuth consumer ID and secret from our registry using the `oauthIntegrationKey` value from your app's manifest. **Setting the `requiresOAuth` property to `true` will not enable OAuth on your integration. You need to provide us with the OAuth consumer details first.** ## Form variables and capabilities diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index 56782719..ee7a907d 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -16,6 +16,7 @@ "horizontal": "assets/images/appdynamics_horizontal.svg" }, "requiresOAuth": true, + "oauthIntegrationKey": "appdynamics", "formVariables": [ { "key": "account", diff --git a/integrations/servicenow-normal/assets/images/servicenow-horizontal.svg b/integrations/servicenow-normal/assets/images/servicenow-horizontal.svg new file mode 100644 index 00000000..4c76a79d --- /dev/null +++ b/integrations/servicenow-normal/assets/images/servicenow-horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/servicenow-normal/assets/images/servicenow-icon.svg b/integrations/servicenow-normal/assets/images/servicenow-icon.svg new file mode 100644 index 00000000..f676f2c1 --- /dev/null +++ b/integrations/servicenow-normal/assets/images/servicenow-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/servicenow-normal/manifest.json b/integrations/servicenow-normal/manifest.json new file mode 100644 index 00000000..d4d7cf9f --- /dev/null +++ b/integrations/servicenow-normal/manifest.json @@ -0,0 +1,132 @@ +{ + "name": "ServiceNow-normal", + "version": "1.0.0", + "overview": "Create feature flag change requests in ServiceNow.", + "description": "Efficiently comply with company-wide change management policies by embedding LaunchDarkly approvals into existing ServiceNow workflows.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.servicenow.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/servicenow", + "privacyPolicy": "https://www.servicenow.com/privacy-statement.html" + }, + "categories": ["approval"], + "icons": { + "square": "assets/images/servicenow-icon.svg", + "horizontal": "assets/images/servicenow-horizontal.svg" + }, + "requiresOAuth": true, + "oauthIntegrationKey": "servicenow", + "hideOnIntegrationsPage": true, + "formVariables": [], + "capabilities": { + "approval": { + "name": "ServiceNow (Normal Change Request)", + "environmentFormVariables": [ + { + "key": "detail_column", + "name": "Detailed information column name", + "description": "The name of the ServiceNow Change Request column used by LaunchDarkly to populate detailed approval request information.", + "type": "string", + "defaultValue": "justification", + "isOptional": true, + "placeholder": "justification" + } + ], + "creationRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/normal", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\"}", + "parser": { + "approvalId": "/result/sys_id/value", + "statusValue": "/result/state/value", + "statusDisplay": "/result/state/display_value", + "approvalMatcher": "^-1", + "rejectionMatcher": "^4", + "urlTemplate": "{{oauth.baseURI}}/change_request.do?sys_id={{queryEncode context.approvalId}}" + } + }, + "statusRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/normal/{{context.approvalId}}", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "statusValue": "/result/state/value", + "statusDisplay": "/result/state/display_value", + "approvalMatcher": "^-1", + "rejectionMatcher": "^4" + } + }, + "postApplyRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/normal/{{context.approvalId}}?state=Review", + "method": "PATCH", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "statusValue": "/result/state/value", + "statusDisplay": "/result/state/display_value", + "approvalMatcher": "^-1", + "rejectionMatcher": "^4" + } + }, + "deletionRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/sn_chg_rest/change/normal/{{context.approvalId}}?state=Canceled", + "method": "PATCH", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "statusValue": "/result/state/value", + "statusDisplay": "/result/state/display_value", + "approvalMatcher": "^-1", + "rejectionMatcher": "^4" + } + }, + "memberListRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=email,user_name", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "memberArrayPath": "/result", + "memberItems": { + "memberId": "/user_name", + "email": "/email" + } + } + } + } + } +} diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 870508ab..a4cd7c39 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -16,9 +16,11 @@ "horizontal": "assets/images/servicenow-horizontal.svg" }, "requiresOAuth": true, + "oauthIntegrationKey": "servicenow", "formVariables": [], "capabilities": { "approval": { + "name": "ServiceNow", "environmentFormVariables": [ { "key": "template", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 8fc57cc1..7bf1d4f5 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -176,6 +176,10 @@ export type OtherCapabilities = [ * Whether the integration authenticates using OAuth */ export type RequiresOAuth = boolean; +/** + * Whether the your app should be excluded from the list of integration cards displayed on our integrations page in the web app + */ +export type HideOnIntegrationsPage = boolean; /** * A key will be used as the token name when the variable is substituted */ @@ -349,6 +353,10 @@ export type ValuePointer = string; * JSON pointer to the external alert URL */ export type URLPointer = string; +/** + * Name of the approval system + */ +export type ApprovalSystemName = string; /** * Template string used to render the JSON request body */ @@ -467,6 +475,10 @@ export type Description3 = string; * An array of elements to be combined to create a context block */ export type Elements1 = UIBlockElement[]; +/** + * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. + */ +export type OAuthIntegrationKey = string; /** * Describes the capabilities and intent of a LaunchDarkly integration @@ -485,8 +497,10 @@ export interface LaunchDarklyIntegrationsManifest { legacy?: Legacy; otherCapabilities?: OtherCapabilities; requiresOAuth?: RequiresOAuth; + hideOnIntegrationsPage?: HideOnIntegrationsPage; formVariables?: FormVariables; capabilities?: Capabilities; + oauthIntegrationKey?: OAuthIntegrationKey; [k: string]: unknown; } /** @@ -637,6 +651,7 @@ export interface TriggerParser { * This capability enables integration-driven flag change approvals */ export interface Approval { + name?: ApprovalSystemName; memberListRequest: MemberListRequest; environmentFormVariables?: EnvironmentFormVariables; flagFormVariables?: FlagFormVariables; diff --git a/manifest.schema.json b/manifest.schema.json index 346f21ab..0a408b44 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -20,7 +20,9 @@ "capabilities", "legacy", "otherCapabilities", - "requiresOAuth" + "requiresOAuth", + "hideOnIntegrationsPage", + "oauthIntegrationKey" ] }, "properties": { @@ -255,6 +257,13 @@ "description": "Whether the integration authenticates using OAuth", "default": false }, + "hideOnIntegrationsPage": { + "$id": "#/properties/hide-on-integrations-page", + "title": "Hide On Integrations Page", + "type": "boolean", + "description": "Whether the your app should be excluded from the list of integration cards displayed on our integrations page in the web app", + "default": false + }, "formVariables": { "$id": "#/properties/form-variables", "title": "Form variables", @@ -954,6 +963,7 @@ "type": "object", "propertyNames": { "enum": [ + "name", "environmentFormVariables", "flagFormVariables", "creationRequest", @@ -971,6 +981,14 @@ "memberListRequest" ], "properties": { + "name": { + "$id": "#/capabilities/approval/name", + "title": "Approval System Name", + "type": "string", + "description": "Name of the approval system", + "minLength": 1, + "maxLength": 100 + }, "memberListRequest": { "$id": "#/capabilities/approval/member-list-request", "title": "Member List Request", @@ -3215,6 +3233,14 @@ } } } + }, + "oauthIntegrationKey": { + "$id": "#/properties/oauth-integration-key", + "title": "OAuth Integration Key", + "description": "Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow.", + "minLength": 3, + "maxLength": 100, + "type": "string" } }, "required": [ diff --git a/schemas/base.json b/schemas/base.json index d2b6daa2..d8a4e42f 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -20,7 +20,9 @@ "capabilities", "legacy", "otherCapabilities", - "requiresOAuth" + "requiresOAuth", + "hideOnIntegrationsPage", + "oauthIntegrationKey" ] }, "properties": { @@ -226,6 +228,13 @@ "description": "Whether the integration authenticates using OAuth", "default": false }, + "hideOnIntegrationsPage": { + "$id": "#/properties/hide-on-integrations-page", + "title": "Hide On Integrations Page", + "type": "boolean", + "description": "Whether the your app should be excluded from the list of integration cards displayed on our integrations page in the web app", + "default": false + }, "formVariables": { "$id": "#/properties/form-variables", "title": "Form variables", @@ -271,6 +280,14 @@ "$ref": "schemas/capabilities/flagLink.json#/flagLink" } } + }, + "oauthIntegrationKey": { + "$id": "#/properties/oauth-integration-key", + "title": "OAuth Integration Key", + "description": "Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow.", + "minLength": 3, + "maxLength": 100, + "type": "string" } }, "required": [ diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index 6dbf73bc..6dc5ab58 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -7,6 +7,7 @@ "type": "object", "propertyNames": { "enum": [ + "name", "environmentFormVariables", "flagFormVariables", "creationRequest", @@ -24,6 +25,14 @@ "memberListRequest" ], "properties": { + "name": { + "$id": "#/capabilities/approval/name", + "title": "Approval System Name", + "type": "string", + "description": "Name of the approval system", + "minLength": 1, + "maxLength": 100 + }, "memberListRequest": { "$id": "#/capabilities/approval/member-list-request", "title": "Member List Request", From a5227f0a7db9d0702275720daa48e297c4389332 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 10 May 2022 12:06:00 -0500 Subject: [PATCH 525/936] Added tests cases for oauthIntegrationKey manifest prop --- __tests__/validateIntegrationManifests.js | 26 +++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index f4c1f4e8..7839aac2 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -12,6 +12,7 @@ const environmentContext = require('../sample-context/environment/update'); const memberContext = require('../sample-context/member/update'); const OAUTH_INTEGRATIONS = ['appdynamics', 'servicenow', 'servicenow-normal']; // add oauth integrations here +const INTEGRATIONS_WITH_DUP_OAUTH_KEYS = ['servicenow', 'servicenow-normal']; // these are integrations we expect to have duplicate oauth integration keys for various reasons var parse = require('url-parse'); @@ -149,6 +150,31 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'oauthIntegrationKey must be set when requiresOAuth is set to true for %s', + (key, manifest) => { + const requiresOAuth = _.get(manifest, 'requiresOAuth', null); + const oauthIntegrationKey = _.get(manifest, 'oauthIntegrationKey', null); + + if (requiresOAuth && !oauthIntegrationKey) { + expect(oauthIntegrationKey).toBeTruthy(); + } + } + ); + + test('oauthIntegrationKey must be globally unique across manifests', async () => { + const allOAuthKeys = manifests + .map( + ([key, manifest]) => + !INTEGRATIONS_WITH_DUP_OAUTH_KEYS.includes(key) && + _.get(manifest, 'oauthIntegrationKey', null) + ) + .filter(key => !!key); + + const isArrayUnique = arr => new Set(arr).size === arr.length; + expect(isArrayUnique(allOAuthKeys)).toBeTruthy(); + }); + test.each(manifests)( 'includeErrorResponseBody is only true if endpoint domain is static for %s', (key, manifest) => { From 8345c4f3e3534063f6689527fc60cff1219adb0c Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 11 May 2022 10:00:20 -0500 Subject: [PATCH 526/936] Removed oauthIntegrationKey requirement test and updated approval name description per PR feedback --- __tests__/validateIntegrationManifests.js | 12 ------------ manifest.schema.d.ts | 2 +- manifest.schema.json | 2 +- schemas/capabilities/approval.json | 2 +- 4 files changed, 3 insertions(+), 15 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 7839aac2..ab0e6f2e 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -150,18 +150,6 @@ describe('All integrations', () => { } ); - test.each(manifests)( - 'oauthIntegrationKey must be set when requiresOAuth is set to true for %s', - (key, manifest) => { - const requiresOAuth = _.get(manifest, 'requiresOAuth', null); - const oauthIntegrationKey = _.get(manifest, 'oauthIntegrationKey', null); - - if (requiresOAuth && !oauthIntegrationKey) { - expect(oauthIntegrationKey).toBeTruthy(); - } - } - ); - test('oauthIntegrationKey must be globally unique across manifests', async () => { const allOAuthKeys = manifests .map( diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 7bf1d4f5..8467d2e4 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -354,7 +354,7 @@ export type ValuePointer = string; */ export type URLPointer = string; /** - * Name of the approval system + * Name of the approval system. Default's to the integration's name if not specified. */ export type ApprovalSystemName = string; /** diff --git a/manifest.schema.json b/manifest.schema.json index 0a408b44..acb0a33d 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -985,7 +985,7 @@ "$id": "#/capabilities/approval/name", "title": "Approval System Name", "type": "string", - "description": "Name of the approval system", + "description": "Name of the approval system. Default's to the integration's name if not specified.", "minLength": 1, "maxLength": 100 }, diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index 6dc5ab58..b4cfdfb3 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -29,7 +29,7 @@ "$id": "#/capabilities/approval/name", "title": "Approval System Name", "type": "string", - "description": "Name of the approval system", + "description": "Name of the approval system. Default's to the integration's name if not specified.", "minLength": 1, "maxLength": 100 }, From c97750105fed408ab1ba8f5869dfd86a7ccc1cb4 Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Mon, 16 May 2022 16:02:36 -0400 Subject: [PATCH 527/936] remove unsupported categories --- docs/manifest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manifest.md b/docs/manifest.md index 540cf368..e7ece711 100644 --- a/docs/manifest.md +++ b/docs/manifest.md @@ -32,7 +32,7 @@ We use most of this information when we render your integration card and configu "site": "https://example.com", "privacyPolicy": "https://example.com/privacy" }, - "categories": ["apm", "monitoring", "alerts"], + "categories": ["monitoring"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" From 1e2707d27a0234725a983e6aa4108ac78c5b5845 Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Tue, 17 May 2022 08:28:06 -0400 Subject: [PATCH 528/936] first pass at requirements --- docs/getting-started.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/getting-started.md b/docs/getting-started.md index 84f17d88..058ce1f3 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -10,6 +10,16 @@ The easiest way to do this is to use [`curl`](https://curl.se/docs/manpage.html) If you are looking to integrate with a third-party service that you are not directly associated with, please open a [Feature Request](https://github.com/launchdarkly/integration-framework/issues/new/choose) describing your goal and expectations for the integration before submitting any pull requests. +## Step 0: Requirements + +Every integration is required to provide two SVG logo files, one in horizontal and one in square dimensions. + +Square SVGs are rendered in a 40x40 container. + +Horizontal SVGs are render with a height of 55px while retaining the original aspect ratio of the file. + +The usage of these files is further described in Step 3. + ## Step 1: Fork this repository Fork this repository to your own GitHub account. From 6fedca8a60b52c5b5765d1c6c53cb42024a39eeb Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Wed, 18 May 2022 10:22:48 -0700 Subject: [PATCH 529/936] Adds flag link to capabilities list --- docs/capabilities.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index 1ddabd62..ba4c8d86 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -2,10 +2,11 @@ Your integration's `capabilities` describe how it interacts with LaunchDarkly. -We support four capabilities: +We support the following capabilities: - [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`) - [Trigger](#trigger-trigger) (`trigger`) +- [Flag link](#flag-link-flaglink) (`flagLink`) - [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) - [Feature store](#feature-store-featurestore) (`featureStore`) From d1e310f554ea3490820f9fc02bbf21ae22d8cf4f Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 23 May 2022 18:41:05 +0200 Subject: [PATCH 530/936] [sc-152056] Add Datadog Dashboard widget card (#351) * add categories to manifest doc * add manifest + assets for datadog dashboard widget Co-authored-by: Henry Barrow --- docs/manifest.md | 10 ++- .../assets/horizontal.svg | 64 +++++++++++++++++++ .../assets/square.svg | 41 ++++++++++++ .../datadog-dashboard-widget/manifest.json | 19 ++++++ 4 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 integrations/datadog-dashboard-widget/assets/horizontal.svg create mode 100644 integrations/datadog-dashboard-widget/assets/square.svg create mode 100644 integrations/datadog-dashboard-widget/manifest.json diff --git a/docs/manifest.md b/docs/manifest.md index e7ece711..ae7140cd 100644 --- a/docs/manifest.md +++ b/docs/manifest.md @@ -49,16 +49,20 @@ We use your organization's or integration's logo in the LaunchDarkly UI and in t The `icon.square` and `icon.horizontal` properties point to relative paths. These paths are relative to your integration's directory. You are free to create any directories and files that support your integration. +### Categories + +The following values are supported for the `"categories"` attribute: `"analytics"`, `"approval"`, `"authentication"`, `"automation"`, `"code-references"`, `"customer-support"`, `"data"`, `"developer-tools"`, `"infrastructure"`, `"issue-tracking"`, `"log-management"`, `"messaging"`, `"monitoring"`, and `"notifications"`. + ## OAuth Many integrations in LaunchDarkly use API tokens. However, if your API requires OAuth for authentication, we can support that as well. We support two types of OAuth: -* [Authorization Code Flow](https://oauth.net/2/grant-types/authorization-code/) +- [Authorization Code Flow](https://oauth.net/2/grant-types/authorization-code/) (also known as "3-legged OAuth") -* [Client Credentials Flow](https://oauth.net/2/grant-types/client-credentials/) +- [Client Credentials Flow](https://oauth.net/2/grant-types/client-credentials/) (also known as "2-legged OAuth") -With both of these flows, LaunchDarkly acts as the OAuth consumer. In order for this to work, LaunchDarkly needs to store a consumer ID and secret. Contact us at [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com) to register your OAuth consumer details. You'll also need to set the `requiresOAuth` root-level property in your manifest to `true`. At runtime, LaunchDarkly will look up your OAuth consumer ID and secret from our registry using the `oauthIntegrationKey` value from your app's manifest. **Setting the `requiresOAuth` property to `true` will not enable OAuth on your integration. You need to provide us with the OAuth consumer details first.** +With both of these flows, LaunchDarkly acts as the OAuth consumer. In order for this to work, LaunchDarkly needs to store a consumer ID and secret. Contact us at [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com) to register your OAuth consumer details. You'll also need to set the `requiresOAuth` root-level property in your manifest to `true`. At runtime, LaunchDarkly will look up your OAuth consumer ID and secret from our registry using the `oauthIntegrationKey` value from your app's manifest. **Setting the `requiresOAuth` property to `true` will not enable OAuth on your integration. You need to provide us with the OAuth consumer details first.** ## Form variables and capabilities diff --git a/integrations/datadog-dashboard-widget/assets/horizontal.svg b/integrations/datadog-dashboard-widget/assets/horizontal.svg new file mode 100644 index 00000000..de5ec9d6 --- /dev/null +++ b/integrations/datadog-dashboard-widget/assets/horizontal.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/datadog-dashboard-widget/assets/square.svg b/integrations/datadog-dashboard-widget/assets/square.svg new file mode 100644 index 00000000..f39a6ac1 --- /dev/null +++ b/integrations/datadog-dashboard-widget/assets/square.svg @@ -0,0 +1,41 @@ + + + + + + diff --git a/integrations/datadog-dashboard-widget/manifest.json b/integrations/datadog-dashboard-widget/manifest.json new file mode 100644 index 00000000..79a6eb29 --- /dev/null +++ b/integrations/datadog-dashboard-widget/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "Datadog Dashboard Widget", + "version": "1.0.0", + "overview": "View and manage feature flags from within your Datadog Dashboard.", + "description": "Pin a subset of feature flag targeting toggles to your Datadog dashboards to monitor and perform a feature go-live from a single window.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.datadoghq.com", + "launchdarklyDocs": "https://docs.datadoghq.com/integrations/launchdarkly/#dashboard-widget-1/", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["developer-tools", "monitoring"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "otherCapabilities": ["external"] +} From 15a5f640a49097e0f4c3cf4649bf2bfd951ef604 Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Thu, 2 Jun 2022 13:34:50 -0700 Subject: [PATCH 531/936] Copyedits manifest display text and readme --- integrations/sample-integration/README.md | 4 ++-- integrations/sample-integration/manifest.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/sample-integration/README.md b/integrations/sample-integration/README.md index fa8b813d..6b8d6f52 100644 --- a/integrations/sample-integration/README.md +++ b/integrations/sample-integration/README.md @@ -1,7 +1,7 @@ # Sample Integration -[User documentation](https://example.com) +[This is a placeholder link for user documentation](https://example.com) -[API documentation](https://example.com) +[This is a placeholder link for API documentation](https://example.com) Run `npm run curl sample-integration` in the root repository directory to generate a `curl` command to send data to Sample Integration. diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index 1992497c..a1b86d35 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -2,7 +2,7 @@ "name": "Sample Integration", "version": "1.0.0", "overview": "Short one-liner describing your integration.", - "description": "Send flag data to space. Markdown based description.", + "description": "Send flag data to space. This field supports Markdown.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { @@ -35,7 +35,7 @@ { "key": "URL", "name": "URL", - "description": "This field will be validated as a URL", + "description": "This field is a valid URL", "type": "uri", "isSecret": false, "isOptional": true, From 3317894e6a6a30d0336bcdba9a9d6c9b2edf7bab Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Thu, 2 Jun 2022 13:43:31 -0700 Subject: [PATCH 532/936] Updates README with product name and some formatting --- integrations/new-relic-apm/README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/integrations/new-relic-apm/README.md b/integrations/new-relic-apm/README.md index 0c289b8b..20c8d2c2 100644 --- a/integrations/new-relic-apm/README.md +++ b/integrations/new-relic-apm/README.md @@ -1,11 +1,13 @@ -# New Relic +# New Relic One -[User documentation](https://docs.launchdarkly.com/integrations/new-relic) +**Important:** This integration requires a New Relic APM account. -[API documentation](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments) +User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic One](https://docs.launchdarkly.com/integrations/new-relic) + +API documentation for this integration is available on the LaunchDarkly API documentation site: [New Relic One](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments) + +## Getting started with the New Relic One integration Run `npm run curl new-relic-apm` in the root repository directory to generate a `curl` command to send data to New Relic. -Please note that this integration requires a New Relic APM account to function. -You should be able to see all LaunchDarkly flag events on the Deployment page -of your APM console. +After you configure the integration, you should be able to see all LaunchDarkly flag events on the Deployment page of your APM console. From fd3e45a5cf524d32bd403e9656c3d923f2974069 Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Thu, 2 Jun 2022 16:49:04 -0700 Subject: [PATCH 533/936] Update integrations/new-relic-apm/README.md Co-authored-by: Molly --- integrations/new-relic-apm/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/new-relic-apm/README.md b/integrations/new-relic-apm/README.md index 20c8d2c2..39dfa664 100644 --- a/integrations/new-relic-apm/README.md +++ b/integrations/new-relic-apm/README.md @@ -2,7 +2,7 @@ **Important:** This integration requires a New Relic APM account. -User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic One](https://docs.launchdarkly.com/integrations/new-relic) +User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic One](https://docs.launchdarkly.com/integrations/new-relic). API documentation for this integration is available on the LaunchDarkly API documentation site: [New Relic One](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments) From 50384f6dcbe24223c927d046c52c0632054c330f Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Thu, 2 Jun 2022 16:49:37 -0700 Subject: [PATCH 534/936] Update integrations/new-relic-apm/README.md Co-authored-by: Molly --- integrations/new-relic-apm/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/new-relic-apm/README.md b/integrations/new-relic-apm/README.md index 39dfa664..42c81ae8 100644 --- a/integrations/new-relic-apm/README.md +++ b/integrations/new-relic-apm/README.md @@ -4,7 +4,7 @@ User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic One](https://docs.launchdarkly.com/integrations/new-relic). -API documentation for this integration is available on the LaunchDarkly API documentation site: [New Relic One](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments) +API documentation for this integration is available on the New Relic API documentation site: [New Relic One](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments). ## Getting started with the New Relic One integration From eecc3b971d406b6a17392cbaee562f7aacf84792 Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Fri, 3 Jun 2022 17:29:16 -0700 Subject: [PATCH 535/936] Updates splunk readme and manifest display text --- integrations/splunk/README.md | 6 ++++-- integrations/splunk/manifest.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/integrations/splunk/README.md b/integrations/splunk/README.md index 125bc4c7..7512904f 100644 --- a/integrations/splunk/README.md +++ b/integrations/splunk/README.md @@ -1,7 +1,9 @@ # Splunk -[User documentation](https://example.com) +User documentation for this integration is available on the LaunchDarkly documentation site: [Splunk](https://docs.launchdarkly.com/integrations/splunk) -[API documentation](https://docs.splunk.com/Documentation/Splunk/latest/Data/HECExamples#Extract_JSON_fields_example) +API documentation for this integration is available on the Splunk documentation site: [Splunk](https://docs.splunk.com/Documentation/Splunk/latest/Data/HECExamples#Extract_JSON_fields_example) + +## Getting started with the Splunk integration Run `npm run curl splunk` in the root repository directory to generate a `curl` command to send data to Splunk. diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index 303d8a1c..b3290727 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -2,7 +2,7 @@ "name": "Splunk", "version": "1.0.0", "overview": "Monitor LaunchDarkly flag changes in Splunk.", - "description": "Monitor LaunchDarkly flag and other change events in Splunk and include these events in your reports, charts, alerts and dashboards.", + "description": "Monitor LaunchDarkly flag and other change events in Splunk and include these events in your reports, charts, alerts, and dashboards.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 49d852f40af6f01d68cfd4eb4d25c92fde7d6aad Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Mon, 6 Jun 2022 09:01:47 -0700 Subject: [PATCH 536/936] (SC-152798) Add Zapier integration (#353) This adds the bare bones of the Zapier integration to the integration framework. All this does for now is filters the webhooks that Zapier gets, and adds an integration card to the integration page. Co-authored-by: Lucy Voigt Co-authored-by: Isabelle Miller --- .../zapier/assets/images/horizontal.svg | 1 + integrations/zapier/assets/images/square.svg | 1 + integrations/zapier/manifest.json | 50 +++++++++++++++++++ .../zapier/templates/default.json.hbs | 6 +++ 4 files changed, 58 insertions(+) create mode 100644 integrations/zapier/assets/images/horizontal.svg create mode 100644 integrations/zapier/assets/images/square.svg create mode 100644 integrations/zapier/manifest.json create mode 100644 integrations/zapier/templates/default.json.hbs diff --git a/integrations/zapier/assets/images/horizontal.svg b/integrations/zapier/assets/images/horizontal.svg new file mode 100644 index 00000000..00f530b9 --- /dev/null +++ b/integrations/zapier/assets/images/horizontal.svg @@ -0,0 +1 @@ +zapier-logo diff --git a/integrations/zapier/assets/images/square.svg b/integrations/zapier/assets/images/square.svg new file mode 100644 index 00000000..033aef66 --- /dev/null +++ b/integrations/zapier/assets/images/square.svg @@ -0,0 +1 @@ +zapier-logomark diff --git a/integrations/zapier/manifest.json b/integrations/zapier/manifest.json new file mode 100644 index 00000000..57c07617 --- /dev/null +++ b/integrations/zapier/manifest.json @@ -0,0 +1,50 @@ +{ + "name": "Zapier", + "version": "1.0.4", + "overview": "Zapier triggers and actions for LaunchDarkly.", + "description": "Trigger Zaps based on LaunchDarkly audit log events, and take actions in LaunchDarkly from your Zaps.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://zapier.com", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["automation"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "url", + "name": "Incoming webhook URL", + "type": "uri", + "description": "Enter your zap webhook URL", + "isSecret": false + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{url}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ], + "templates": { + "default": "templates/default.json.hbs" + } + } + } +} diff --git a/integrations/zapier/templates/default.json.hbs b/integrations/zapier/templates/default.json.hbs new file mode 100644 index 00000000..5a0e9de3 --- /dev/null +++ b/integrations/zapier/templates/default.json.hbs @@ -0,0 +1,6 @@ +{ + "name": "{{name}}", + "key": "{{key}}", + "user": "{{member.email}}", + "message": "{{title.plainText}}" +} From 7a5a699cc33640aea98aac34ed344f79884f5a9f Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Mon, 6 Jun 2022 13:43:02 -0700 Subject: [PATCH 537/936] Updates signalfx readme --- integrations/signalfx/README.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/integrations/signalfx/README.md b/integrations/signalfx/README.md index 1e0fdd4d..f7ec6842 100644 --- a/integrations/signalfx/README.md +++ b/integrations/signalfx/README.md @@ -1,18 +1,22 @@ # SignalFx -[User documentation](https://docs.launchdarkly.com/integrations/signalfx) +User documentation for this integration is available on the LaunchDarkly documentation site: [SignalFx](https://docs.launchdarkly.com/integrations/signalfx) -[API documentation](https://developers.signalfx.com/ingest_data_reference.html#operation/Send%20Custom%20Events) +API documentation for this integration is available on the SignalFx documentation site: [SignalFx](https://developers.signalfx.com/ingest_data_reference.html#operation/Send%20Custom%20Events) -[Webhook (trigger) documentation](https://docs.signalfx.com/en/latest/admin-guide/integrate-notifications.html) +Trigger documentation for this integration is available on the SignalFx documentation site: [Webhook (trigger) documentation](https://docs.signalfx.com/en/latest/admin-guide/integrate-notifications.html) -### Set up for testing -You shouldn't need to plug SignalFx into anything to test the SignalFx-Goaltender integration. Instead, just follow the following steps to locate the LD events after logging in to SignalFx: -1. Under the 'Dashboards' tab, expand the 'Built-in Dashboard Groups' section. -2. Expand the 'Sample Data' section. -3. Click into 'Sample Charts'. -4. Once there, click on any of the charts to add LD events. -5. Under 'Plot Editor', select 'Add Metric or Event' and choose 'LaunchDarkly flag change'. -6. Send an event from your local Gonfalon. It should register at the bottom of the chart as a little diamond. +## Testing the SignalFx integration + +You can verify that the SignalFx integration is working correctly by locating LaunchDarkly events in SignalFx. + +Here's how: + +1. Log in to SignalFx and navigate to the **Dashboards** tab. +2. Expand the "Buit-in Dashboard Groups" section. +3. Expand the "Sample Data" section. +4. Click into "Sample Charts." You can add LaunchDarkly events to any of these charts. +5. Under "Plot Editor," select "Add Metric or Event" and choose "LaunchDarkly flag change." +6. Send an event from your local LaunchDarkly instance. It appears at the bottom of the chart as a diamond shape. Run `npm run curl signalfx` in the root repository directory to generate a `curl` command to send data to SignalFx. From caec77282155c23afaecd89d1af15ad129ca4f30 Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Mon, 6 Jun 2022 13:52:43 -0700 Subject: [PATCH 538/936] Copyedits manifest and readme --- integrations/new-relic/README.md | 13 ++++++++----- integrations/new-relic/manifest.json | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/integrations/new-relic/README.md b/integrations/new-relic/README.md index 8a1a8089..09e40202 100644 --- a/integrations/new-relic/README.md +++ b/integrations/new-relic/README.md @@ -1,12 +1,15 @@ # New Relic -[User documentation](https://example.com) +**Important:** This integration requires a New Relic Pro account, including a paid Insights subscription. -[API documentation](https://docs.newrelic.com/docs/insights/insights-data-sources/custom-data/introduction-event-api) +User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic](https://example.com) + +API documentation for this integration is available at the New Relic documentation site: [New Relic](https://docs.newrelic.com/docs/insights/insights-data-sources/custom-data/introduction-event-api) + +## Getting started with the New Relic integration Run `npm run curl new-relic` in the root repository directory to generate a `curl` command to send data to New Relic. -Please note that this integration requires a New Relic Pro account to function. -You should be able to see all LaunchDarkly flag events by running `SELECT * FROM LaunchDarkly` in your New Relic Insights Data Explorer. +You can display all LaunchDarkly flag events by running `SELECT * FROM LaunchDarkly` in the New Relic Insights Data Explorer. -If you want to see all the Event Types that have been posted in the last day, run `SHOW EVENT TYPES SINCE 1 day ago` +If you want to display all the Event Types that have been posted in the last day, run `SHOW EVENT TYPES SINCE 1 day ago`. diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index 9bef6396..9559c0d8 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -2,7 +2,7 @@ "name": "New Relic Insights Pro [Deprecated]", "version": "1.0.0", "overview": "Monitor LaunchDarkly flag events in New Relic Insights Pro.", - "description": "This integration sends LaunchDarkly audit events to New Relic. Please note that it requires a paid Insights subscription to function.", + "description": "This integration sends LaunchDarkly audit events to New Relic. It requires a paid Insights subscription.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 697bc887ba1159c2cb728ee8420236963aa8d535 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 7 Jun 2022 15:05:39 +0100 Subject: [PATCH 539/936] [sc-150687] send new relic data optionally as event type (#355) * update manifest * wip * split into two manifests * typo * add project and environment keys * docs link * Typo Co-authored-by: Isabelle Miller * Apply suggestions from code review Co-authored-by: Isabelle Miller Co-authored-by: Isabelle Miller --- integrations/new-relic-apm-insights/README.md | 11 +++ .../assets/images/new-relic-horizontal.svg | 20 +++++ .../assets/images/new-relic-square.svg | 12 +++ .../new-relic-apm-insights/manifest.json | 74 +++++++++++++++++++ .../templates/flag.json.hbs | 11 +++ 5 files changed, 128 insertions(+) create mode 100644 integrations/new-relic-apm-insights/README.md create mode 100644 integrations/new-relic-apm-insights/assets/images/new-relic-horizontal.svg create mode 100644 integrations/new-relic-apm-insights/assets/images/new-relic-square.svg create mode 100644 integrations/new-relic-apm-insights/manifest.json create mode 100644 integrations/new-relic-apm-insights/templates/flag.json.hbs diff --git a/integrations/new-relic-apm-insights/README.md b/integrations/new-relic-apm-insights/README.md new file mode 100644 index 00000000..0c289b8b --- /dev/null +++ b/integrations/new-relic-apm-insights/README.md @@ -0,0 +1,11 @@ +# New Relic + +[User documentation](https://docs.launchdarkly.com/integrations/new-relic) + +[API documentation](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments) + +Run `npm run curl new-relic-apm` in the root repository directory to generate a `curl` command to send data to New Relic. + +Please note that this integration requires a New Relic APM account to function. +You should be able to see all LaunchDarkly flag events on the Deployment page +of your APM console. diff --git a/integrations/new-relic-apm-insights/assets/images/new-relic-horizontal.svg b/integrations/new-relic-apm-insights/assets/images/new-relic-horizontal.svg new file mode 100644 index 00000000..3c23784f --- /dev/null +++ b/integrations/new-relic-apm-insights/assets/images/new-relic-horizontal.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/new-relic-apm-insights/assets/images/new-relic-square.svg b/integrations/new-relic-apm-insights/assets/images/new-relic-square.svg new file mode 100644 index 00000000..dcf7f0c0 --- /dev/null +++ b/integrations/new-relic-apm-insights/assets/images/new-relic-square.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/integrations/new-relic-apm-insights/manifest.json b/integrations/new-relic-apm-insights/manifest.json new file mode 100644 index 00000000..238686be --- /dev/null +++ b/integrations/new-relic-apm-insights/manifest.json @@ -0,0 +1,74 @@ +{ + "name": "New Relic One Insights", + "version": "1.1.0", + "overview": "Monitor LaunchDarkly flag events in New Relic One as Insight events.", + "description": "This integration sends LaunchDarkly audit events to New Relic One as [insight events](https://docs.newrelic.com/docs/data-apis/ingest-apis/event-api/introduction-event-api).", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://newrelic.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/new-relic", + "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/images/new-relic-square.svg", + "horizontal": "assets/images/new-relic-horizontal.svg" + }, + "formVariables": [ + { + "key": "licenseKey", + "name": "New Relic License API key", + "description": "Enter your [New Relic License API key](https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/#overview-keys).", + "type": "string", + "isSecret": true + }, + { + "key": "accountId", + "name": "New Relic account Id", + "description": "Enter your [New Relic account ID](https://docs.newrelic.com/docs/accounts/accounts-billing/account-structure/account-id/).", + "type": "string" + }, + { + "key": "domain", + "name": "Data Center", + "description": "Your New Relic data center. The default(US) is \"insights-collector.newrelic.com\". Use \"insights-collector.eu01.nr-data.net\" if you are using the EU data center.", + "type": "enum", + "allowedValues": [ + "insights-collector.newrelic.com", + "insights-collector.eu01.nr-data.net" + ], + "isOptional": true, + "defaultValue": "insights-collector.newrelic.com" + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "https://{{#if domain}}{{domain}}{{else}}insights-collector.newrelic.com{{/if}}/v1/accounts/{{accountId}}/events", + "method": "POST", + "headers": [ + { + "name": "Api-Key", + "value": "{{licenseKey}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "flag": "templates/flag.json.hbs", + "validation": "templates/flag.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/new-relic-apm-insights/templates/flag.json.hbs b/integrations/new-relic-apm-insights/templates/flag.json.hbs new file mode 100644 index 00000000..feab7974 --- /dev/null +++ b/integrations/new-relic-apm-insights/templates/flag.json.hbs @@ -0,0 +1,11 @@ +{ + "eventType": "flagEvent", + "flagKey": "{{key}}", + "projectKey": "{{project.key}}", + "environmentKey": "{{project.environment.key}}", + "revision": "{{project.key}}/{{project.environment.key}}/{{key}}-{{timestamp.milliseconds}}", + "changelog": "{{{title.plainText}}}", + "description": "{{{title.plainText}}}{{#if comment}}, Comment: {{comment}}{{/if}}", + "user": "{{member.displayName}}", + "timestamp": "{{timestamp.rfc3339}}" +} From 215f2a2410db5e92bc98c182e8f63ed634eec73e Mon Sep 17 00:00:00 2001 From: Munnawar Hashim <70662658+munnycodes@users.noreply.github.com> Date: Tue, 14 Jun 2022 17:18:32 +0100 Subject: [PATCH 540/936] moonshot xviii pagerduty integration (#362) * added integration for pagerduty * added a placeholder logo for now * changed icon to PD icons Co-authored-by: munnawar hashim --- integrations/pagerduty/README.md | 0 .../pagerduty/assets/pagerduty-rectangle.svg | 1 + .../pagerduty/assets/pagerduty-square.svg | 1 + integrations/pagerduty/manifest.json | 51 +++++++++++++++++++ .../pagerduty/templates/default.json.hbs | 10 ++++ 5 files changed, 63 insertions(+) create mode 100644 integrations/pagerduty/README.md create mode 100644 integrations/pagerduty/assets/pagerduty-rectangle.svg create mode 100644 integrations/pagerduty/assets/pagerduty-square.svg create mode 100644 integrations/pagerduty/manifest.json create mode 100644 integrations/pagerduty/templates/default.json.hbs diff --git a/integrations/pagerduty/README.md b/integrations/pagerduty/README.md new file mode 100644 index 00000000..e69de29b diff --git a/integrations/pagerduty/assets/pagerduty-rectangle.svg b/integrations/pagerduty/assets/pagerduty-rectangle.svg new file mode 100644 index 00000000..705e9698 --- /dev/null +++ b/integrations/pagerduty/assets/pagerduty-rectangle.svg @@ -0,0 +1 @@ + diff --git a/integrations/pagerduty/assets/pagerduty-square.svg b/integrations/pagerduty/assets/pagerduty-square.svg new file mode 100644 index 00000000..e2e75a8e --- /dev/null +++ b/integrations/pagerduty/assets/pagerduty-square.svg @@ -0,0 +1 @@ + diff --git a/integrations/pagerduty/manifest.json b/integrations/pagerduty/manifest.json new file mode 100644 index 00000000..63cc6197 --- /dev/null +++ b/integrations/pagerduty/manifest.json @@ -0,0 +1,51 @@ +{ + "name": "PagerDuty", + "version": "1.0.0", + "overview": "Send flag change events to Teams service pages.", + "description": "Send flag change events directly to PagerDuty’s Events API v2, ensuring flag change events appear on PagerDuty Service pages.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.pagerduty.com", + "launchdarklyDocs": "https://docs.launchdarkly.com", + "privacyPolicy": "https://www.pagerduty.com/privacy-policy/" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/pagerduty-square.svg", + "horizontal": "assets/pagerduty-rectangle.svg" + }, + "formVariables": [ + { + "key": "routingKey", + "name": "PagerDuty Routing Key", + "type": "string", + "description": "Enter your [PagerDuty Routing Key](https://support.pagerduty.com/docs/services-and-integrations).", + "isSecret": false + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "https://events.pagerduty.com/v2/change/enqueue", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/pagerduty/templates/default.json.hbs b/integrations/pagerduty/templates/default.json.hbs new file mode 100644 index 00000000..0bb74e71 --- /dev/null +++ b/integrations/pagerduty/templates/default.json.hbs @@ -0,0 +1,10 @@ +{ + "routing_key": "{{{formVariables.routingKey}}}", + "payload": { + "summary" : "{{{title.plainText}}}", + "timestamp": "{{{timestamp.simple}}}", + "custom_details":{ + "comments": "{{{details.plainText}}}" + } + } +} From 59a652cfaaa1d4f63d6dea3e26d7644b36990afe Mon Sep 17 00:00:00 2001 From: Munnawar Hashim <70662658+munnycodes@users.noreply.github.com> Date: Thu, 16 Jun 2022 11:07:49 +0100 Subject: [PATCH 541/936] Munnawarhashim/sc 156848/moonshot xviii pagerduty integration (#363) * added integration for pagerduty * added a placeholder logo for now * changed icon to PD icons * added links to the payload Co-authored-by: munnawar hashim Co-authored-by: Henry Barrow --- integrations/pagerduty/templates/default.json.hbs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/integrations/pagerduty/templates/default.json.hbs b/integrations/pagerduty/templates/default.json.hbs index 0bb74e71..dcb5a8de 100644 --- a/integrations/pagerduty/templates/default.json.hbs +++ b/integrations/pagerduty/templates/default.json.hbs @@ -4,7 +4,16 @@ "summary" : "{{{title.plainText}}}", "timestamp": "{{{timestamp.simple}}}", "custom_details":{ - "comments": "{{{details.plainText}}}" + "details": "{{{details.plainText}}}", + "comment": "{{{comment}}}" } - } + }, + "links": [ + { + "href": "{{{_links.details.href}}}", "text": "View audit log entry in LaunchDarkly" + }, + { + "href": "{{{_links.site.href}}}", "text": "View resource in LaunchDarkly" + } + ] } From 08c294c747e6d0e2b23c78b31bd5f729bab70355 Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Thu, 16 Jun 2022 15:03:00 -0700 Subject: [PATCH 542/936] Updates links to new docs --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 41d78bb5..14446c5d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ [![CircleCI](https://circleci.com/gh/launchdarkly/integration-framework.svg?style=svg&circle-token=9a44436c3b22e7fb6a22df1ad9a2455a0d6f2d34)](https://circleci.com/gh/launchdarkly/integration-framework) -Feature flags give you control over your deployment and rollout. They can also provide context to third-party tools that show you how your application reacts to flag changes. You can integrate these tools with LaunchDarkly using the LaunchDarkly integration framework. For additional background, read [Building your own integrations](https://docs.launchdarkly.com/integrations/building-integrations) in our LaunchDarkly product documentation. +Feature flags give you control over your deployment and rollout. They can also provide context to third-party tools that show you how your application reacts to flag changes. You can integrate these tools with LaunchDarkly using the LaunchDarkly integration framework. For additional background, read [Using the LaunchDarkly integration framework +](https://docs.launchdarkly.com/integrations/building-integrations) in our LaunchDarkly product documentation. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly to provide the external tools with more context. @@ -12,13 +13,13 @@ LaunchDarkly's integration framework lets you build one-way integrations from La We've provided step-by-step instructions to help you build integrations. -To learn more, read [Getting started](docs/getting-started.md). +To learn more, read [Getting started](https://docs.launchdarkly.com/integrations/partner-integrations/getting-started). ## The LaunchDarkly Technology Partner Program Using the LaunchDarkly integration framework is just one way to create a relationship with LaunchDarkly. You can unlock more benefits by joining our Technology Partner Program. -To learn more, read [Technology Partner Program](https://docs.launchdarkly.com/integrations/building-integrations#technology-partner-program). To join the program, email us at [partnerships@launchdarkly.com](mailto:partnerships@launchdarkly.com). +To learn more, read [Building partner integrations](https://docs.launchdarkly.com/integrations/partner-integrations). To join the program, visit our [Partners page](https://launchdarkly.com/partners/). ## Submitting bug reports and feature requests From d0626c021fc694edae26b44b3c3cf515ae24f751 Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Thu, 16 Jun 2022 15:05:17 -0700 Subject: [PATCH 543/936] Removes docs directory --- docs/assets/flag links.png | Bin 83317 -> 0 bytes docs/capabilities.md | 417 ------------------------------------- docs/endpoint.md | 54 ----- docs/form-variables.md | 42 ---- docs/getting-started.md | 84 -------- docs/manifest.md | 71 ------- 6 files changed, 668 deletions(-) delete mode 100644 docs/assets/flag links.png delete mode 100644 docs/capabilities.md delete mode 100644 docs/endpoint.md delete mode 100644 docs/form-variables.md delete mode 100644 docs/getting-started.md delete mode 100644 docs/manifest.md diff --git a/docs/assets/flag links.png b/docs/assets/flag links.png deleted file mode 100644 index 20f52a8bc999592b62d743b2317361345f064e09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83317 zcmdpd1zQ|jwl?nW1cxBO8g~iMKyU~yL4!-Ma~rOLb!aK0daxrZYCMvl^zFpeG<$vdU%g=EXG$K^-{+=+upkN1nVu2mqIgpvCsnIAo zEMFNZ>|iZMRx8PduTNiJHNRfKbC5$R<8;0AA_kytxB_#|-cIU4DZ7NNy%p8u==+3Z z{UII(TO-P05w3$`E6G7>tKTG#W&!CC+K=9;X_5tnlfb`J%x^5yPcZlcj9-zO~-j3w8S2#Fn#H zp)ap2+UXaA!XwzUs0E$zVd`RIr;1Xp#Rzd`zk*{n zgX_)PVU9fUBI9}44mI+UQUgkii;P8Hj=&@zZT%!iTUJN@qFE`1akeZH9QHv!^h|$TBxw0{ zj5v}nObi2L)&W^8+6?#w$WFw}+Xcu(r0nB%0^Jj<6WD%LZh{W@t1HC5u~=lHJHv&r z>+Kl+bE@s1aiK8wU~^xLhs;%?g>ovOYNgM&CtHyzJdO}y!`|atK-n5X$@|e(!pHo? z2g4X(`ArjJ2lg7mGawWg(#)eUcCuC?PWuP0BUwPx|0K4D)`On= z$zo5z@DmCQ9r6>A4Mq$LBkw)e2NI5;5lWH)Y-90NWhguZNpWOljwFO|D*jp`9r$E% zQ)Sv(lJB7y68&E}f6*2rHltpP1^&|AM~w;?tVAfq%;@Gcq#Fs4*suVTXCmzV47SH^ zB`^20UWc{k^g?KdSqs2FLj@DTE5F4fGYzViWLL3K<7325j!4K$$&*#yDSo3y^BsLA zyxIR_u6~|KewD?WFaGtCo_T>2>=xt#h;4Xn1fRmoC3y44zk+ffe@X105}`<8ngpKz zv}Zd{|gFeGZZnb(h``3ISfJXqcfbUimbG*60B61ceTN+rx1+l z-l%op;RERL#Y7JG;&0V&VXP}|m2V-~Lsow))haecm{L#VIn(*h-SeI5-Qiu)9d^K* z&Zu=UB>FRCRAdq)Ph{JmA3@MvNGe$tVpr5sxKrUwVfZ~#o9>&in}RsupXD9tN2$U; z49nnullT_-O=QxXBiTm5EHQDw@xtRm#8L2`^`0zPoW1DoBhI^~r0XP)A?+cWA$t5T z5m_kG!4=i=1+oR&JIzB(>H*)=8RcBst-e|{{Z^Uz@f|ROWVLH$!(G1kv5v8B%c{+) z`!|;h;{9j)!N zoGbF4o}9Uu!LdlT;I>?ue8?O9h4E|b*Xp;Gyk}*^GLte+X?g?mqA~ZZ)aEzM+08;L zI4d;Gw^xS3)@>i!Bt1N@ny*5x(XRrpXdjlY$A5Ql<&xaJ`9@;H&S%PI@qzP-2ani} zUC8z>^Xs4?I|ng-lv5NHjc~ppP1A&3zFj`H3F;QnR&t+0AErVWoqVENA`2ZEokU?s zVU0Xt22a{5CrujrXpq^`h`^}G7u~e}^a>sjyRX?-)6Ob}T8m1sp-k0P)ksxoRjXxi zow1Io)^TOC8M|}i3lTU2no`^+$hJ=Q+DD#) z9?dZ|WA$Qb$SZ_xg*k<8Jw-As*;Uz`PDgwICV=ueJ3ugRx8TAfJt#Of9&@g!Z?CE% z9I)0fd;4xUB6&>Ur^k-@DgCwJ?rr>Wr+$~+t@J(Oed?VXqB5*83?nQ#{2RnVcpf+m z_$D|O6f4X=xKIQT%E`{Y6FAdjOgT(-MkWUqiq8jb@D|E94AFz%I+o&FVqD-TN z3TZUBdEV8F+?Ztg>Sb!3$!;5Doxg-@oF1G zjT>M?ZiQXXpo6R9852r+YH?{Jc=KbW;!%+(t5~4K-Ld=KW=WoEei5n?W`o?KLAH$G z)LK>U*2}_O4e$6U|D3nT)l)C3KjD~bwSbbrRWo=qp}$}&H9b|gyiwos#PLAjCSw@X z-~6d1qoVnfZQHI-S(&-nc*&v2-1zcYhr?c)bRwpD>f)m7rGOBMLzRnckP+jrS4EY-cfPrFunEo-1?W?T^s0Yl$YR@DiYVWJ^tMoO~ux3Z=jrR&So+#Iu)Pvd8@uJ(}=}nuP z&l)=^`_sO}Y-oHeZBDJ|jJKK3$rH})&cTNl&E>fWkjC0#d#H~u+ZS#D#tqq~t$ZjH z6+Ui!zlO)SCO&AWMQ*4tC;Hvr4*qoQ@O{Wn^x0``{k`~pi#t#~_b^y7^JHOPXk={> zDPhhfA7SPPWlCOgw7(~A0a-tya(qdOjcJ$ImCD42TJw;Wme!Gy?wFzOU6t5P!^FLO zN()+m$rVT?BP4n#+Z%Q~<4sSyex2T0V^P*PBYad+;36i)O){y2__-RUS~6w|3Q&xY zG7=PYs3jB}qy!B)-#|_%DA^CrDj_2S`BgP> zG&QwzvH&?_#ml8Zs+zM@({k2QkQXok*|Hja1{s^Of^F^p5P=c`3qXptrp`u`U|SnI zCjqc9^*^2vfRz8Z44|g`$0N?x!qi#{%9IiyM^j23RyI~PY7rDlN=hNe&t?K2fl~h? z4*5@*+QQk{UH|}ab8};L<75RnngiJR`S}5C8~_du7RVDUPVRQjMqm~@Cz^j&@~?V; zrcNe~miEq;AUn!G>NPS3xi||`Q~%M>pMU@CrzzO--!0iW{m-x<0|fkW2f)tC2KcjX zh^WvXR|S+U!KOCaKucSQdLV6xaPx5r{p0z+-1&El{~@XMZ%KA`PTv0%{f}G!TU6c2 z)KLOt3u)6?MA0HBLV!OfO$5afS_caX>OGVU zP)rRBeUycq89hVNpF=E{WFhgby6!ZCN9OCKe(jHMlZD=oi4g3m^}TwH^UVp)wYi-zn~mHF=ZufE-F_PLTs`$%z0AH89Cu%hQXiA2gQ2GU zyQ5MccR;Vgsc0nJ4=L>L4loRkgBlj_J>1_Mxp-J{VX7#s3DpdLS2yJ!q6mK@2dV7; zKhd3LJ|;V~iuPpF#14H^RUfTOUh{12z-Hp!tYmSD(-OiOn_t2UH~mlQ8bz)lZI3eb z+@-pXi&|^#&tgV%43Yl0zyC-nQ z^=0X|!%H3i_fyYf**6pY6uPwZcx^(irRcZ|_OIbWdn?T(rL~{rnq}2} zQ`FlogB&#-nR{~4WgIs75&Ux6H(OWgyUu8jOUU9G>Z6sVHZ`maVk~o-wS(X;e9;mSFazW+ZDF|FlA#4-Oukf-zus{ zo(U_P=R}41Lt|&#VMFvs=};fBM!DV?|M@F#Y6T1LaOH)iUdcPv_L?l$#ff7I8AFAS zRUjmC-*nstK0)$ctN|qn8X6pW3Gqo zPZvLe+@lSMv>c9Ko-P4D)U6Na=^_bO98GzrzN?ks=n_0v8+O8^&P6+&Ln?js;{PeP zt4YsgyVY7^sPv$RT7$M^^@BTGLR(wA-ud98Zd>D52#}8uQu)w z;Lr8Ve{=LHM=|qYQE=ErFN<;uF2);kpfaO^@l=w~(ec$po5xkY-d3BY`^9xh&qtfz zdgAR=wi`L$mccl-irLsmHMH>1QdCZj?LgZCkJs6ksiS4#;W4W$OT^QhgP5AhH#`HC z4XY#dS#E=sf&wXS*Tr8-&}m-n-e3$CZ$+Vxe3 z!>`8=8!RzHl^BG(+wj=?F(OR1-!ndj>^k|l%3QQ^SJae9-driI^?72 zHhCo*_`V#J^rly|zbxL&o5U`shdpxd?o{1WKmJg&q>%tNT_wobRJ7e(>29=DAC|W) zw%83}!$2F4v1GjvX24wC;VOBY67-M-g}D;e)^%f8lL~h68u*$#KVsIR;4|_~l(c?w zx>nby&|jHqA>elqukN{$$KW5T_yaA*AZnE zhyG(@lhVy7@0!k3VQBv>r)`N*H^R+Ut)+gC_wl$7!? z*dGtqzZZJkR_n;zmOJfQH#{;#UqK{n_PMV?Ypb5erl|%F=}ayBbEMecK^-qVPP^mT zpe+f^I*7@9V7C9XJDOoWRiw~>uZTqQtE1vo*y0RJ;+q(F$t=V6Xg9;|?EYyZv}6qR z$YIZ=F3bCNMz4ej`U15mUvjRM+jy(j&8EGU7aJ*1kZ~v#(s1k-RLt#H*(tQq}HruN)I0yXe6^EDF`j ztazTV>8G#8JMVUqxc9ammTx-y7iODG_?Mhg<-3P>TO&0Vk^4)lj~fOnzhaiv4vjf% z4u&#;vCZ!Wm>(~1xuwC|;mm@A3KLc?Ui?l}I!`x|scHPjR3%gqq%LZa-ws7zy%H2M z?_#cxr-pahzIzLrMxeV=LkD!yHRADSTpZ&a&Q-*k3IO6fPg~X$Fg-gX>BHch^z>52 z+|cc-%y=3G4SX!SLsnAddhWNU#-BVkH|;Zho*$P!!6JfH=)aWEXOr&qrWoC#ol}op z0$MF@F@1m89WTFY)-FGt`M#qu@S#ICS)nbgGvspFxkN{|;ylDiJNgZ`&50hN&EUeU z!=b)?zs>TUaz~8spz(bV&xf-edR|GZ{kTr{*f(RhVTB51l99WsG$jVF&^MEECZ#ha zMR#r3x{D1R^Qa*%xAjE|3K4ci8oN4t5J8 z+iqVT6-zBorXCN9(p?`8iukF@+nz6m0j^V{WGhv=d{ssD!UCJ@O9RL*w-_Y9iA7)T za6>}lM2R;|7e@bQV+Fq_iaI~?+a zMm){VS#h`h4Ws}v9MvdkE;N}ZT~2+=)Hk+OWZEliE9LLf&`tL~2oS9?*pW5k)zcR# z@RRtZU${M8u5PVB?XV`|0PTw@vj3jmwd_pQ&uX^VGK_}P>l%BGM^3Y*|a)9xD@auVXlZfl0sv+_=+{c5?TM@wMo>zw=cIy4@4P)Tq6Q?N@# zQ;FtOkx~O^CR9RdH1VY)GhmzP%&?<7gDV`F&$rR?6Oz>9QBABUz417y^DnWR8BOa# z^Ulfxt5_nwEay#Ro&{v?&YM-wiZs9O>O>`h2}4<|y_`=%U!(OZ&0yXlO2~IFA$DID ziv>Qg`qn(34kps;9%>YM#4;3`);X@3{&lA)$ao*_zNxqDdYs0Wqd4X|C7*dan$;AD ztEu~(M+?jlyDh5)WEQJV^;VSV@*;}p1K{f@*DGI-_)`BYV?sZzHs%m=j>>AKI+jhIWy|ZPe^4lrUgxU%GX|8s z+`Z4V7hKbS(h|Il<1=QTP12fmu%#q2TIX}Xf#_N%x%Hirt5olR;}C5;9+BK@ARNb_ z#ZrmeX35qmfSz-dem*5WjfGjFHjVd`m!6diDFgf!;e4+%l-yBhHWL#xtwMYMOL%(@E9cd%M(MoGwdl_@^TSz}|?+rh& zyaLQDxdo$M+$hBm(Fga1)4V*EaJmT8q4%g6xh?u)tCby#+Y_K(8YkHIi$2H4Dql)? zr(7&0vPpH=AdmrM3?<33=TUYwwVk$z@7+ysILW_e;qk!wm#CrA2b+N%n;tvFb|vY% z!b)knCnDY0Y}#DS2tTN&P?UYt;^~l|TH*sJn%P*&_t9XlATT$f%A?ndP?|n{$K~ns zBdyL$_mvIFmhml`%ic%tIxVMO1v{TK&WpObjE~n-r8Y}0{iNm$tu86eXRMt_0bUdQ zJ5OtFqGn6BZl4#%&^gMC+V+V<%0_!r?-y^D+}5~JalC#QbYx?0lN6r5oqu~ky~-Nw zCX*%t^xHzlrQ2P6xn1*VSkaTuG6Ww@muD?;B7ul|B7amg4%C(Ym%vd!0#bhcz`5#)M}~5bdm*7v_?fO2vxZU{M}f zrRw&0{Jaa6-G^PN@cnkP^_y$G{0 z8Ysp1)6-#(gU8*@9O*>J@uA(J@x+rYkC|Qyi&K^3ypKu*FY}&@*QEU1Q0g$YF5`WJ zM!NU8Lj9<-YF_}^j8HcM<}lCZK2{Gn4%JW3Cpt0I<*0u0OunnWJl%+|j9I(h>@^M} zr`3C3mvGqZR!GR<4Vk@P+r#f4KFyeq?9W9eMPrt|vhNJaTQ4&=ShRPZ&->ah7-hDr zQ~TRDr>I5cwKw0u$7bz^AT}SUDhWS3%g5dA=f{?T)?Owcj!6vCM7}vdaCbld=$8a0 zI}qcAkHGb)s{hVJF^9byVDg3l^m)-G_0y9_3MR2fETJS47U|6`Q{*~@KA=_D>S{mr z>3nd`godJlaOKo6%&=85(gjS@cDHG<Nw~529H0yRPzV^JuPL^LboU z&CkA3J>r{FQ4-D?&SzM0uFd*ONd5Ccg0gB@4tcjich7M)-#6v(X%{>{y%5u&x+C9W zIl(ox`p7n{C<+SZSLlQf8Z8qe^Z8I1?I}1M1FGvH_ok%3J1Akd^vI|ysS(S8ICMo)TTDd!Kp7n7oTt)llY=HFZ zt_|-etKXQ`h4ERgj)mw=fF%ULc(pGeZ;c=DI$tC)I8n<=5Z#S;0??+-XPveH= z)q==a+M4Mmjw~M?Yl>~Y8J|+?$!)gB9))hJwU>|m?X6_)z^OXdjpGk+bEZR>Rjzi8 z8v=lb9?-y#)=<&2T$jcRE5OGjrqqMA1pJOqSGPYZ+IP1)*Q2`(DxH=xx8O2UPFS?A zk4kIC?ESx-y21>KhRjXuq&Bq*P{ENLz~Kiamb*Elwmghy3peYoG`l#lFzv@?*tJd| zta&$Nh~Iuu3YZHraOgFy+CD2z-`%{|``welOjwuEV2Mq_5Pu%wI9BGCBQn-q^nI^! z3qz1@k!z!x$8L?v4YO{T^>m%M*10qOd@TO2NJx@C4DlEfWtFEiat>}b=a@gG5!+e^ zVY#E26K513M|jjc|AakNknIMu=ItKtarJDqTEBty79MI!<2!@b=Y}C3H_&Rt7gVRs zaX`;@`svt#*X_-BY(=jKyB5QE)UZ}$ed38WC*S@j9I{XqR=R%g=M_9EjVF%!|*g49UGbSU{3BxlwDrk8cIR*2sXE#sPSw0U^p2SB4T zbeXBA$g5*$j9+-FI_oEwhfTd_cfx|7-3|*e&D?3jgp%~GUfCFRmHv0lHLJ2Yi;5Ob z<)OcBtB@B1JSa?{XqJT_jsl5>tEisf8ts19sWS6NRwR9{^H&LqdkVV z(BXW+aK$TsRm~sRRW2XWhn{yBLjoaxUq4=gA23rKX8PoB$4;$G3ioys57CrN;x9hq zKV||&<~_9{6||Mx|Is-N$mk;it7EACe)Pd_DY1*mc5rL4gZRVDm{4F#X_MQqEqMEnwkN>)n|6^);#UNvIP@ZM~KQO>J zxFJGE-@lbMP524Ht85plP3yhx9d)aWgH6rNA1_BnM*avg9S1Jc|}IfaxSA&9OatCZ^%}kZZYA z*6YI`Y9-X{MZoge5SL##*bZi+Urb{~9xP-hA%I&YH)vI8hexuCV|%AKKc*TMQ;2Q+ zt?%=-rsw|G&{FLhGuHvC(CsE~AKqMQB3`>p@2B(rzN(uAa|*%DFdCcGPp&dwrpHBJ zZDNIQ(w^_OV(TH%wDwkC^zpQ+Qk`;V&*|Omn(q?C_uh!@Jb%M&^_fMdwi4oR_krF# zDrAd1?9(iHp0*ta;VOo)0Ac{A?T_UOX>6UW?RUmY9*1R-TXBcmM4*o6`nKCuPuKgM z)TI<%yC%h$ufYGcuu-H92NP)PA*N-?c}fA@h>lF+?0zrDw^XOjs{Xu>q^Ksc9@`%V zn*lqgq6q@7RT_1FG~=V8$=3pA#-&0YDxlqbx>*8=oH}hyFfRCqt$@c2A|mp&&d zlzLqMz8PYw(5ldHv)TXk6}dNYT;y>Cl_!jS$)+YczQa7*y{|8d*n~zZN-L5*ZzkP5 z+wu=w4l-h*%pC6^qE~ z&goaK>avjFU})dWH%f$JgcQf^SEv>#QpJ*t(Ce{^@7nMYxKi@7p#U3{wmiyqZa=R@%gwFiX9FG(O@4}fhZY8atI`9Qq~h;3GHs0YoH;3^i4x{Hqi+T(VHy<)4G6x z3xGej{ykfESfqzx8lf(EtI!>6f#EdzdU2stX9; zf8nwH-HWw3`OUhb{oy;IAOttVTyp3qd*&)q61jg{wnE6Fv&{qxmkEZr`t1fmNVwda zJ@$5?9~H$X3hJSyIgYmVi>h5^w4|WDD?i&_hOKKX~k{rn5I{H>KW2WZ+D|F^SDYv zMtX9E;gZ^v@>$@`@YzZui6tM11FzN$4U4dS0i+(aCl50?NNGEmDtdfpfn;jG!v_`~ z{7;k0BM&pD?^zb>lKws4YeJInp2w!zzaQ)&;uO-5#l5-=jpV3mIgL?dmr#39~PXrT8kwxIr{2WN-4^DW5k2JvG$N^CKbc#mLI%&M zUB|QQT2<^WDhQ{CNJtY46N?LrI@{y-JHfq7CmanO=d&i6w0`g)ZR%YbEfRt}O;;oh zz!TD~qb^jy6+Q+bfxkb>MUtvw6`_F_d&Nqb)y#L-!?K14sP1zT&H|Lkz8{_4uz*ZD zg)euFJm-&aA zD&VXcVqCqwD1!(Y-!MjJ3wti2^Dbk_r2>R37yv!+d0v#x4z^+JLD*>z0jR8JPYm>7 z>Uy_6&kydMgP__613t{2Jm(?uep8({{)O0~V50n=IX({uJTAYdEhga~L?D}t=R-*m zZpy|TT$3n{uv(X^dl}{u?c>u~Am%5wW6MDePcgKw=l+P~&Z?Jv6%91lkl3Rvqdu+m zYupuFo%p}Ezsa}nePJrx1d76=d|=7M7ZZ?J4u}BnsqE;U{hgx~d0?Y!eJ8o$!XaS$ zTK|c>TTXyoe^a;LjTgt`VMWIi$=8H3z<}f8VXG;lHfaWsoOgqd!spKD?#p3f?FY_e zUW^@TeI(>?X8qRr{yF51xgC0M;Dh>o6$F`G7>K8FI=+C|&&Sk@Z5=H?iX>Gy;UQjM zGC|j?xsaC!T~M34A6}##VW#*1Mc;LS5J5xo2g5D<1h@+Yo?Zl%z}yxU8Xr`0yv8CU zNM7fh91ko96xJ$+QV|J94s;Bq+Rk+pxfq}cDMC;U%Yz_*0C$)4E+RB+D6u_=h0~Q| zKv_D2Y=H(3w#pm(`-r!Kt1vE;GW6~hXvV`f?f1JA5Zcz5f>IP|UM3A3+}83tF8LhU z&yZO-kIbi5%sbW!@qCNV3EC6ie<$0W7#`zwwTwCxY2Cw(?EbA9c`hlGs7rntoIzl$ zGN0{ow%xa86iOC#wH~3uen!AXUV4Tx_p8GBb&|z1iBQcFuDdu?El0%rsJ!I_Wf1@F zvX@ZW6T3)i^v!BFgSxm-W=9$q|J-!b{*8NCtX;yOHp(tlzjTLGIVm@?xq(3_T z+as+Efda68o$~C(*DReOH-?JieKX+@%PT};HlBTKU@SfmWLR55U?LjYWfl)@ z&D(@FZ+s=+2X9iQ?HT&o2Z}@SH(zbZKjj<=dQ;uxui+l!cB1gKUeQ{i`8nBzuMWtO z!xZg{YORJM5Qn%3{m4Qctn09(HfW8Gcq9Ajkqt9Yb)yHuBoF8K+@ak^tKE#AGjhtEi9%TtA%A`@cFKpk% zk;#X3yWh~~*`aKA&>?w>dC@8So}bnWHN-;dK9@N}1o;-lJ>Qpz8Gox%LB=Pgm>z@B zPt%%|5((om(C(W&N#t5KNm?j< z#bb=`2Q~#vb?*3nc>z;QF`SKkNaQ?3yB?VKEiQ; z0W&9@x#Idr0{Hxy2BvfPoyy{bDTVi4{Ah;YI071}p)J6|I`EYIb0h)l1&oz*%URY? zV(Z2|UR!F3SAIwLjn~CGUBx-UWS7ESg{TwLR^}X`f&2|-K5*{?ykc|s5d;ZS(#8z( z=0haM7@XW7+K#?dNb*ggUE(E`$oX?M7Q{k%qe>lb2_u6~E>pBxoARYd!c4)n2JSn_ z?cT(#tqU==kksMH6896`r^Qlm^dAVYh#D;Q7-SI+TdiTBW}kzrr4c)cdp;w;4qI6B z*e*_=L1DVS-0wX?EBl0Qi9BCTwU>>`BX-I3U}|k1P?#yR$@yC<8-<8{NNt@YeCv(y z@_~~qe~Mh_d5|}7rM8m|!9hvzxK?lQ*Pi8UX*w;ci`Wv{_|xaUTpzJ0u1iiAmI{;g z*7sp3<(zY2@ASc}@PRansAyxVuKP?iwr4gdb1^=A-lk@64TF;RXUlXy^ck28bwUi_ zsk!Pp6n5*the$`@YZ@=nC0SLFb-!*hdrG`nW$TdUJZptgIXBElwjm;Sq1`l-r|W`c zUx**)!+rmG7JgN%^Q7fe#CIHc4TZ4O;(UO^bH2g#kv+y%E5JZ@8aK47cQkWAS!N4e zl5e%qLQNiA2rPp6TIxWP&!bw5<*^FhLhta*i@~K$d_;s#N1==VYWOkioG-iq zODipcu0zVu$hi5e{vBg~F+6)DhBe2QKNdg@*g!iDj>%2pP=6=i8DXb7f2tzM`AuC} zKfD|ppJs=8qICh-kKvx{r5vt;tjxnev%&p4ytRAsohKMC4;wst3~dR$B{IP)aXr@2;O`WEgAtaB@tBAyl!)}}`Db8v_wPCp-K@n$ z*4BM-Ptzl&7cu8CesfPT=aID3=PT{qvhuS>6+6%CBh#E_*%tA86rb(fL$XiC zG;H5o4hm8mExiEu)=>|uKirf=FD6?wK{+`s2&<+!UQgjJ9h`ecbv?rK6-V~Tnj7y3 zHJuxmJtrLAucFND+>~b@M&J)WCrJmD09_$zk%dS=>;A>Z6*ABEPfnvVvzx^PKB_@k zx`J!F>7TA9z@8=fU#xKej_XN$=! z-iEzLd%Fq=??UL2^ANN2#c`v^1ZN}ZzWMj_9~+vnV|fPov-UtgPz!rpeQ+k~h>F9m z?X-;LOjAH4XAkyweK14A!|e}JS`0!X!p%t(!Sxotq2Tx&Mq$_+nB}92m7YNEd>w)H z+wa*hNZJ3Fcut}E4~;%l!+ocq7uaWhAwi;Ah0o4+s&!3R5_fW3Y?xc0rM`&0m#Ig$ zT>@4)ZT3=-q8iFuAdO{+pyrLTG%Rnnsfs_0pouAW%7vs=gz*P8g!Nq+z0Wutv!33H z?({BSfH?Sv!6ccm4EcI;K@<;BNi=XcK{EPZ0;@(LA!wAVd2e~oi*>80Zbo|DB=4^ie(h1?O3QGM$3>Bo7}+@x0YQ5yxG zxSgw(8-_0tW;5xv+E1f3_ap%q%tam6|zf!@C=)t5BWydJ4L~B~7VJx8XwO zBKPwbmWjnG0}>$tiubjtvwO?q+fjQko4$NH#lk7q$s9g8z-EAS!;hP?|gD2g2}cu za?oj0hJGyuM(FPH zK_j5XqWVbb^=r3}26lrwjL(aHM3MtU0tb~=z@h&o;KNUfO{l(VH7SU%GlX>h(||fM z1gcXP)&FfK?_Bs94w!#p5B(Y6xH?3HGSfkJy%{J;`rsc9M|$x-C#2Id;1)r@$Ez1N zlo><(aYpC?K}N`+O5_3aEOuGh1FIOST@8d@zE7Nx20-W$mcXC+nJ&55i;l1ae_ zNOK@R3T2b^6$tY@;J6`X==7y!+${ZZS%|Y8z$qN@jysGO&k^sS_&1rbPj!Q`N~iH4 zkbG7}Wql#uLKgF|3Yaa)Z$0~>Bp{Ex71F)Kq!KKSm=M9L-5!{WwQ7U!iw8twBx9Ui zmm=&KZGQNqteArKAc{SnFkGo@>=e{3N5kFRf`SUqPzwp+mlvATqkA3Eqw1B{Ok?P;oETqZ2li1;r zhOLEZh_+AH12JNb10#2}_J{++F3+VYmMn{M2riGTApC)%0NxKt>K#$C7lF5;XH&)C zO2?n#m6Hl`J@ruXE_2Fvw$p0CYDUhv7SF<`w?7_*0SrB+ZVknN5}oO=BX%lJ8%u&yTN z_3$lrKklUH|14z&61cQNv7(fN=OBe#-+&?*kXQi=7WX1v&qI%=AGE1)^RGVf+z)1G zdeVqrx+od4)<08YSjHm;!7b{diA-fH@SswW3f6kxD;OZEP=ae|P&S?eHRW3;l=9JI zD*enqPN$_L$Mkkwr#zog`qOuzi(^fF-mj!F>|_J46eapp+nzPc?6@b|bf^udqa<1U zBCiU#MCNhW1Ok+SZT?swKF|r)|GPbl^W?z2%f8U#}8p}fA4U^P>QX4|LR zfFuAg6RS3ZW7K6Q`cs$&k!jR{y4X)6;%BqgU@bx*sZcV*INEk1!ee(vr#>k(gWy++ zI98Jw^#qMwAZZfUaw(Rh@^W6vcU%R-LZH-60Eymr*{Ci*>X^kWiYmH^^Wr0WP9Rvk zL=oRGa*VZtAoE~ztH;wfh}W3*%ST`ksD}#0RVW|m&iLCDey5ka%NAgzro&uBjoDd} zcevF-6SUqtvE=>%IAc-2waXe69ExE|Hv!9}gS>akr^cpMC=t56<@S8qVfr$vtTrE} z3<0x#%s3m%Ok;@#geA^BK##jswLT**|6skPqf#5u=74@w8lleldX2KOEW(i^ zEqFcJP1>5ONAfp#Mmcv%%fLVfW?=hzZ)hml_ouo!ee>iM$DUMNMLrQ5@<*Tr37cUq zHbeS>+4b+4+r#SWn#^L(IV-ga?4=Yym_+CLcsI=h)+XsW<92hXN?c`|$e*aNEC9L? z?Y!A;b25sEy-O+HIF3`lr_%`@6Q|Wur!kd-Ejq}5{)uSyr#rE#DbaMnE6_$7!QVaE ziQ_cx^MPcnr1=}A{Q9v(hE?$nlyRCxeia&WV*vuunJ`z9e#}*Qc?FYtXm8rZ;WLF@ zv9WWD*NKV`TwwAX3SiQDIBo~)3$JB@D`Wm^TCq1N405QqWd*er95xNJxpKCvFGrwU zZFIU#OQp~@??j!POJ=3-leyS1A?&wKk|?3x9Es`@D>h8kt#w&ZY-~(Swn7?e!wm&s zN8C;)YN!`slEV{!#o?N%V$at~r}%JdZ0eJlVV!;u(v1w{q47>C3 zJSV=bg#uPcbl)PEKIxa6hhZ->JFo6@?G`w5bR=h_y;o^Wf$z=;dVco}!c{_ve5N0E z;O&tJZ|z${YvR$D7DX9~gwiYiZ3Of`Vy7UeK!huCX6`|vevzBTLMS#wF;U}cWc^4m zpmgQ2)z^Ga0h(Ooh_UkHq58?ec`uuw?3& zd=#!8@19XEGY+f?A-t$ps-6w9n#(c4od^h@GGDr5J1|Z3`ijB8fRcd2BV?u`_ScOZ ztL9uf=Uk8U;_8m~*fM|nIrfRnSUgAa_mlJR!<>I5nckOB|D47{_!zD$j-|gj_?F`V z3!Fe%4wo<738inuBG4Op$0yGXSw~vU&>`J7=Q(JL9F;O_jJ3A&AvX$G%x9I-pF8D5 zw7k~0DurGW$Aqht0^%`j3)iE?bFeT89~{AP+uV|ooe~d`;XqPg2G%#;-|)CGWI|3| z=2~O)mQsjx`G*&eWU_iQvc- zmRbB-ulP{l91Ur#7Y2pMGABkJIy06v)>#16BpYRno8m9neflZIqK!N0d`COB0n_Dtdm0 z>za}=8HgPVKM_gU9mRu2#xY&;8hU^H2k$yb?2D4XJ@9b#SdrfE1mto!>mrs)FA!Vu zj+J$+PUN`j$=VT&OEYj`+pxAvF-s#Ya?*=2Mn(2Rr|kRl(Q=SesJCMKo&xXc(bfi+ z<5Y>&-1p;QnLLjl;`bLR>G1~?(@1jTLYFqoD&&nVN6nGfM-#(iB74lQ8sF(ZDQ_8u zaeouuoWP#lUFPvo`|aZv(;3WVQ}ic+(|=M4s>=U{hfHA+%9#O|7*?Y-Em)C39O_tJ zobIhByL=wkX6nXuC;P$AP56;@_I|1t+W;nMUH|KROk*ro9PDA;%uo7mt9@Fna zWOfMkYi=Oa%|=M-=3E@j!2qk?B9Z2;q-4(Let%SUo%z^zhLzu*$pkKsLivKExnZrv zf@D(k&rl*Tvftd?E zuDX4|UStkE*dkoWs+0R}8+GDPMw{gD*x@`P&vHInF7TdkQb9?-r1Jr7tV4wE=%#3~ zbr2%OqUT5KUvFX`ERgU|a>N1=?tQ$|Ac1nIz04~WGtKCx@kkYl$sa2^0kWJOzG87FxZ5ZrA#sE-j`=LxguyNoiLu-u)80$>iWR*nz>XyqaQN2A zfA;3cA~=BodHE?#z@IjZN9y$f$TE(AyL{cGbVN z{ISeDKfBF?sM8seL*(zkytEWtNywL{I0?cfKO!`kUcIEg@PdR74-o%Sf>f|*lwTx_ z?G}a_0Th=vp{!+n+G_l8eR#U;J${piOwK3lv6}8$UDPr!(y%t$3ol4+jwxE*7s#Rw zW1i_Ag5GQ$=S#_+bN4M#NtP%hoCtW@dRd<3HTmwvN7T+mFFVd|uKbhUazW^FMxBQz zc5)hTn0;s1rIYlWouUxA?ZS`hHv5p&t!1jeP%M+XUW$`d|q4#g&nqW1Xk7w%} zQi+a;`^gA^it~K02WVpNuCNQw?!qZ@rH+ir$VI8boU4VV&duqho#}vH`@x?dLw3UW z!LGnSvMD7wdOPzEG&A%dLKDg_Tfd}(-@y>o;3p)1RXd>7mDZ+FASK1J01FE~>miH= z`gOO5IVC9#q3?~*2cYjDOT(JgtXtMY)@6T@ZzstNg9-STA!#BZoMZ*fT+YQn8!ntU zLgNCRKyt)$WF&h(W0YwlhQ=x`Evi!x&N5*IL6VF>zKUk0ns(PSYN{Y3q1{6O5p;hs zoHG3-4hSW|C(m2i7+E}|Qp}%KA;mzSVG)U14JY_KyR#d91FbGSqNF(bBGeo&!nv3& z;(;i9GSc@N{KVs4X3oli8Em248iz2P%B;V+7Kfiw@bJxpib4A+b5-r}TMLFiT0sZp z?YsNUuU~S!37NIl$7w1!q}|Q%=tXQ>-SUQsn!tBoL+5Z3<}sif8-K?*yITwX8E__0 z{j`BuG(Cs)2p&ZDCSUx1MHVm-@|7$sR8i%PEy-eF$!5t}0^;nRW>hXqY^qWo^ryu# z=b?jb=^`6iLEc4=+K#hD>7PRtVYrj%0SJ5Yo^=crx_k)U3X744dC_Dso%9g@A}Rdy z9D-d^zJ+h-%bQ23rS`+`Uhzsp9QSh5zDC|+rHw>{Z$YLyJ@1gPj%ohLf*%I_OeQO@ zMnET-S7Bw_0F`&1&xiFtS&uE%wHSUPRkV!w^LwwK2y%YV2AdD-CH`*m0bHSpJv_v-UPGn*m-% z?lJ5=HH7YhqcXwqFXjHp2>K(ew>0W$dKboy9$|SaA1KSEz@+{qsL{{^J6lwKI3fIJ zGbJUq`6p%dFMlGdR35yS8lZew7vIaZApWAlHu_7%G^OW{Gg#lw z5t)Mj^0oMcgU{|IK*#vyMYQ2zAE=N?qpPv;60DLkjOza3Rc}X<%~pzkIs? zyz7Tl3JaNtS!gxdcYjgLKd3#D3XtBb;HrE4+2DT_Dlw3f3=k~|_y&`iG#9H)hi&dJ zcIu6LQHICHSnYKdRp2&}Kbx891f$@W8uvzMlzgORGVp0*d^um30sUp}p|J-fDNT}V z^yFmM5&y~Lf$()${PPdvNErPgJRw~Os_=H#rWpSH9?SpkZ$Z@i@JK$n6y~a6RKgSv zn;|=GYUMH=?j`V6^zh`n1HC^d?9ajw^ZZNrKn zC{mKrs7Q!(H&W6d-6aCjoeLBsq?MBH?rxA)x)-p3MR#}eP4<5Fz4yNL`Ht`V^Zs~$ z$Z^SHUDv$EoO8@M#yHP&%1X$lq_$pzEq!|Z3$S*C1d|EO+yFKj`BJ4u%=bG%P^y#= zy$L{rYQ%_7pze&2=*s+SvG@-J-fvo^JuG z>^K&+xQC2h-iprC13(jIS@E_3e1`+V$8gV^CGH*o?b!?yMlZQKfx~N^b`m!%v<*8$ zDnL-#Ovq}YClkwBa*H0RcR8@#x&hYE2qop)yoEn88Fnmcs1ghG@g7J6H1kftg1jlo z0%&jLuq;n6C_06v!=mjcq+^*1eutio&pyDp;ECF^r$)0%Ss%^{Wgsr9-|yn4c^*zB zR|$&GGoZfcbTJ>uusNn_RRJPw^=NwS%e_Q^4gz8BN50cpZ?Hu> zFjjN}2y9#F;j*PO4Q?>d5=&4^%L*pq==(;uoOr!6OxFYdb&&1T?*e&X#d*|B&gE^W*iMfUf8_z#@ zCRR;5YMS3@J57(`z0!CWt>c z@ub-?K>kepqDnG9+JJKK8qc_HyaJ7i#d0PnN(X5&o=Q)hrH^P>#k(5w4)f0Z8HN!G zpNaoC?&S~zAl$eK=k?|QZQ=-^Ag-T$au~K?RaMR2$eoUE7h6>gD_vm1S>4h?LP&Tf zjiR;jG($Ng0gfz4jUDA~)s$_Z!|DJ(BQ;-oqe%-$iDq#6av+@wOJW1V-A%d65 z0s%FDz!lM**y|+QStv*!r(DVf#L+xZoG>RE68+e`Td6;Z)1q9OBe>Z#C`L2^0J3u@ zLYpWT7f48_$W4GP*H>0QAMkP$ymPWxN=i07b7z+^n{6jdl zSj7AcJf-0TYwctM+Q0i|eyZ{2+Kp!;zYIXlNev^b>bsh6VOQd0ka8xrZD6l50FCg` zR`keJ6jOYW9Qj`!^B-RIDe#*(byVohMhDE?*UlZ7{YX5(JGdiX1CUYG{*qm(G&0E! z?q>|{RcVgYvQQ3m9WH-_W?8-?C5BS+WAn0Jb`K_)j_ohX85ojW?6VNg7L@lrHV4d^ z3=Uh9qxaDWad`Rwa&dNHlGt@M#bv8;%(c(wl*j)G!Cl9>&*a|Uz5V)HF$6XbewOT& ze<4i0_Y{9Pi&iNcQ(O5t9BeMP)K&A<1_O1ArK0cZ$ln6W`a1ytMlVe~^q7=wFlf%k zXP^`y6VKZzsu^d*P!yYe(Mi^axxrtyK9y2N2a%)0!YQyy`N^?i?Z;lo0FmOK^;M-u{dHV#R12A_D<18v;C?*jXUWrRums`Lq%2uPLN+obR7;Jo>5jiJNOqz|vzc+uX_lXG(B62~p6~7&Yg;=D! zeoI2x3!KsmueDl*{i^x>#T9@_suMvnDZm19_VHg@05X(;%apNVmnZdICYQ(OzpZFs z+_VebLaOU!KU`m)d0_LJrVa=0W>OqW6|axx`4utkgfpVOKi!?{fF*smY-gnk8mHeQ z#Tz^{gBDr<; z%EY;)eE!kVHbFru@7%3;SU>S8M+E?ZQUsc^p^|hZ&vj>GHjm&aCJGB%YI{-m-o<=c z-p!wB)V2JwJLOXkCsu$TuZ*G3M6-(UVw;}d= z{@UvOb@6HFHF!82^A&7!uH2=y>Ej{@LfH)Dz#1-R-1oD_ zNsw$me3|)>Nz^p2pz>i|*3qxS68l%NRmE~Tk6IiNqhBO5iDAA&j3cl7Z1FfF)bH_d zN}}iW*>?^M9j-GbUMtS`jQih0eC|xFnde#jwT1ZiMRGL?j+@@XDLSYmmtG$Z%T<9D z_55Qq*hen-;OnS$hrjTE?-E(zXTr%NE^oPqpv>W?T*L1ojDsNKeDF5>g^X>%3bFxm zD&}xSi_(kFNuXymR{9bw`r^4f$PlPQpRl|yxC(zIsP{C~d6uyk6$AI$YYx&<{i}R4R?Y=__Hl@uUfbbdV0PywYs&k0>FlwSDTya>{W9)g~1#qvR@SerE46vl~IeG z2_QqASoO>k*zZ4J4dN8+!JV(!CA88pODx|BD_EeA~_o82rczy1CH0$GS zg7ZlKi)!dWM`p1=65?xgF<0kCOetSeRri(Px1#!M%;a)y=goN!LjZ_SR>M#H`_m4L z<{*7|rG;kTeO6g2ECj8c@?qKQQ)!!L$Fkf}vQK2FNG$#lM*Yo8i%O8UBK2!4M?6@L z#G9e}r4vrl#L(=$H%q=P0ScY-sw-ziayXe!GWPRN{{f>b_|C43xxhBn<_G3yhGgW! zZz5fg-Q?!F7lap-OX!rv%nbK$(dR)AABX$Se~HGrc)E$xhT;oW=p{Al)%u~24k(53 z&`J%4zwc~s{ebB01d$Dr6(DhoLCLp5#B`g#$5UkGqU7=K5%{nDB7lju^Cvv)0VT8v zM$?Uas2c)p+{P8<+xveHUi7>v<)1!9S5$t;%=f{&L6UpVfI={4gf-VdsKEPoE&$F) z!7u)ti*^ga9I`xO5_kKg>ih*8Q7}1UnQ4A!pkaPGiWL0P*7l`k_GkieC-RG+1lEsx z;s~-5gHW5lw?q(eh*Ez3Df*M8VC9?Ziy|+QEVt2e?XQ^R{!C2PtUkGKtZA`+3m85* zNb5CV+O%*zUEbBO(aCA}XXJsNcSwWa0|2NoYq}h|B?h85+|FM(e8h79uN#+iHNZ;=N2mPb zFasY`N`nyVf$kj=oj)`W^zIM^ITjU(H3-MV`8VtS<0aqtf!o_tn-cx`V`}|d*3K!y>h7Pd7lsaQza~G#{^yV7 zTR?Ohv5Pb?_xpgj9oXa~;Pyi)>3?##;N#@ax5Sh=)a2H{{|;;aXY2}cgWIPIOTc~~ z%eTJ~d~h2ax8Mu<;s0lc{&oGy9#DcL{JvFU{q?K=y!ijn@zhBP2?>3U|6AXQBqKg} zmv5`$)d@}cvjIT&lP9k!nF2kmMj7FOtJ zq@FXIL^aNxRaXf9UC=cOT))S}Y77r{@o0kxIElP`4j!#EP{fz@F?k}g2k}sNNWx;In$tZycfvDpJeWd;I`=-)jNv{<$|ws|Ie#gplvRRTA> z-OK$qZmo6M8-q{qmCxq6ZTXBg5!V;N=~w>2z_rmN!;=|&(RF_va*rCDpA185(GB}<^(DgJJavWtiX(@4f1}9m z(qY>Cpx3-^t5T|V4Wt{)o4t@!z&0Zt7O{jo=SrFDXL<=}OMR3c=NpO;se8*O0@uaT zs(3GzvcnkIJ*%(uG=A|(6$4qRI^)@jTd|h0^0m1$Ni*RIf*B~>IvfH}wPTCLtz+C< zphaC!4&0Y2`dZWO9Yo6SM><2J_0oll+v=S7<`dOEfvZiH+oYU@CNzXL zzxQH`qi(Jv4g&W4qc6>E&t{U)4OjZACN9X_^%S$NO*+Y(@{Qi%B!q?SJhDjU;XQuW zXP8*u#$Z%#;7y|wVMypb(=g2 z`2}VwCqLwg#NoO=(eCOLH>#_TtKed}vZFuzbP)3+p381C(QUgzT%7lPKi`cPan6er?(0QFQ8$r8urp=LZ2G+BleyM31DfdWxfbuY*Fa zTa_*puGNGpsF&duYM^ki$ZuxXH{tlP&T>sdMMaihg--XYZ8Yeqmg-J2$YM$aEOIn* z&XtXO_G1O%0vZvXmi#M89WYcbpqFQkTNO~)tzZFFytR9y>_Ld-bU`1x0}$4+I=t9> zRKJ>vT9A1k;hU|X>N ztr2hM^W~=Q1&t@Q4CK zaPH;rX~P}it2Hs%G8vVFgy~#`&&)iEIN-OmQM2h<s&#liF}*vOngn;JX!zsISQ%KFMM4hTk=Xjdc)H+vnRFN?ZdLSQen4#N1)D0;KiL?-D1mm@=vx>ZC-@5E!DU3I%S zT2TA02+g)1eLp+sZ)AyDz0~i35EykkvSwGq*$cI}pq6VhQYpmp0wTe1f&SR79p!z3 z2KuSE5fW!d3lzs$pQq_< z?rUFtJ#rRQX&0*P!DgX@|AMUcQ(|`WJPY*eluK5E!Ly8Cg?BGRCo*Vt=LmSAHBo#0AKx8`9j$As zxB8m7-CMe%>!x|>?A#mAH7tyK=wFhGbU{H$+z`u)U_2zux%B`?#yCh z2tQmRkhyhVp3LV^>VRs6<=rZu>{Pbd)x}W-Dok51i>JBNsfe_)pWh9}($Blm&*K`x zn8dU|wX;O1O?pKN@eq&h^wcfZ({FJUx^x^okF(u9;(#wsKA*7jAQOH&}2MWAOG{?r`;&ovuiz=|%}WL8-nz z-`FZ1O^oN&+?$PGpNu6q*$2tVh`g&re`M$kWK?8gu|9f)p* zSvIr>R!}8cdreQC;c={16;OC|XqH}34%)FO$I(u*2h5ncRJc(ufTb_ALa643`bObd zs5!R9fjG2C4i43ni?^qM%sw1w4do@=IDB?pZU$vvo@*W%B?bn^5+vNaC0eUp1TyTWnckw8hTkpBVep!0 znwQj|k=RxxaRh3rH#I^o?HTq3Gu*$Mna{tMq-Y&Ybl)s-lNI-8CAC>$y6&xV7wvM1 zciZMV{&5du!eynhBfRCqaBPuY0FAEc@(IO5NFj`qwNZyUn_}j zuAkZg$0%L2)_jjWHp@F&Sdhdje>$bu+lGJFb|oVFaGbqbO2D-WI;bluLI>336}_jYQ#q1gH4p}`3+w{caqmbH}H+)3ZRQ-4$mi$9fbwQMRVGvtIF@Jzcv z8xH#FJl^5G0om;EY4_pak~LwM(W*J_st*pi4a?h9Vq$Jn6TN_4nCr9mFzV zx$Aa5w<^Xi3OX;D#LEo)GeV9&n-n<*v~jB9?mYKFYBFZ~?=p$JT*O`39G15IcK4~j zjS`jLqs}{-b_<0wOdC(!Mc%YRz1Go_7Vf}2sxGRWvX#2gJo?%hwxL@cH5U`M{=`e| z2cKU%+;dGQ?ezFQ)W7ylsLo_ib1i(LwSt7Bl)u5vS2W`~+*X1rSJDd2zM9VL$cjC{tK|@t8vl~UXdJwRtXQ=BkD!_8j z`@U>`7MhelN)Wrb&IyE*-(rq&)_Fh(xz>1$vScF+$`Wi$vSfdL_~g2pS8mm8H-AQc z6F^tXShTq^_%p7acnl{BfRtQ5VBTMAs5*Lo289I2{w=%*gXI>mvD?ZNayAwObFJ2X z%>Xb}b}!1X6;F5^H%&m@%d~}6a^v-R`AgLkZBFF-3kw_7@;c#1S=f9WHOSv8a;n8& z!>C72fNT10+HBv?m@Esk07byc=}Oqy^?erx3rLAHv$h7>QVikZwfFSSd=a7>*i|)sHPl2PK(xgfPfEu(v3j z<~yaY+igL;G}!dn*K|_P#=g_$@Cx; zI%#v1;#g%@UY%oDTV9M7xSjB5QI*!=uLGgZaW|uZnB>%ukbU@;ec^j{kb1WbWz5%rp|>veFI;w!NGF|@%tdLwxl zWeQR?y|qV`*rUACwvtnRbG=bS%plsfx{EIsv&PA?_9ht`e7G#9Q4AtJEt?c+SKSA{!PfdYq5dkue%6@CrxAy7MX z+T4q%-^;w20KudMpEgN-7WP-T>xKnY+j5X2^TQF(AA$_WyL4;tqENSDD>H9o44e7= z7A@0I$P(_x$lm+93`KE)mAH$D9Nr*qr!Ct$c$6=r(F_0LP+sPiK>iUXpc43@H;$u> zV=5UTk+^M7PxCV+H>csp#d=OwV&$!VSeIe$1r5~KXcoC2 z&6!C}_=-5l_znrrx-#7;8_LCQjOv*Ip943E{rZL!gXvD!KE`pt#&`W+>u62P`@n}h zN$4k;icsic4we-|bMZie4Xme$IAERV(n=jYl5n`ma0{M?5nWWTxk=|3$0{(2h}=g- z=b`JgqoZTkN*d1U-F+>yh3LSvXKf#rHeC<9SY2 z0xvqPtZz^v*WPxitCRLh-y6djvj15zgqs-Hi^C!V6r`{9u+Y3t^NL# zSHOG80dD8+{8SR4>^>%V&eSww9C#72whg&t?nx&CS*mGAGh?E?)mGUa&ej!th6S|g z%(}+TTV;hw463vJ;Bl$Vc#$z6;K49E5c<3loyitx5s++*6~tNHJ91od13Cse&l|UE zH!jO)6}U5O)LHP4KUa2dRXH8qI{=%Qe&vu>t|f=2=dPBS9~6D;(~@!~`G8d7yOTPP zrzJ9V(}Sbi)oFo5{%1oKS<9W@sDmLTZ@0cE0z`s9ZsZm%zZbRs#dcMwQ$hOUT-_#} z&3P?|GO~bV2ZETijkd8;!fP+4r&6uvzrJN$bL7q;W(_2)@(Mf8>hZc~xt}B)3^_yl zxHldN$B0`0V0TJdq>4%DVy^9aLz3Vw*1sx3E>c2f!?7C1$Sj4N__4P@GijaA=39n( zY&6Th;KCQ#p0DDhb43rJsCdB9WZm?hA$|3e#fKsu`;pB&U$(Ik8P2?wQ9aH)(5oHL zZpE~^(_w#(J@GxdlMsV}H-4PVP{3=-AWk`Nx#8tyXtk#n6|EiNuKx3g9iYXUF{e^J z{RGBsRn)LWxgyg>-EE6+=Tqv>xaWg<+3EiPLzUat*+)OUv$ZakhknVMyvtrbhkye| zSi~Ev!$Fv?Juo+?ZcIuQ9=^NGy;Z&ta{Tc?PqKqb;N~QuIw>?;|uV06S5d{0r+Tcb}o}0stc|ErX z5;7F!v-;Q_%dx*Qe$HZO{Jz;hlkG{s^^DB9{xf$v{)0K$$a@( zLBk3XDyLlL;~wkbB6Qo=D%rx+9L^?4X(@fHawr~3p@ks8{ zL*JAC$t%(9WX1BT1J<_eR?K>rIMRefy`1f=Vj1;w^G(2p;oR#m-Qum-y&uPF`t9WB zA{UqrXb7S8UHGI?RJG&oa~kt&-Ya*E?no(FeJ*b`_DD2xHkx1av5{kn<(y`FQ-W5) zFR6s@LO^r9bo6LWC%EZm-!AxZ1qZr)KT9H2glIiKradMxO`g%O_czS23hgS{jfff7 z3yUTTlabt{3bg2!+xMkwE~Ki}(%ugty~2ht0TKg_(;5m9D%$uz6)-mkV=_3fmbiE6uc zo2W38wI2SA85r{cZAB0023gA@LazG3V#q(nKC2!~u~}|DG2|A?VK&xNbV_Ud0@nZY;z% zRrBSRNlSbKL!3nOMWyo8G6z+WU@VaeNXMw`N23~) zzxy#uI4YN79-CVD=DY3VATt@{FMia%)vc?E2#gY zj;mkyoc6xOFZeDE%5}XGB77oKe;I%-D?j;*ki_}p!QzL<*x%A%(UCg^vV851c8P`x zsD*Gk;de{id}oV_Gg4a-qX~Vh$IjAX!RIGiRaDLxl|4Z{yc@7$t5P?f{FU$!H%!B9 z*cmD5RDMydX~-<;)Q1|UoE;ZCjgjgZp!E?d>uVQCGaP~>{kWo1QhoE2B24h23Z^T$a@{$oAR1v~9mRFK4R~ zZ6DjTS(xhCYyT{IDqliH$C$^`T&b7oW~{pt{0YYDhZ^7bjp(I4$1yj+syPT`Ph#`J z$vjE+4<0?ZSY9Edq-BZVyT4Ab)lL-j=|Q44uVL4>(aBns{H^fydS~{2>-lHHA!%Dv z@<}pwOzMtK{RH=yj^PX^?0Xh-rg>R6v!AqU_G8i6PMqB#BuQDZY-8nY4=4NNjGL^d zOeQ|w_5P{WDVxyxqOh>*%a%WtKBmpv>5~-m$3J*J*c*6*SZ=AjG^?9pI0^wX{W;!#1zClp7xW!s2F#~ZFmOhcN3FmX6 zk^Of%cRaG(uhS^RvT*gOKXlLU<7=zpH9i{~AP}qmVMZxk;>9KX{q4a*sN%F{SM1sF zs}&q=x|eP;#y;?u)8(9x+BrxJ6Djvh#A-}Yr00HxA}IrW1GoHA_Y!dvP!iYSOlLO4 z3Hj=%!xn1BG^10k%wpj+7^>&&gEc`yx+%ViPWn^nBhlxjN2HXz%G`_2kVR)%_cf7G ziJ603;KUoUWbL!u;ZigqL^2%b31a9*{?!sF4jBBW#SOgg^WCQ3C8f^@4PHqtoJ`5dmQcDX&B7#_Ke0y6)mj zT*CE_ecM}Tj9mNvnb+!~_r6xmEq1=Xii(U(FyqKX3coSwq)t-riPSN@63TkQfR@<@ z*`4##`H7lXDe8cx=e;s&Os~g0qZEPPwwPk6?m?&9U&ga`A+PHyD<&2 zvr-LMVEI}x!-;7g3unD60g*LGgON5(-A2ph{cEfXTqG5j_V-aI`xsU|;>nI!lfERf zIcRZxQ4hG_=PhbsVXc%~lp23AXw$-ihUH(3=p4ipc3v7s3;v;xOgH%Cg&f?O3VU_V zyX3lL^k^}Nh=U%F#qX2bc{YZ?WpSLr^*3xA0muF9~e9zwp^`K=(>ub&F+kcPT8 zO|gAHCVh_9q8DS=A0sO1%L>xzo^!(t7LZ`5L~%Z8s$L8PB2q| zOG*2Pr2ojaat^%LZH-HbvJbG3E8a)8+8j!)X}%nOOh^yd0Y39ogF3T1CtTr~7|zKn z%Z0N7tF$$ob|-EE){)gizuH7@udgux9<+RcsU9N4m^p#jnO^Xcs*PChTn8YqTh_Ib z_7EKGjk0wc9iLh;*1vYPlwTe;HSxXbnqNr?dHLwOhLqML!f!&SUHxot+I_{y5YUGS zs5c^Tm&X~btysTQnKWQE6;dY}rRSVeCz{X0*Z74~PjvN*u#CRuC_dt^UqSTbwZ*#W zjvWkH&;on8#tKA20}iY-N|cw*hV#J$7SPY%KQ(Wp6y{lZUhatt+`&_WlyQq0oKEXG zXxeNPn02h1ZHu;*0=Y!~am-_kBqYc-j=exgU7cIZgZ{|YX{Ej0{FGoR5?Q)PdpcqP z=cCV%-8-HWKBzxHfG{`MdgzgfgN>IABhiM$#Z_j}@gdy84N)P3lT}!-3bU09;s(A%~A}eRARWe zAa&(>RPW@;%1)#6O#v&5^|*b=PWvZv_WTrU_OJTU%wPJ!3F}CCfichK@{3gRuFh64($r9-m;@oW*QZgv}hI|{1WUr>LAhBv@b9HLsfq#&NVqMgY zdn--x&8r&*C@k|bfb|9|Ek!(3XY44%a%}bEy(tv2zNv0jCx*zlxv`E`6rs=eos`Zx zr2MK>DWZJ*m^VTl?h41a{qlb~{MF=6{RZJ1#AoPe$4ZP{sy}J=+XP>i8KaM=L)Yx*NWr^4z7wngFrn)Ptfn6t14p zUqabNNv6Y@7lMZ-DrE?mq_Y~)I_cNtc)1?<%M?pzE|5Qd%oE6o2eg1I z?&ta3)Q8k9t>=7{P9Ps=F);sLDh~OmCn`Kw^7R>1GS{(S(nAA5G0oXb|FRsFn*(fq z^7y#cX>?~Q9gV({Cj>cSPuU7{BvL&p4k8kmN%NP@kUSw=Y!539P+fw;-7VlXv+I#s zo$;r}gR(THZBU|ml2;!@_voJSwJm`?cR;E1iW_%-mBsGE#t#^kueq*mI!QNRE%l=j#^L;ywqKn^Pz|*oMlhaagK8~YPy*J$5%frt!vW1uLs`9~Rh#;*&IcgK zZAB$bx@`P>Hs-|hc>CUu9D}Xa)40vI8Td2-sb1tV5eD~gk8;&8yDOZEaE~U1HXp7l zD{UG;`)7CzR0Tybk%ZD|-bT`sCvRFdp7p!F{?>ck^5UYW;rn7ljGYHn-2QSxj8#YI zNzz?!>5bIO1WGr!^l=RBX^$GQ@R9id2Cu8d-hy5&dAJ8=AVfyCeaC=?q)nk%7+>rO zQLLm2M2@W*`qGkc$19-G+Vq%eD=m9!AGce^8#g!3*Msdr!284@zvove8@)nu@s>P0 zo5ms!D+h~^2@l_T+tTKq{A|TQ$_sGF<0uijSG3EJ>dG?NC%S}O{qq#$J9YD2-&z>T zuodDrk`G`JH$5GDIA89h&3R}Bk!R)cds<3}sjOSdIuOtQoY-@!r1^zt?I_u{D8BaU zd+yr4;0oI!vcpnpp7p>M@@U9j^~G*-xht-bBO0Nzi~S42SHowk!763Lh=zV9m2_8x zSwEzA^TI1f)zD)t%to>?EOwQlKq^GT6Qn^*93mOkWr4VsyIX(olXUguL-+Akq~UKe zJhb_xmzwLt##ZnGIhH%7(%+;QYQ|+STq+w*Tcp?zmo+aLLStoB6phTx)9qg+)iC8A zGE}ZQ$dRQVQM}bPi2RzKnp4Jh-E9~uFlRjS;8?+0#wwO@K-JUpVf}^+Sww36%zaqY zQ9O9Hj7M>l#?V>!dlXHjC?7PGy;WN)z<+J!lRs#dx^9|!W8_liOTueK8U)5{` z`nnr*gM8gmCuAr{o2ssH>EUVz-e|!JT=*I3u@H+x|Bzo|*);O5<#r%;`xF6ZgS$$a z*Z$U2=qsVY3c4;fluCwG6>Js#-8pOH^r#p~{M+#D_+$=NA24@>wA%uMIgD^DK{4gLYLw7n{1yBN* zWe;nXE1)yG0$OX3ZzMq2iR7tJAT2<<%)gXLP(w02Y1bA zUB?{HS0fnr2?GRU4%Q3t9wm}ZSBLRXLf|xO9$iCYvxg6pr|gI2Z%Bmip1-7T;@w6y zqVU_&6&S&lS&n@o7xhqw#PuhI2Q;-lYmE&YT|?#|BNXG4>z**-i9<91*VbnBO$Vwl(v zn`d{`!rL*bC#4MUt;;Vy3A?<$mUIpFebg`kl#)zh?`sNdrn?PpWHl0Ru;nMG_H$3Z zXo9|O@TFa-EQabsLZEtO4+(J(W7P*r5H}>x8x@DH4t26mnuk1ml`dknUo{;tZ1Twz z1(t@8WHB-3NLN8Ftakla_Je~3HdQhgx_8tLbqaQJTto1x(ucS#b(tNvArzUAUk2u?9Inb1fcg3X5v@0nP*!6`f zUa#To7Uim zb@qKEJek=J%8^?S-BPHn{KoOUOFslM7$HgF9Xn+=bT3%ZOjO8L=Fg@X7a#^OH@sIU zv~w|~{ircXp35)YdEeST|GYG{r@lpU-s4xLs&>7~^Kcqxb%i3K=8DC_QHE)s$kax$ zh;}!11sLt-_hAS`zv$K3)fMgup=msiL(OnOM@#O*yTp7>0q5uH;~UXB!ll&^gFIQH|Z(l2nA8W@|{4WseLJoKR=MS(t}STNF)K&oUtBYmOX`B62ls=l2H zmOT?xw?axc1}U(Pl+1XM0)`ob2lJOJt+C`6_XgU;2-`G;sEj%(qgr&59#_GYLWiIF zD{Ao~xwGO<0yk*sT}Zs?1SR@Z`+lw0Q4uGYjLB}9&TU*KCfh$PAaPX{o$&ig_m50Y z{z(yXWyDiW$;g-OHcvm^L0F?+?JlYeEgNR9;@bPi6_E6Zxe1VXil&UK2 zX2F5dpo^j;Rr06SixYt!jPgRJE+w2P-e18~;|*?AL&}X0PGkeOl_-xCi{Akmb^2G3 z0wT?1Q7vfhw=wm}tBCE4iIDZt0`YhC<=;1TGmuU-bBUvM*R~1El50^DqhDy2*v6xY zf4YN!fAeQb;$X*8>pY599F4^@WZWnEoqFIa z;p0y6`-eU%ZQn#@QU~WdU}bg{vLg3FQqeElUC4p$Q2zR%EUkCbVB1vMc>E!RMv5{auupC!=W)CfcM`*j z3iDkrPD(pN21HE3J9q#3@yQl%wHPvv&dFItG&-QKZc6l1;g0x9R_ej13-GNkql zo6C85huKt-8(&l(g!+=pQr1%wKmLyL#@Bg=T{<_`Ei?#)~|_dHVIu5-(#&t~AomHX21) zTH)WH+$B!V3Xmf$4oiko1^+hgzpeyh9=ropiL4&lw5PwD`Oc?(te^P`X<}z1(tr5! z9R#BnVNcLm=wxF|-(vmuaJe1u^0Ejb)?E*xKK$MrpGtAa{S~8PM|}QsX8f~N5#e`) z;%&V$G=6VTG941id_=|z2a5liQUCbf(sMz~ta!Z~yx%*8S_)X-C`Us3U$6b|hYE5% zz-*(TQp*+ngYDjeepdhR7XOd0hG_GD?W@HsDOr6QrPnEKyH=~1w6(Q;I29842iqB8 zqxiL|H0fx=>P?3q@|6#Oyw@|_iBts6_Y^RLz$iR)AKFsW$=AP|R`OLC_Lp%lBvfs_ zuMg1{m7JYujb<@_&>S83Jp65v>R~^irV%YcYv-gbRdU7@*UtX=Bj=}-wB~P3k{?3| zuuwW=WWptFqcLM$|HFjH^#Y?S*E*6*{I}ut#^rXBdOqO#eFSAcL_oC3ZBbq({%tIi zFM%>C+rqwd)``y31 z)d54YOZT(DqK z5;OlbdjxY)>km~bgNboVz={wR9=>j@SiXQ!cNo#D`8j{*E(K4muGpZXHOiznGH=(qWKIN7KCfbEI-g`_VR^8KgB)V< z@BWdbEZ#lw*LEiiPKThkbN z>Yqlh^lmnNLowpuHTe{z_Lw|l$4&82oM;Gc=3bx&5B8d^-68$&KgJIEs=A?N4rb5}?HX>tDD5Ymw%DF>VSm3F?KoA^ zsYZ=cCGnLsh?Hf_aV94Z@UGo5sUm=Wzz9I(8-cS!zyX`i-Q1f4Gm{lCe*L^tzn3b7 z_wt zvm+>GN|y|#iBs_<0fDD+fVGRT*A`_Mfp-Ehss%VKpn?QQfZOx}rfbKo>H*MEZ`z91 z^(X;gbNKZ^(v8|J^|Er|?mw-&M$c%sEPbmV0WcPnV-JhLEoYJ9nl>oEz$a1*b9 z-o;px=S_7bz;9~C@w$|PGn7qjx?RFz5lFcGHc!*+c$Rptv_g8nN8R+OysCUO@v*Fx z-NT@5#+{F9?SZbFgKxq0FwpZaJ;;Y!-GpsT^O(!=hZ~ke(~%6ze&K z)C{TUNr39tSSRm0fy?z53&nTYD-YeM0R;@hXW}7; zRJnpb!HGfdf%18{=Ty2xxFmMlpkH&GW$iBzBpU-!2Hh#-w@4O%1x`fP76YUo;M;B3 za?kz4ujO?6FmERVx!5ewTd0ttuW54}*GIlRK7|kD8n*o=9FK2Ba!>ld%LF={0B!nG za5_tY+NWrMaP0#E?TTjO#VG&@r!#oWe{*T)298S#R93ZLv8`47cJMMwSfb_w#yErd zH22DV8xI)ATRqGy6^jEHz0NldLF{;EsI0zb39}1%wozah{HEf(=58`{rmtiVE*gOI zL*Z%*_Bp@xc)QM$`sUbsA)B^J*;bm^A?59TSp$XpA+^fAv0OYh$|<2I;}8y>`Q7V5 z&x_6B&Yj^@Q9GW~*+za;Djpu#*mZbG8VpF=Q5HCDO*#y2eX|UEH|KG&Z3eR}3)W4$ z8dZ7zxMZnYwHo%Er;Y9{rh%}EioHZgTwnq9g(>oALfuw}*hr-ZB=l9T9iXw41nxI5 zL<232&H}(b^|=s+V`{6Y5q*$aA;WR$OkB|Qyo$^Uj?8#vu=+180D38j&L^6OQlBf8 zwZT|*(@MClnrJ1IT&y*QsCP;TCG#Spb1h=J0WQO(fYJ0wp*GLC8d+%+gKpxAm2Ce6 zP`)@@De+hXONX~nP16+;D&C@-f3EnAq{d;hQuF(U7w+I_9m)dVtAB0>-e`UT^KJCz zG?k1)$9+%q0_c*MuaD#$12Ar9LK%M+y;e1&Wen*mOBVmehX!U>rNfzmoH*sH7B(L6P(_yjwyf`_9vqAwhhWF>h5u(A|x$2BWk$NEkak={imKs@=CE5Z5e zqXFU2@n8Dy=(R0;lbEt{g{|p_9-; z&6uuOHqXgXs214?(*A`+_*UZuS&yRlycZx<0al=EUEpHjVcy8m#yOGiDf@k0hhWI* zV5f(RzQvTyinYMZSN5^EUucCPUqR9BWYja!<2+_{Z@JPYe46c2r*3_HBh|vB4xCUm z(h$>V4lvLL82qd)khR{@_Q2@sgX^RwUug9~JntE@1>vjp*G^Yx92562LW(Jbt!&h} ziD1E&Z6t_Y>a*ZzuX4i>t{0O52m$LJF5n!HGYlghfQM^>XGr0by<3|o%Ypy}gTbv8 za5OhEsdKVvoooX48AkNOJ2@uPP1i>ZL_Ch>_80G*JZ`R>nu2TJtVIhV*>~jmqTJL{wYXk&I9>J;XyM&2qK-B=%hlVLTxXzU3&Rcl}KCn`h0)@n-I(3gE zY@9ojcKv)?AiI2YvEDfV$U+kk1pz*d=xq#Q&H;hGBGQ5p44H>7DgYY!R+H$)YN~o_ zhv-)y!=&I{r_;;X(hshm^BrH6F)i4dZ*p*{6v_UqwTBV-o37Q;PrKMiI+dkhYDCOWqcc08WoIbM9$9hzli@>W?+=GG{>!0}18=Am3C&D#~E(#3NTS)!;CftQj7RolsT zqRcboTC;-IW$ah|*}*ibscPN!WZqOD)F_k5>QGdC2{`Mjb+%mC00qZ*7@!WAFoowO`^q+ zE#T6NpRm}bo&B0jWYkYh@R-bTymC;5A>qfbbS}jRcz%+)S6~dQ!-su=TU@?A-KxU2 zh)(4Dri`tfY2&D4eK*{$pKDly)oS}5S3mDXePDUwVtrwySz+T)N6^_2vhhPRVO{Pl znTuagKI6Wkz6xI%yQ93--naY-JWl&fTD*IU!;UQvIw#Pex`wLgwNq70zmO8Vn5Un_ zgKo6Es%VVs1eBBY84RKNc!0~h?V5c!L(ywg_%Sv?3?dKha|9k)vq%h06f}NW} z4C#YuGw48y@KwtCy;y#=_Uo>wP2yY4DFMeQ1b!eFRgD_pVczBZGBCB=4$0i$9#^wr zLE1kPF<}o8o;-Qt*vGXp4)lS{z!6%dYYpnt=`7P#1_g?Pq2#Wibyvr*>G7!HEuiiM zfYB#S#{lUnDz^uIR)F*U+MN`~UN<#|zMMCeh}z72c4Y<+8?~9>IN^&jqDn|KBJ&`HE2g9o$z^R- zQe4b$5cAAM(A8}vn&+tmk;|5X0+i6tzFKgo?f=8xTZToser@A|0$UJKDWxqsq`S5v zN+aFUH8jH@F_en5N{OU&Hv`NNA_xl7Im{4(G(&g(FZONNOS;5eH8{R448H=A8e7wu=F$a4( zaeVwvgvN;(aUm*9ytHgljj+SOsge9RC)c$+9bQat=%+(Tzz)(jIpV2mzeuMnma7dQ zjF0|wr1;T5w6Yo>|3g~R%RQ`N57as9Y`oDjwAmEQh~8T#hxn7I*!Y`KRvC036R*`P zqBLQ5=qKLDZ$*u9t-yh1XQ5>W6}cOo!lt5Uv@4QV}PvB=BxqlXSqzlHKFZX;;& zHrktKLQds;=~)dJeM&A;ngLi|VTI2w2SJ;P$VpAEi~H>rCbcg7Gr_Ob?qV`1I}(Sj ztvJg~?u{FaHwn zV;?d5K~G-5jcpq8OLj@`XpDPK2#Wf7T!A#3g1~F?3(l2FORRr;FPWkKfg+4PYXOX> zXVs8AQWH>zmne>(rl+sZY{B!32iiwOfo|22HxSV)bU4_-Emc?m2PQlC#H}7*wn>_+ z-+P}W)rPZs)=T&40w87|zS+T#|KMktQmpjCS4Brw%?JEfR~|hNDv7(P9(CM9ut;jRrVg`=Itg=oFDpsn|K& z6{Tw=oTECGDI?DqM?2tyi`YwhvO&}DZQGl=Zu=umi7p}}LpI#Hvz`8wS?IicQ_>Wn z>*dvnZeKLWg`#*sc|j@A0r)+pdfZ|~)co7x4$FXYABrg2R`tKDt37}jIo4ENV@^Ac z-3MaatNT2jG@hae)=ZKV^fIlc=$71X=DPy^d9fX#&gA^31x?Z z8%Fx_wF>5&CmY~JBvO}*JkXZC+sF((zAgQ0g;53xKn&}fKv3KXn`eIda4i5GW6)_G zO+;mBfYF%rJnZBBGdDdT<|-&08nilFxT{xh&GEFi)z|t4ko`L~y*tlLnWP3n5yu;o zWpGyRrSw8d0yS>r{H=*?v0M}Bt=u2GqO#H(^OAl?d+Ts!Wr92k_ZyO4l@qE)RY19J z@ukon@}n2h1Gnf`SPK|HIM4xG=cPGvV{E>2u(kT-Z_EW7d32I~e6>{9F9cuhn@;wA zxxB=C)u4=B*rq>C{R{k*%j}{F6f(nDyF`mzz7an$)0XWLeK$V8M%SpaWju=89cFcW ztxO2>eEHAe`lZpOf}NTSExuP7EJ1++G}Q7z*EwEiq(#QD`D^s$wVJ0|e6BB%2?)d^ z7J$@#rh>yPBMTL;Pgd7#Gh>Xe`atQufHMfR1WhV6R7Kg43F*6Dg@y4h6XDfush;gn z9CEyI?V<3&TvuOK#}pNte?Qi;E7xXpvsm22#VEgF)2N&{vCnX{sWp>)( zThW=gFQy`WtZ8CBE+50G#qnS@9iChL_R@pnp_FJvSY|z(W z3{551z32?yJ2ccT)NL2|muG3l-4(I%N5g{|rcU!Xh5;Dw(im4+u3dx(FA6>UBL?M< z)RY8ui=6l;d`zc^Vg?+Z*9u%v{3AkG#ToD5a?%>DRcYoj_6cI6K(T06HDZ0!kk z%iDp(8r3yfr4DH7e{8^u^KIl%qrSteakuUJUq1vhES?u@V*1>k9^un_9tK&ad5-BwC(%R z^z66NI)!`OCXp(zNqifVf3PpB;agzn;v1)&5JM}9&h!5A(m2)@SZf6(Z59|Z>4(ey z^}qt+Z+-}W>kv$TopD*+I+&CCzG%M5$k3_fP`y2?>QJ~-X85VwLK-KnyWC6M5Eq1q zA<2BTk(PX)Z5qMu4PCdr9(!!lvA5^*Fp>moBN5NE`LJ3xPNkqDwe}%6BdV$}O-QVk*Gb@`o3j#b)M0h}QTBd7eD$~&2W|x! zSGhfXonU&-Cc7v~dVhd)cJyQPjm*kJt`oz@wNI{p3on z4PMrtOXt69=@`xATpTPhE|b%Ex2SW^_tAj=D}$PI<=Mi6!E&UxJV8+4AT0-}muDXf zRuciHboh;d%E_;xfk~hM?E4A%^VEy+636}ip){=OOYPfO|EC*#K0v7|Ua?WbuN?#&?3N&Z52KRbz0Nv9gPA%eM3e6aYVsu{Mx$xGH z{ob`!M(2K9kyk+K!gS&JWyh>y{NnSeX(IGZOjK+i#`hNDCARnd_sc2 zt=pC55nJ_l<{!WIgg32IZX@!2;UnKVX9vvNN{ieRgck9$Rt*k>pP992pV}fix=afe z2qjMTf?n0H!x2@Zw=Aqv-r1)5-8eOJezUY9;PW63MKw!wGlgH+tYAn}NoFSHu)@~> zxD2+PW9wRjPb~Reh>?@BGV(V>+lSOkb8dwqE%FR{f#0}llC(4Kt(uywVeByM(fl@b zKehj8S+59z?SmyQqB9anQPbSR@Gk_>LNz?5Z4dqAR3#!My?4v0O}x+%K8>S{tG%aE zd}0qH5e^kbw7Z{Pn~NjQsR&XFuq%l6lHM!ak*|d}5iyiDb`Xo9jlK3Mh3OBy4lx9O zB0a`>qfE&MwA5(njdq1du~hDE8r6Ie$7Rp@nR_R7g9u5NFU2opZ0a5^>sMoyU8Yut1h8*?Vg%j;x05o>Onqa!(psd>=V0cxVnZ8D<$;nz;*G(?&366 zGxby$X>QWH{fvNXf?vu4MHD)-|2DqW1_`zrXzO_Fmah}AZDn*!HU(uQ2iAQods_C&+h)0DzlC7fq$aqIhl0m_4Uu;|l(x#=X?8hil%!#hm#u(lPmsyQz8=lG z#MZbSg4qw~eu%#sw&JT-O5;8Y1 zuqyJ*Gsi-tagE>F+`iX>F=YBlYq4rw$+E65GwFC+$HB39WB0|7 zHuaHd;JVCR@zu7a;Pj7T`dnxCaFM0DCV*~0I1iXRN2kA-P<>w-;tPebI2#*6(b=lJ+ zT7=9QS;VtPw#8t?_=yTK3qv#))EZZkpUo!hcfHP*THGgac3&obz|3*M`E6e5rN2;u zfVU*`ZE=%C@ke%SD(B>(^S)9$ZoYbresjB`HyfwBou0{VvzoK$ont}o&*(^ZTz$j> zV6g>vL5|+qBR=cMjwg8w4H7BFj`CVp9bzy|8oc;3oTcsyPoyJbtXxE9Vl<}o`-w!d ztf(zRdu!;Q{emqdYWg#EG0&(@wCSMKlq$UB`=jm^PlH^%qE}rmieO0S+Ou$0^#cTlX*e+ z4E9OT2JN)Z|1MnKr`lJk3E0kK9!dEZTTA_e6Qt@ zaeu?C&s_VhyUMwf#p0etr~2`>!rx0ZgMgpfEL7trz#G&w@hm4<{VRr3>O+wvn4cO( z%?h8VKGxy3yc}db{ngBm7`>`klFYj^&Jzt!GG(i*HmYRruba1{eI|wfAtd$2DBjn zu`dQU$B~C*qB!P)e}m|3Inzd7n$c0}u_FXwR@+O1RUn9d?MvR5f`3ECt?-E_SrH$u z%gg;WemEq!tk&P&-D%4o1VF6Dn>mHw(R6>AJc5{jjB{PH%87Bv;wjD2$AKcBMP>dC z6ufe;U~NS+?e>4h$4|XWVFEDg_0Ey={{Sh$zq!s}X`xh63Hs^u|7ru7bpWeVOoU7R zMh7?-Kn$>Rjqg7MUj5c4fBf&wew~j0Pd6igkO3Zs+S9-2O_3Ful$7+menTq!!7c3= zTxg&1_^96Bp4!i&WPz#lYmmrU^mBW@xA|cto!-q9o`$`2dgqULLja`009`*EC@{jU zjUvtjNg^#?yDJW7dhlnJ3dX@f38)R4Ehov0Ud+ApOvpUNb1Fmv!)b&Z=#tzuJj>>X zu3*tB66+5VMcu5h9&!#mjw}p6P3*sCh|K6kNFP(zkFU`pp)H0tpFjH_n_sOb0+z-|V872-N{qc6d^FCa9 z2NJWB0fvom9229J@GKRCjP#tT&3Oa6FdcKWJ#6AJpe~Poev$m>L@Z^0a}IMRHgN_t zyQ9)8smI=l|27FJ%UP<6Jf7zV|2xThnv;_CTD^c46w@0hQc#K&k$;JrjUN+)TS%$#)?v9)w z5N)d^+)8b9ZsDTmH4a};I^-Z@P2C2yboM)A+4?K2RRIS(ehi!sM+1v(2_?^l%C+iz z4^J3P;Ij;kV2~V5ogOJO_nqwovL|+<#xpso@ba_b5I|%H0$`gY>EiUtIoPc9?{7DR zpU6or-$X{BGQhO}3K>^Tx)kmJlyN4A21p9#<3NN`%FQw-*<%CE-{b+7&$V?>Kmx;! zS~dg1bAe=w7nXtyEZbRG-CJ*1@5zB$9=s898JE)1K}<3_P)b#DJLb$3ldXz-^Trh5 ztQBXVr={IA$PnK#$_+dhshvAkWj{O$(69Mwj0eU62i%8E*}IJ&kL7QOv&$OE*>0Ob(!PXJSwW%j^hH|Y=Z5=F?un;s(M~eHzb%60b&u=}zrO*^Jk{%w{ z!PAI6)0zO#0M1Nj|FH4oprG+gNCpB}2Rmqf5Q?u@oz;wyeNp9x8?ABxwHzuy^I?ax zPJMRJ)aJpsXnS!FLDU=424F z6L?Vj8*e0Fi)zF|Hc5Egv)OJS_bMseCj3Uk-3uxPns&a9k_@?o{k$stH8vKw z&i1!O?JW>G*0-|CW*qSZvfx8$vgdh{A^zr;ix=b)*u5m6i<%Sk?7GEGp(O0>p6acg zpzyB)7<9<)z+O%bpluPKhthTl3*>#TtPpft`e?0LN+we*@M#30eI%FtP~kdRqOcPK zYGgu3sQWXu3FP=-dsFs<1Z@q$epNig;6JX$|2&?|!9@$lPz?}njd9xPmOibFRuN-c zxgyY0hLrnEMXEq&uvG&DWvGZ>m{C)EO3!y?@G59O7OfED0PtD5$Y=6L=y`p5<9Y% zP>4YqUYCl_2RSvCBl9AZkG#ORQZ~o5P({RNKqs>O}m%Xdsl-Bbz8f2A&1eC zw|5nfWIlbqLBfKrWz(&2olyY9AQ!A1DFYS-bDB`L1A_Tc20DF2pif6DZTrd`74%sS zfAb||2FY{Rl#=?ca9n>vC1;d+?Yu}n44i-F?@C*G>Q!cl#fUzT{hjcrz)|{`P>35R z8$W#VKJX}zgnNzOBvyxZ;P%~@>%#x#`@c?Otv|QGl_i`>_}kB9(y(XDWN}{7-*)s@HwHf86Tq z-*zKl8`qNe|Icjy@4wW%fNlJL_-0HMSc6A>AE)jrE=Oqpboju8yU(8yd8CFc0OnJjcfmM;g~9aGg?YX zC8ZZcF6}fC2mkCh0MGniL7V-5mJj@Y{Kc4Xfg-!UaSjLa|1$Uc9y9SLt7K1fx;dPf zaGi=~LB#!5!}%oZrB9Fg%PT61jO)ED^;i3{6n&EcCzPk(EAQ{<*Uyu>PoBwv&*flD zqPyYHRC%ji;>0#{;D)GE<7V-gz>is*WEg29=HmJlD+<#kS=ERdQk~j>WsDPR^~ss6ZPF zU{Gx|APYEv1>L11h$t+cv+NB27Znw4y5)!R*(U~?;d)p;dXw^LwbynBTMM8(UT6*O z*D&5+PaCVsBn8ddpf?GS7ubt{9GW`5)GEN?Gu^Ztdv{z5sU6JK5O!?rv-)u%78LDT zLU@enqt*g9l>^=c1QBA^+vx3i>h|6addOzVGr+%qFq-wE$96NBMj^03q-6Rk(=-=sWW5moR3Ri&_!lcxDqk(YU6xsczWbsub z#;QBTL77GvA?TQt60IuM>xFXAG>huxaXtm8Yq&43SLK+OqT_JsqdR7|8Q?9gk;i>P z7zqDxD?7#s2xowjD`je|6w9q#zb$Z@w*q2Fr;>Io;*<|Qb2dZeiEGb=@^GKyU7IHy z%7Tt`J-a1!KdTU5G-P{vJDt(z7bivm z_Nj!G>^8St_1W2<6I$Lm)dOa|uTk|F9MzdBJ#i+!Nh`YH+kdVjN{a6ju$@f-E4gaU z#IqN;hSUYxMfxcRZ@E0bzletn73z7+(N`O2z`{Y@G?@7@c4~3r)6T@H$yX248^65^ z#4I3YStX0Dh4SM?g%Qgd0UJZmlIgX_)~lmK{RA!yVqB|vv6jR6X}F9?iCZ)ud&|!o zUiqr`=D{VJPybPl8K5pDguAI~p$lr(T#sA~Ua-hIrz_6V(%^q_Rx zuMMX4UToFLpwX*nu+RX}AHaezXoUM56BmawN;gHlsc>%k)8I#IOYh_tfEr7=3};56 z+!r8#Y)~4;Q~OQKWB#cTY|-v;3ymRitZW8sS@USaoo@e49svi`5;sa0csHR~QU&wv zdC!z*JE8@86%V(r4>%|qwfr29{d;n%i4r{Fd*yaAPCQ~^;7FYpQMw2?nYLCMhUeyn zsCD$e96Ke`u4ZZ1V`VxPeE*C?t+x6S*UjPceWt%P`xPiGf+Xj5>mSQ?n<@>80~Os8 zI#2n_I0PNLX5x+P8jtwe&b;MRWMKkum--!%3xug-{lJ$woG21T$#mUGTy7nEb`-*b z!@8l4fS3TaZ(zgR}Q0}KGdNVU1-;SHE+&r4xt1Y1wxlhEj6aO zZcD$tbCHKpGZqfcH$)3?b?|NCOOrO=61p3&Os3I}qiZ+PsgeHEuP@zFp564gh_9 zPz<(0fzb@u-G!QuA59U;HrRgYl=?%n-V3UM=yXJ_EbfYL$3)}C4;e~Njom}YJ`NP< z409i>zJQClIh0OE8ZDQ?gGUcDq)OEpedeu;#Bx^yK*Gg{4NAYU$?^z$`tdyX^~yf7 z%))7jop%`-7-yoNH`2fMLiYH-yo7e0yiz{jSrD~qkW@$_NDi_wAz|1A41m464tia3v_7wg*<{qO2yos;a z5t83J=Sr^HS){#P+5G?D&6p}IP-Xv;99gD9ue7)%6^ zpYQChm;d<)nl}S%ccpC7N95R+Mqn4NBg%`#=weftRj&57*07pF4YW2Z#^Cl&0!n(-sa7JN!wLpVP@#(hy+ z?n(};PLjiKO`P`RVz|`I@-6!A@6xk4N3BeHj_(iI7+Y>gIwf}+Bx|vcYD4*pU#zQaoB<>MAlRDdm|f;UG^fBN@V^8PUc)Hq!h(9{op5l}t?`M`7+kOn`;LI1rtuMHLayXg8s)w<3g5`(*AwUbm*mD!j@Nx-d7<9rGiApE3!;cM zSOtU8{h>5tR#ozTtJ#qwIjb?)CB5c@n+B-yGh(<4W)S_Y&^Hmg?ZOed_jD)e)v*9a z+Ykzgsr4GICN;2ncoi0jhHTZ)VM?1Ism5%ymNyDzH{db;E*B6B}90rkQ6)s5+~P~MN~j7$8V5b{-3Hk!=n=5t+z8ae{iAJP zX~DKQPB(z!>m$873OM(;%%rFtwX`dBOFuLY5hC%iX3?bikAHj$-9m;ah4Ns@}&gx!(CFeU-!34XC*_MV-u@* zlSIo3Lj&17b$(127y4?x9#V)uuhGmrPN)(XPGu4{7S?`01VRPWPH)Y@_{__p*-J_)1@lK z5pF4#{)1)O@(Jqq%ExR{_O~0SlkV~EhMoBH^A+yT-b@{I*=Xd4Y|dJdx5;yEsM5*Y zU|>lpYwD`!4EmgUP^Ky7b4VxC%s8D8muz-(j|Jg8TM?kLVl#{MD=A6tnGMmnwGz) z6;-Uw9*?|~?0_KF>uabPYgeQ{6TTw@sE1dDzbI zrkq^c-r#e(;aHBga;%`L_Lkwh`4nn$;%D4!0S(vb1uV zEe2+VC-ucd8BJO}U-GINjaa=FLuD{KQZ$S@*C%b%wBjewW_3(a1~Vo#Xl=bfg+f~< z<{I?5Ma{O74UR2W>9|6AWGaA;A{1G8hZ3rcoXNfvKUmJ&B{D{U?^q{@iR0-Udw4qb z!R;V*P)-g7gYIicXDi?M7x zi9U|jI9lGmfcixYgqgAs(At z=-$n7vjRF=p*syrsrc@&vE;L5P({^Al5- zQ{#+Or@lbg>D%Oq=#o__Q_MHZts^H-1Y5IQQz~Y)W1}hdqkg%U%@ zY)&Rh%ZV1k^h%`!cIn!0iIGNsW;4ABCA@bz(6LrAbZ3H;yJl-jQPg8c)D*Rl%B24^ z>nS=d;Kt5meS*gZo9SVb<;f*jKzYkXIi_)Y$f|nm?f1_2HFF))U8-olvb%Z)?I+Ks ztLT>I30H<{RNL=7*=<-ikzejqUw1g32@FxKDGMMpeq%apoNStml_HsaxLjr}?3gpR zmb|iWICi%^*$+MvC0G^Q;pzoAbLJtE+$%pjy)uIoHlQflixkg8JZmbXGP{FXds28i zG@p3L{U9e%6Y_d?w*LJCGEMXEEyZEQtTV|Sgo|PGtvngBP}yv`H4$`CtMR_algRpQ z?MN**lST2>Nvkr~G1o|OK_|vE{w`Lt72hTV5sKF)QbJ_+ z9m?Yps`w$T&v3c4w!DvU8BEHZU%coWslqZy1X?chr3J;}kz<_hM&&UMndZdp{uQ4P zZgW_ihYdAiT6O#>KUPWUGaE6h#DQ+4puO$R>bt@i0uopIya^^JheY8{BOyQ2$kYIK z7ZT`Q8nJIi959=?T1V$BE-$#zfeCf)!JMJiL`BK0{+PFpl{<6JP!Zp9_2;Y74N>?m zi|kY}+C@e$yY_3xTE$Q=ij0_+0>dhnlgV5m)ho3xM}_nZd_B5LxeR+;P(!95eC5r) z$h|Z8jx#Y^HkGW)DEpM1V-cSk(zmUp?!Q!7Q4Tq9KkYf43+gr;7KU;0)QdFlUN$jsT7;=qlzv|2Mg5dc7mhVVu6u| zV)VnC(%S9gj^Rly*A8b4f@a6RTOsYH@QJ)pDa6=nQ_8dv%HBZOI0< z?8I`F7tx~R@B(-mJo*bzml8y|6aO4bGqZM5z?PJ@;l>1p%d)~cp6q`atoID5Wr{?* zQ~RqQqdYLzHG6i>W1lvC4K23|d@@YRj2%_3FHXo57*bG2M%xyq*uS*U6ND){*0A%x z=gknaKjEL>(ua-F43g=8t?xWxG0oKO+}rHcCwO06FWO<9YPf=QtWtUVmE6Rjm%$d2 zHNxj>_{#2xQWYztFY7x!)Eol#rj)rZ_G`)*3rrC3R~HW%WRCGCU< z$*?~Td0}vmu`H_Exz85y^jYO%kE7(2ix?;(rZc$%6yX!slM)t22izd>$zT@Zypc+* zfg%BP)jxO7l|Pp6O=2e5Z&8+*QD9Lx540T zF#>CQT)5K}TyA)U#l?1II{9QFy&{2xuhLC6oPI3+dm4uplv<)@uMnsbmcw37L_0tY z{mu6r5_%Upqa+3_3$U*(OHhz-Nf^o9PQu4<0Xc(wyjQ{F36|tz0@#D{F$=efA|qz` zoosI_r$eIRn8Nccq_&o3kaH7*K*z@ zeQv0I_x6W;xl{LDug_371x`{dRKJQ@tqI=)nFzh1PnME~F0x-S6l01`R)^;zvxlU5p^14K;?!G(VOU)W4q^BW zvWDdny+jPXf&ts>vLVva!lz0uVfb?G#!p~(EQexr^p^4YgRlatG?n{Ed%m}Xv--#U zj$NF>SDdT6XrmqkR4w#lnOciG^sFvbAbrN14dNK1XP<+d?LFDA6~RJ7nn>?*{b}Tf zMAr-+detPaA{>8@cIa0y+qU~QoxQHiX+C)UkfSk>-Hdpfr3DWA%Cu>ZI zqqXi40SuC7lYQ|Z^U~|y)R{3MkH&QD@E$)q5so^N&^fN?)gJesWrt2xS}V7qwZ!c? z<`v38({Y)V6H>c|R|o;+r!^?V&WuKf6e&gN4}@2;1vGCzPA3`-V-Ev00o zm+1&7YB*G@nh8@j%6{`JAETZ{J^ay`K0nGF86kQ4EJ#Eh#P)v|O&{xsX--OVfr= zAMkVA3KfjVMwqMQe1TE2s-2UsfK)jr2$`sUTR%195ZR5v;w2~6+75J!ibI-%=SKV$ zg>+Nvn-N$7f2orm((B9k);aXmylQUUxAlZpI$jOB%BBu>Efxn)JCGggJak|CK7vqi zJ9QR*v~_)W)>+toSSg-sV2I$M)#wePJeC01=8Qh(x3% z@_awPY1+sUtANB;qT8Er(_&+;sd6r?#r;F8k#4tJJH4#J{x}#~%G0ec#8fz~9IZ6$ z%fb3y*6!r-3dwPz=uQ!>bdJN}Ya?OS=Hgnmj`FE!+dw1YI;|eNSBY^4Qq&SO{9;r1 z54d|Kky`Y9Jj-2GYftY7#G+!`t=_K^&T6SMv7kjBTGKJQG^JzDeZlj#9$|F6H>YZN zZaRzF?Wk;dT-<_%G1`=-o0XN{dS+bXWhB01NY-KG8$PnBT-rXaVapLoGHXn*(_|`Un!wLBu3Zb3pav1PN zOL5FKp2rTX2**y|5>IL+z3*{6sU%Hb7x+LLk#g9a(~WT2L?!Oj>h-G` z_T1`Kk-Z6p=5Ke0tAs2mZs=-g*)P*n6*a{QL-mkYD4Xl_wa<}36?su?HYO*FD#HV$ znua6m3t~n6Zmd?}S!pSs90!Xav9u&PSshz!1@_n6wK%$YUlWV-4E=1tp2H`&sFcDt zsH{1Vou=IGZZv8&6_fWwDs~&Udg})8;XxeIl34OycziLjTn_KgQ#+RepY2dNS8J?X zdTVM(bR*&&oIiHT)%D8HoAqCz&ez5GY~tcttJ+nNU9K^kGD}U(_{GfM0=9t0pq{qe zugAW|NrW5idDvZGyQ$sQy{Cb_uSR$oFKH^jO!Ajd(%Ho|Gi4NrTrSA1W!*~UuKZn{ zE>VHW5~bn5esAj;CJ+&XN z)5C5kA3y#6>4i%$pr@WMFhY4?`Tj|2&5QzX|HQb%I>on347zLsuv%3%dxfa6#yzue z5by7$5oCYnZ}~m_1(2*D8!ZK_snCtj^SlU_RU&LfTtUgl>{F*$Tf+Tr$x@_PZq8M3QiJucQQM)i-*&qSOX%X@NopoPp} z+-?e%`uJqwGN&?GE?@-!(G?cVSMI%mg5eeJAlq6=fvKxu4{q6dwI=;aXHkQmsVYv} zmlR8-`klPs0%~}OaXXHs-i*Y-5|fGQx5>#4An#&y_S^no3~!mnaPbh}(!8v?4zu6%5PHd-kP^w=N~=zxD92P!7UXdudgb~e z8n83%xZVp#A%-h$$*G<7tfWswIwQqbt~W+7r~+ZC&Sc?ksI{G=@6I>|+KV2kx9Lrn z6SDdikMQ|S47gWi28}t5TGY8`iF2^WUI(Ws&^bf~{j(q68;a&#ez;*5Temue$(I3B zuZjzS{WJ=xHk!)20c6@!(<#q|gW%pT78*^J;SqEo2o*!O(|N8Z786aqmXLrA|)zi~MG+)LQc~?795hol2hVf2cN6DxVH@Q_97orp-0}DG$ zRLH~Z`ZV(GVa5*Py7oYFwY5@Z^lKQDjm* zP6W2hAN_mIF#MS^;)k?S@$apeq7xm52uXM;!ld-S8%? zjUKh<0azN!2AgxK9zU)IAI`n*(sFQLE)AOKc53-212>dYhFRrJ9`S^l?0Zuf))J`Z zY?&0s^O!gSGQmK^#9JIp+xfmpwm53#Ar0!sS#4DlM3rmY;Z*(8roftq%*rQC+DN3P z=9vzNmGsfQ!O<$Gxdt`sQHSaYQ<{>ydc8Z~O5YmXa1IlQB1?xa<$$4!sd^(G89M5X z+ZJ913}TP5R54vZDu(QDPzoKbc>5-v<<(=xf#}YerjnCcgLs2!^U6j534tvIMa^N# z;qgIucqwi&QqeM)epK!}`wM!2-JUv-N$iz&I^(_BaXbYj)JHqG|9GPNW{}pY!4goR zs|E|T`Wbw;Tn%&XC6Y%O&x8d!X zc#{x>B>d>YS#lHZDohEKuGXimL$lEJa0@;F%AsHy(K^&H5oB# zUM&Lz>VvTykqRelnZ&_7xzxKHCX4cE4XY@GhH&*60-V(mx1ZMU3jikKKDNEgbJIE| z5u4kKbQA-<&$?U#7%7byC5LLC`~z_b$^PT;hbeWcd~C4 zG1c}0>{UlAx>-6!z_z?GLQ;wVlj3(G$4Eybu;yBzp7GL_?nAtx%u*1UR5{%7l*?$g z7eY-ju<4%dJEzergANT?^ zCGd9d*5#}UU334S{$g<>gXhS5xgl{iuwqcVC=?snfaU1_Gw6WOvWSEmFwyJOwTB+IK0FzN7-m`LzqE*eO0^m?*(&e&PDQV>xj z{;-oOJ1qp?b^_2ulE=KDDE7kn1KYTqk#v7`HTcO4wV%$4Q~h>iV@V-70q1OYDkEvn zv9$Lb9)nhu@494k!ecTnO}qtVO$vf#0`HRUos?s=_v*3JeYwx$+vv~6r8i#%>Z)DH zy8URCOEO`@Wa+uM(w~3gKlu7()F(Qjb{Ff`bv#Dfuv)xauL4qDlKqk(r^AtK+5 zA72_LOA%?o0U}k0rF_IGPMBpXylwlbrjWh|tx41nzFB-8v)Brv2jQ zA(n;}>Wcz)12%t{E581!HO?aXOt#-DZd5C>WuKS!m7dm*$9Ta_-bs2I{8nA=6MEW0 zw3kH22l6zMC;Kl?jZ^r{meo;vI@C>%$sXLqzs2BXIAs+iHCr-1weu=uYkLBA# z2G2}5>NIpm@W+{#E=|0z?_nyuq{qlfps1*8mUzNyJbRh3RnMat@>b}I`uyQ1$Q!7f z@+P;8o@%1Pl!8MGl~>apLjF|Nhowrd%*a27@k*cKtLIZoz*|RM+UTQ4>PEZ0ZzX1z z+qiaC3AbS8N~ol@)9$cWA~|2(P_LgnAI++AA;=zHg&z>Jw;sY67!YbHN0EYr;uhaM zp*!^b^nk@nO*fyLkB=YH=(`)T>Nr%GM;@;`S_#seX%zSNYHb~hs{(8ur7~Ep-XUBy zu==728u!^<;{{v$qc`}h3)7PGxFx)j#O}tuzWrIH1U}M0ZDH(fTvFRL0>KpW7Yr}{ zc;)}==i|$(x|^A`rfo~P3Kw)~T7s<`bjMxijCOS=;J(;q&Wfw^!OheW{zQ@+tO~L4 zQZO@C+w-q67VAw-?SFTECG=%EO?IQKjgFG>jU@*KcRn#9wSF|{Ge$Kk<&Vhk=Y3~B zRu=gldLT3!8}6Bp-)shch`{ z`de$uWpRiTIq(C&f7eh`n|$z*bRo(u-TEp4-2rX#_5?qD0Z%a8a(c3=vZ0rXdF&Do zc}VJ9SK`w18%~Vzg4R}7DsriAYAgX$#&wqhQ@$M4d;eDCbQf&gp7F{o_;0`(rakpWB2M*yS|UFM@>O4lh(3R7&pL@1nb>tgLGym0cun;_RuZ{+D1 zOoq&}PurHbzQ$@YTFLA7gJ3w|}eM@?^;x$hsJcr%W6 zl+?{Wpoq)vd0L(S^ah1u)t>XI*z-%RAQg;mS2b_(dRKtrpVB8S{VI3T)hfV@6OE!l zOpx8U4|2c?jeI+|zbvkaPEgShv$V<*(N8LPHtbtvjzQ;ef?bIXGAw4#+-Po{uFmL; zpVWnpY%$px1*8MDsK~{lZ1kQ0y@-^?tW3+AFIbV4?n(Bf*oxGJdnJbo;^An!=YQn8=kjER$U0aAX z7l`|GV%1XZF%uiFHLk@nk?^J^JmdZIxNUmKz4B6>qunRhbe8pX3~=QCd>KE!0GC|;|MZ;Nv?y<4@ zqFTwfwSxb-HvP44CY}#yL?tN{XgFMk#dfLxdiTE{hH2sAqn5`9in-+f?E1eNZ-nlT zM=fZ&;`0Cf_0OI6e|4)tu3fdpIyKUoT&fQXS~-8rFn@}7ES+{rv~}u#!q{_q{=iS> zlp1pp-}e7zH@b5T&4l6+F4-97wTWfTsHEG7{7R?Bhj1W3^+|Yjn!IzuZ(hpIz$# zJck~Rmo!PS?N?yE3jc==`-^4wvU*vgvgh&H*^Yn;OU7qM;>dN>6UM^MzIxDdGj_@6 z`+xuVzYizCA0r^2!1+f&-?LJ}f*OoDlbcW`cg=LnHdoJ((F2HWU1t+Dc(k6m?ZB~O za!&Y?q49Qoi24zD++-FfxHu-f`4Ir!ruy>QH5>T%#kjA2@-BDY9Msg*47H1E@9*Qg zb~QB2N&+W3d=yJpLp}6A${kG=8LI5O9=Wv6{ z+-~pE7o6{w)?!rcSP{a~Pv`u?sarm#Ex&dS$I=n_&UW*A)TU|`n0u%OAh-|!XKri@ z18|wZs4TGY61JUlkWc6FbZHoJ9?FxB+Phd~cnmZtwdeOZ5KiayZk#Dpx8*~^h#vsl&H;c8dN*w-T}G1#)6R1 z0p?triJSml>(9Gx)c&i=D96}m5`TEa{dy9R5AC(3x`HQ28m79ACW4-J%2}?=q&q4BM{2G_3%#wOcsKP5)$K$x)fJioeBnnw;S(n^6~8fVz5(o>YeLv z-nj*x2azem>s1K2*AM82@6Ma;4L^@_vUli&^9gO9P1(&EcsQ?KZ2~-q#zX(hC#ml) zTJ2YaZw0jY;~Wh3^PaMYk8c7jiKb59>v>`$Y&XeCfcwS)jtq<%Ipr!O3?Md`@5ElB0rzg|hP4bV&DfhKb#Vny!fp94|h7H21FKs2-VTI^U{gF862g<4ADc>hG5jm_K%WMSlvSY|NLs-C(pg5c5q<4Yzu%zMg4^#| zeFvz*HhRB*tiQ>4av@?2fc5eWT#luWIfs9Ql2_Kb>pA>vR5>EM|2>~Aw+$x>2rfzdVtg(CK#J}zq{p()NOz@qG*ZN+|HEhw5Qs`rK0M3#X zAbnER+ENAM;@0gq?pnxF`zAKnPg(9GR)=grfw?h!Vl&+aJ8Sz1FewLt^I$Y7z=x2j z#Bs+B)^<7h_Rt7m-30t8Ew4ex=deTZC6aY6r!*kh)ZTE{_wuO9U>kjB&=_UnancLu zcet!Fg#r;1nBE)5vN1Yh(W1WY^#&db3!PWzFbq0u`JwjrnTR;^t1AO7<0+g|5du8A z_gzAVF7(O-f!g2(+=BOQ2eoCpUrq&n1SLzQP7w$TO(2e6kQhvYo@0eb_!RUs>mHN>-9A_2Q9RoxTZCV>}-bKsw z3j4AOula&xgLR}FL)@>7XHGsc3hz7oW`7%MVb1b~o=5ym@d93UufBWyUe}VsNg0p` zKftCjRw*g1G`TEG3ohj1{HtzhRXM6o3SV_`n}rSz`T(j6C7<1;Q@B7;<;-~qu~DrG zqoC>eFaV9PV!_F?iXwgj8VIh*(@>CD-y|uI{0-#6)7Tcqx&4^vT$BRTz6Q)NeDbL% z2C|qJ4ldc&rWv1Ar|9Db;>=2jJ8VFH-iHmzzG14Rz-S&@XEv#@p5yYA`-*4LC7++b zQ8!}wx{YHNhLEQJ`fVk!8Av`pJslSV8bp12z?#+sbL^T)il6DPFBN5WEMrDVx|#9# z)3-_;>9dPl=~5AUeYBaE-e$lo78|% zXc=z}K}o*(sGP1Wm2)tq?{tD9uBY)@5TRz|N$ly0Q2n7XFfMq~+3Hd0!+U*mvX`&O z@!qf<6am?LXUF5b@xmP0?d_8K=8ggF#``p$1yEK7Kcu$(h|BF7m>gcQ6$&>LX<8h) zIs)y#>T-oMdm%SCu8t+8E(2ePN&?%hVU!g;TV@Q!H% zNq0y0V2W68w&X_hTPbK(2>f}rpX>GA5ZReG&;7{4z2a$6L-`4bSyO>Qo9J_Hy{nQv8Q9`|weoWn2IZIlQEe-v?h94vvA_|==rE@!^xKtQ#!$!$s_zCTJO`kx3n9b? z8^NTOJNgl#Wf*C9hVDP<-S^%2=gYJMey%=%5B<%Itn)@z$DV)<)7Ivsza3s2DgrJ(OH&NA4W$<_e=5r zIvq)3W<@NMv6+BZ}YY6cg8@quQxZAdEfY@?E2e-BYCF-iVf)W9Z^;tG;lv%XRJWBRj~zw zP$9a`OTT#~NLl%S|NzKAF8U?R=W2*!_Df<<*tn+3Sk(0o7XtczbK2~{a zF>|3manP?ZDcB!wog6l_+vjg6yte8|RGk-&+*qF*60c2%{kdei%|!Y<;VAV|C)68!$TL?QWoPpst93aIfDO-ih%X_{$Fp~ z{%{_F&;S4b!_z2JzpSBk1zk6U*=@xc>Argx5F#&MQO;sFP+&nMr_dzMF~dSsH#sS3 zo0w_A#N@|}6;?shH4%v+&&rzUknk4TEAUdRtNWIT37n96V7MKnqoPxD2fmBBW`El63IiWaNE*b}B(IGW@pT z>UjzyWUvS zhJQXN8{m|s3aFS5CMF9c>7e%~z12y*LKGkrLrPViR-NL4hV7AIh!EJRs;P~}m8a1l zlbbIF%O_ai$LgTby_eA?qPb$-P^z1(RehSs#f>V7gGBRI1fGW#%Q`-fu7fd%5gIsr z9AGKtS69{YSF+vB$Wu~yBwM<%7BJ47DVbyMZX+gllV!%<&^`~ zHq^<2Cv6KY1tikwkw5c^580G*S7chG+eD?qlcoUM6%>Zju+UDS!u9{zxA@mLzt|Sx zU5P-jJZ%Pz?aSc3bZE34Lpc&{cVg~~SJ9J9mT>d@B0Wu+*d*=YNt#|H6)KJTXBHZ` z{&G1MPQ0SjB#zYl&%$)6*kLPu>qC z5}}GVIo)YIHqjboL~R=7y|@l^Z(F{_T8IySbJ`w~4)N3s-OGMvzCw^pV1~4Hn&b0| z=)6Uv3<39*azjX`JamM^oi!*+7$|()D^i!gkVM>!#4D&9nGHk|9#Aj_*Vx6(S@Z-V z^SNxj1>(5MJ8n-PzukVNCI8{+`+_hapNEevFrYe@Wh9QUu-8KS6~#T@ceDZgc4az3 z^ykk}7hcmN4-kdMt0fxQTro$oIwE6+pH@?Nq9c)-Zzf9KGO@CS&^jkn=+`WroN7uY z2C!qdM&!mRvxM(us6QRl1|vJ8Zp7hSE0Hx8pia`vPw1iAb2j3bs_>*C;34vA`8!u{ z?LNBc05N85i8CNLMbx)dA%&wS<(m|3c(&DOTGB*s#&GZc>CU)EmYCUKw6i1>h%?l` z0W^~#n3}k$UT2D+x`F=3@6vn#S8(nC2vhnv8j3}33Ai?6s3p~Yq;gv=76XC_!2OGM z+(8{nHgmei%p$+pyz<;UJ$=-jfE(bWeLFQp(2n>MCeD{iS$nZ=E7D~iAYVej_r)4< zrzI*{!|wZs1uj5A0jOjsB1xVkvKOGJv0_02igM4Go1v&!~;EL7@%#FhcygSo2gyPMSqnHC*SnQ_4C^P_Rq`>@0P zs0S4W5W{Wy!f={)E8E8GsX2_r+q(et;E4SuXyy1gQ^RL?WW?ppITkNe-70d&(kp{5}!Zzv<9vyc(6fB($P4A6+4 zE^`tDHv0nnKX)_t{lyso`MPu|{Fp@4lwDwh87XOK$AW;$zkgh=Si7FP;=*m^4BCPld)G9DU2 zd|a8{)m^;vhcD3|Db3-RBPqT?N#(utMDGT;w%>0qe7Xbxk()YviD}~B%K;g0E z%mxYflQ<(H1AvI>h~#2`blnJCClYBgcGn$%q#Ji3yB-xte8DYH1ni41{r;#Tp#o$YaVh#}cV_-%;XF4j4&{1>`EyyWl5=pTv!8HZYAoa1MdV0z3l;sk9 zwQg(6y#+&BG?1V&T~4zX3=HIu;391km0V_E=*>H}BKR^Wk_m!VpeH(bVn#vs`}KE* zz|XAysoWZD5~P}>wJyMFy^;8x+v;u;VD?rX=Kxg6?+u3>l zBjqENKP>0szAu6On4*j(8J8$c&ZV)szN)dPf4?dMDMPO}zaR&|<#i zymiw6(d<_#S=-OcxXhZgFoZlw3Bw4Be3f`~ZNO8e0_39}s-Dt zbMdrNds*HG&UD{vEg<@0Nm!YwEqzH9rIG!D6Nq6o0M4`Z>ew|~)OShFEQ3FU-14+q z48s6Q0N4rIJzbL<`dqlVPPv@tHUH^piT6PQck{a)Lz*N|w&kP-^;Mxin{n0gqwx#nJ}6}^!f3h8zM@6*-m z!_bhP!+URi(z~2Q-;j3|1mBWSgI{ZYI1*pU$q~b>Q*X~9b<7Lz+rwl3LEd*#)c*r` zSZrvS6IRp+nHH*OsLY(KvXsaXID;s-JttLa8!I1EaXfqR{Y?@o%aR|KR_7k8Qcy4(BP3IqH1Uvf? zIBPdbJ4bI2`nnPPv)cM5VZ8A*4)!^Fn3|H?JQq5yK$)#*0$dwbk=yVlijA7 zZoX74L;5yvL9HG=Byczq-Nd38lbMn64WHt4;Bcu)wfZZR+yT_8w0InP%}dmM6d~g` z(eAV)gW9a#%K97WhmEidWP+8QH6ZA!0~^|sg*9%#6_0W{wy3! zSh|*th?o09->zf;*B?VuyI(7svnEnw#w#LyZt&Jv=AD%}8mG58VB@I%8vA<0ZK#|W z{F2`C*bXW{U^i)ut#cJ$peH0b(iU^ox*WppLyC^F>q(4hEk%BgSNbpfwFnW7Zp~eO2QDPoJJ@~ zid*NE#%CSKLTT=AEO^Xy*@%=dgCFuRHquL|+4z@ya-XswmV8!n&Un|WM}}?NUM*xV zlDX0euBgxY3jkTW`>_KEV~b2o`D}{opA%ML2b_rUYW>wd-|)as+F)BAm;z{0Red4 zP0jh%?KInsWfvAprqMKB$Y=xtcF+d4uM5dZpEJonPtoVdZvLVSgR(0sL6d!#GF?h- z9P%p~r^NK|TZJ#_!ft8yQ?6w(WczCmcAK@YOqJCmpVCf+p)GjhHpO29cItSrdE9nH}dLK9!Gvll3BxKJI{18j%?NsMwzVLJN zuZp#yL8<$_c6lt9SJQ6MltQx>6V*muLlYd$Y=JKad3Xw2oZLi3$hojPoWN`btze~z z(6a)we{S_Y2X(iJjM($pr0p9qZA9Pfd+aW@s41uw*WJBKi;!AIXW|Bdlq68zljsPX z83sJXmdjnDV))e`U!oQWO)411J!Vb8IZPkWMED-|PKbwXY;0uEM)PMQNpJ5YA#-&! zs0NvKC7%wFfk6mgJ`r^kCzr8F!pwHIx~7L=q1jJ^vpCwHIk@l}T4Vf~R^dIyNJ z)~>hFW&wi)H;k2=m$FRLLhtp63%IWt1TPh4!KZ3e59cr8I3Mjl*~F6i2~MBsZu~jB zEUE1tX`#-sBq5SCUSWzHF@!EjTdoTaqE?D39Ia64llcasZWeSUJ)u@nds`C%mqA3u ze!uAYz5frg*jl#CWA}z6I_hUc-{%Yt%NLKK!@k1vIeuk}R|JxNa*V*^7jOO-}aATC2ZR4<|!Nj@eyS3$xrplql zos%iN{lKQig-oX>5&;6y4lpwX2l%oAWY%-mG+m;RuZO*axM#t*%k$62nI3>b*jL^aH;i@z?^CwS2@xGKRs>~ zI5*hlTPfiWc6^i}35dfy?nVN&d|Huq4${5geX+D$6en@g^O@!SlB|C|v4DROe(Z4( ze9ibao>ZbtMA#=p{PpBHYbeT)Nx5*+=Yt?4h3QGI+T~|k5{cSyRreX+zy9Lie)mQ~ zeS1sW>kC1>grGVeG$uiM^Hh4xO6}89Mlm5Fai3mMzt4R*A)!e@DILp8sv{jvF8h<` z^o;3&G>KpAV`|CukVwTsLP9uHV@-8V=*)L{>Ululf}`Zi(dgnO|FPu$OX2^O_Lr~c z7q(t)Jd6@{We0@eP6<*%FvUd=HACWO%bz`%^1n9;1M!@Zn6*uWX3J_xYF&MXKQl=d zDl*CCj*R4ileNqt$vX?}S5dUvIWkY}`)~tKo}R83shMBlx<{7aO5{XHpvlQAH6;>| zkZgLB)%u%~@B_l6KAj?goPxacJ3`HB)jt$NpU`d#kX&vYjLaUE#~vJG>_3-Cs9J91 zhfem8r1Gnjb0a$=ODlkIbTnU&d|mU}94Ti(l$1vaPE}8ox-zlB4_(V)8eDT zwMnf>hc_g=%LOcmYBiX(7C#q2logSmpwX)p44-@pRZ{#q%gQ?Po*cCPh6VxIM*_5- z_*C!-3wu^l!n#~@WMm`@yO>yNW!LsA!2g8v0(W!L6OB5i?Z5ZQM>zD=u+#DRep%|O z^S!jk0>fjeX7TP@^K;;NlqgPyL}5O>_GBQgphJzO^pa*!8z~SQDODYfw}jSwvzwR! zIZ(+)28>KQUwsxyuW4ewT&~+l!KEBwVP#>q;Dja&`jJaB&B#B;#XYsW!!bBKGS;}X zWJwhAfR)S|2Y!k^Q1JE+jPBG~$F#7}t5GOk8dvm0`ymu8kZ^3@>^Nmjx#mtHdG+A!cfkH0eRDJO>K?J28>1oYpm9h#p{^u^6@3`FgN z(;aJJ4jss;0iNd^jepmc?@1q>H|T|yv~7h?f|Kl?B6G7+-t(8_zK4hlYJ3?SWofc@ z-JP^&hM67u?uVPj)=_$_jHWfLJR9s6JQ|d^B9Qw^#&2&os>|nArd423NN3A{wLPE@ ze`SovqGE_}x}{1&$gWr4k8%8$9piG~Sdd*hjb^?ilZFgge+C5_e+f9Y%cZE0^EoQ) zxRdr6$gj~Iilrp)ulDhpw>PtlBvvt}SI8Enyq7rbP?+g-+|y_J0F3Vi zH;i#QcOyR~Ud;9%lN6+2lamAn>H#EnW_oqO?Peq)bLoCndzF~|?4Hg+`+}@#Vq)U_ zwDnYV{q1!GjUlzL-(vkwKI_S?hHIKKdU>#y!mix_Zb zeKgbH*E*MQ0Jz?+cN%j_oWY!pX3#WV7-&^JmJ2O&OR{kWd57C#WE$f_OT)h7CjKzv z1{jd5IB|O`Tv>XPIdp7jNo^QU-gMmFVLVG1XQWkq2XNq{FX+thf)hqgb>`d*v{qL- z-R=}U=Q4KsSCPk3H{Qd&Lwt`7*LjU$?d=-wy~jg(>3kLTQLMTPoR8sAN-5Q|zB{85 zhkq-$ze&>wLQ0H{-&cjvjHF89T5w5PgE5}aGe5`2VYe^8!0xaIgx(rlFrreJQH)+J z1zbHBilX_+qW4ZaQaHSzCrBGCjC_~4p39CVwLy>=ebmDfh}sMY<9$-7^y+6VIyED; zX*>f#G(1!UipS3J>|$X4aVWGKu~A3GkCrM2Lmx#6hSiJ;*r@b`j34eQq#;D-fJRA9 zorjN{>#^cFCxSLUgh)=^9ryYd8UPHJT1Gs{k)`U9qS9QDTvSFhM>TNjxteWJD|%&h z3_J?7zMtlOwlL}Hfuhx%-u9c^>pd~LD<@u2mP9CO%g66ao4o)p!1#BMB4_jvwjXbY3 z_+NS~39b17%)dT^pLo<;*`SSghIRKBZ7VCCvOVn=#t{*zKN@+m z*V`>jQZ@U3YJve!bMv`Xr!VB$2z^gb_Z*8dZnH1%`>*o*a5DnezA-$&&KF(BLFxTC z!VF;R$DzCZf`^Vh%_Qb-_Svpjk-=DDfNQ9RAvv>rNZ=??#9Y<91WfYVdO#VnF>9K7 zE@NSiA#WGI+k2mm_TX9&E%0g?5gzg%_W{il)40vnI zwbJr`q{=;&006#ODu&mg!eOA$t}B=`wuj(#_~ z6eE-S3ZIS+uK!w79h(1wVJ#?v*M5qKQ~<8S2YMMu97oM;X0ps|evrR5fV%KZSm4ye z-!}-SFp6^!u+P-7Bw7`iiULVg J}uaj?&Hsjn^T6VO7prs{>WHtkv3o(v~Sb=oFpvOP z{p<>8Q=#qlL_YJVySCsz?VU+&asI3EEwP_KJMN6?aG~5j)T@ z8w^5w+UaFK7^|WW37=ha`qL148Q_r0nPTr8&OQj8#Ro0(i4H4f2@fc~K7Mo2ae|XY zF7kdGnq>z377HK#CWTMh&W9Zydd%S@P??s~%C@Br4?w*hfN5L=;LHc1cG-tfyBFgN z&c`kpg4XHDKZ(vUbY5=Ax7}acE(@om9{YQ&SgiW;F9P{%TFEgVSMLy=56xj;l!Pq_ z6fUbDfcA!7+`%%iAXqvS1C$iO?}dOR^$0iZNzJZ1nv~H3kfdA>;J`MUWl==Ti?ZBh zke~G13jAt2-1{y|#ny$=7X|}*xTsy32EZumxr1msdpfWE_TZ+EOx*nn`g6)fk80MY za>H#3L7T)!tL?$cqosDKV`vre`egcJmum*qavS-fg;GB$c~{rakTk{0Y8aKSpCf2z zvx6IP`_bYHjL_~^k^-$fC;XT1Khj~t?DyO%_74gCsU4cvU)wgp!46(Aw04~#Hxa2I zz~|}&^CROPydwO4(9y^&#_eS2^V8pbA^=sc-?{#8%FXBOPhzA>xvoWQ?!!G{^Y0ik z&4G?11yyrw!`C?Bk@KIc)Hvb$N7aWx#ewi1+R`_)2gcIQ%zfUtC__B2wHx%A>MGyj!6}v5>A}Ee+KHC_07+kFurmlJU3x092~AZTasZq`WL8DX-mh zlMqi$4wXO|)zA=5Y@GIo>$w`XuVHXnObnqFsr93EBN#A$Nit56EAi_c1C=ANjhuQd z-^6ELc_S5`*DUcQOkzDaRfAhavfo$-6JmUSv&x-u^ah(}cYm^_4mM5=eVtQ%O!)?d zozWfeto6Qjdo|vF)Hrtr7?+>#Z9Uw=MuY5i@>~!uv4_qVk+@B%Kx?8xNT$!Ku#C1| z6T=Nzbo8?4Es`@gPv>pQsAd~%iM0;;M72fvuq+gIvOQwCtLc-0o?@Rv>oLj_#5TIo zW5Ltv>!-dS6S*R_o{bHpWecq_yT?HYq{#BI1AA!{iLbc4!+NfcP6c-|;EP9TN1gkz z@4>y&6ei7F8gAo`3woslBM$58YHOv7I1lNeI2bYzmXfD7d_4n+>q zk;(oV9Fd9&6+a3rP>ty68m=pcH^P{~%GFqqNU!syS2Zm+&@hlFrfR!MV=q94vB!xX zeUD>F&SSGQoV05f=0Z6L97T){FaD91FMA4}lth#vS4Go&FHC>kS899Ygg#OVnwWxG z6Ix*AgKMRU7KC#;sv@c(2rDsYV_mo6781P&f*3YN5i2#uii9FzQbew1+~AFA?W#)_bKZF{5`#EnkuZM=pjk*m>@!8uYn5 zN9l+h4$;w%ShryCgtY?@&_k%`V*J~^C`m=O=w1=mpJIg%>mx%4tv6X12JG6^P8GIV zxlcM@WHBHUaGhUQjNWyM^pjc&9g`^pR4D>GWjm`xDbBLUdx5UlJHiFY{l|Hmq%ikY zs|~8%Pj-3zIpV!8wf*xc|GF(kx}+$w%c44XK^#bX_>{z!lq%(A6o(xTxweo=@xSRt z-C|+l``L86-vtl5E)0iLmiwKA9Gtt!lx zN*TRYG8vYG>G8~81Phd=nrGdCv{wxPT%MoTSoOhr`$BIv=({eD(=NC zh!LdQkT;|H=D25n1_LfKQys?gljg#>MhmaM4oNG!?uN~&~ zP`Og|n^-(-Eok|PrbTJY5Snx)d1cr4*I)a~#$$y9Xg^&*_C0P_Ul%=-NGC(QV3>^6 z=N_YvUJbf_);=3udH@NzyPWo`Nuh2+B>TPKE!|iwMYRYO!CnIzITj?)$WMpdb7PETr9ER_HH~VUy zb)A3nslE_=^!`uMF6I{?S6~kID?3(Wf{@tF`Dw~Rw%bZdBp}i#Pa)~WD{qcz#>UUO z-pN}VSHK$UoJ=~Um1QjMr%%esgb9YUH+o;BJIS?#2SGD1(S%jDwvKW;b8>Lyqn|gR z!gQ42Ve@@Hl*E_VKT%JM2M|HM3VpRq;ItQHFqeyTM=ZWH$}0K(pW!TsmPHePCDAh* zIw7aOQ8RLEyBG_bN2T^6A(d0Ph==U^%=;c(5od5nnSEeS8SRPwt1=Ca45?&{)fl@y zI@kJbnBFqU56{O};s7If){u}A@_1X;%Z4IxvpgG*(_sbpL__*q9a2j-4sC}v**+&F z%${afDyA}OA))9-jMX3sKjFg&e1_H&7DplOY+dmeCvVssy)_OuX(J0H2%5kT=| zm^jJ!Y|xx@H$I<0%XPAU{N+!;MN4kk50W@F0LQCLFQ&ZRQcd^!Km)x=*dAS2xb)Sb zJbRgE@;g+<{($y;nH+%z`MdQRXeKGSZJkjSSeTR!yu1omG)9BWF#T>Q8Mc%sOsbJ= z@#J206py<7Uex^E$=RirF@=43m(PG#xBo**UE@WXvQ~o;>~EUh=P%+{+0ZX`2XD)J zMpXSE?`2Uixg5E;q`*m;@4U$vdX@FjQEs(eC_)D&_~-~cXf}@6*Ghhp&b}aq#P4kM z%%VO)3sGab{{(Y9>N;L0>^&|a=_jS;mO^E>6nfLElGu|I9T|v|Pf77J)=V{+oJ8!o zKxbo57ns}3c+S9GXE)v;K|=C@m~29mSihyDy1JXR%7vZ*gZXi6&%phPu#%vxb@LMU zUCmE#5(>wtFg=u}W7_mG4NkS8D8QmV7uwehM(Kqruf39dw5T($=Y3Lz6_4ucHP~32 z`Q0zX^h_putoV*!4S~$+9XdkNcfQ7nSh{XQo#Bc+E`>wy;PWL$VojN4_%%ocg*hDD z_=XZb-?P!tv{|pqteJL8Vl#2FdiaPP>3;`by2;Yf?e_I;8Svk7j#P^eHt&BU&eWq?*yFMSZO*dyPZ#8=-*{S&Wa+!Q2Nm z_}Ym11$Oher=`Y9(Lbtjz~;s6j8F#QWuz704EcrihHPt4053$4vqwBKB%TvLw5$fA z60j!D`7+ppI@%?z{)2_Iwsi@QW0ExOg!0(&0OR?Z_8E0|qpC2{i3A7bzS=RdlRrkg z3k^2yXt#mez4^_D;JjEt?pbv-=>{w?_A&b|;Hnta4XaKp2KX&wYbh`5HITWbo8O$N zDT&z<0~ti=wqIVx?0=SL)3w@0M`nuT2U5)up$Wd z7|6vhW0m;I*`l<6kGjg&?XV$r*BVHCqq-dz-4UL{qAu1Mfg=yK0r+^ki5%JeG}|f< zR})PH`L>q|Xcp^Ht^5Ri*3{Q3!nvKa!c1zGEiKSE@~T?$r#Lcy)|e zBv6Ff-yEp5aV1fSw6?V@yN>_G|Dw+01KN9kB6iSzi`Pt1wy%S}ds^Wv>bg%SrQoEk z>ZVYOeze7WHt2+@?P^=E2GcVleOE)vutp`7og!s$OiApt96to`g`|@0^rB?o97>Gs z6s9{kV=|#p0(L1vu2!2F9m%i2Q{8T*(^rT=)IR2Bp-nb5Ve25m1~bN!B1rPEVNTzI z8X$G}-VYGtM%3*Abx9+?p?_Wb6TjK*)N9N zzW!`%lfggk38n6^u<6AjwdtNK#lg~du(fp?vp`ZBJg~CKHZ*cQNEefRyIc8VL~cD3 zrb$6@H33e&1&4qPIZ$Lu7KhWg7BtgPBPddh6h*SCs(;}0kxh%ZTDQhOk!2O)UY@Ko zE{+t{q`7%nBy9_^Zb5!k=L4SNn3`0slzxIL)ygQ9{#IumLnTZ4FnZR$iDmVe|9&e- zC|TBVzWQ90cUMTn5?clBbmaZ)1*pnb!PUZASy%VhYe)lQB}bo`frUbx=(PYiR;k8y zOcX-iI_M$#7q@po?G6@qCSN^4cq*Q7);<0G41zg4;z%E4r1l<`Vk`y)o1!QfAny!7 zi`{A}9a!!~T^2x*QCT^v2C&}?hEpQ-qP`jq5J3h*2Cj~^-l+W_Ut{Zi&wo-o8m8}( zIqHvwVO?cz+_H6UaW!FjxrHugxWc`g)0jT|ZJxVZ2AAXlb~xMMS`_ocssa>3z;%DkorlbW=QlGF6vs_6ow#Q6*N`|xT+uVx9Scm zUWS=E+;Lg{8_EhCgf@)@_6mgHBf<6?&}9Td0Lt_iCDti_XDWU&Dq!$g(z5* z2YSByd*0v%hv}D-)iVY9r|#@lVS-bqrKfr3+^()bo7`r3tvSY$RXK+;ag8v?wt`km z4TmbloJHj)VL{3SrQebZE2)|nlngKgGQ|8>`QCJ|*APhAxQZ;e`{osTfAGDQvx7`F zJ^~5H1nzj6yvPUg#^dQ5fRsoK9TVX~K0r}9EETOfJe+=Xr`obOD?PWhvi^$;x`1nG8YW1|FJj5j!cM%k zR~FDW#gLQCYxmf+aU=Op8>5oua3p2Xd5Q(M-*7`y^tr(ljfaNm>9+rJDckuWsVg>I z8MtOTQ{vBS8>PO^ifxsbL^$)aS#EXfNN+*P@bY-aL;GKU`%(|RTqF9dDYmlbZ;SZ9 zU)nr^Eh;!l68`J2{ksEYrwj05_*ng8{?u9qWZDKg8oVOSlke&w5YU*U}$KT}W|9Pp*{K$a| zc^C8VbNOFC7*9Qm53jSnvi z8eJ3B=YRg~^Yy@Iv(vpN`{y*)zpl;yT=qM+7%+>D&0`y&>gp+xwgAQbE(&ZoYiB&$ z(Za$)ZVK#`G;Y0puW_SNW5|AIc3l73J-;G0 znk_21qj&wr&XX=k&S0PbO(Cp9s5fbg>x$NXp{gKd|4-ZaJk8?`hNibnd3M5Fwb+e{ zx&Z99OmM_*iw)djM5FjF4^QL8(V5K=VgC$ zz3aFK1Yt%{pLTbL0Uq|D{;s(qoNT}I)Qy>mcm1Y~0iH?D?(C}LQ$k)H(s{wx1- z|Eu;(QkkjyinK|3o3TA@7{b^UaTx7Jzun1MvB+=rX(CpGHUon(S>M0kA>G?DG}SGc zPQJpccNefZU_9B8zoETd*c+ZSxBobmdpai4rdW8huw$ehMKoIByeZ>0X{3><|8f0l z`_#VuW%FMPZ!?(9W=e&bSy-a|t8A7OTJ{0vL)z+LQ@Ug4cP_5UUGrC`JM7gsqPN4? zf|oS5tCa?sXF6J$cHeug3|epO=9^S*E;yM8Tkn3Q7yn+GwHkGS7&&%rH;E6tBwXB$ z`p13KeU1ONWj&PKLFb{5?=~DDnd+PZ(BSqU|M`TkT@O8J0kUD(`^%{Xg@w9NVAef= zcu?~=q(~5s!~(mr*wY3w6q^;&ga^=36XIm`Z+1fg_<9d;t z&us9$$I=NLQXw06aL~N5VM;D??fr-gQ^@2Sb@^_jscG3hj%H)h`LHhA89<52@|nte*h+3oLotMFMlA9JstTr)(E7|<{>d|jC=)JZ?=G%qHCMA zf&x~)6E#7oRDf#cEingjH3Qv0T^_Oq!1z4y`OZ&q6p@zF(WhSvgkAEzfUJTptBCPny=x4rwkgT2WI=w)%tHLXoSv82z>nDCf%k~(*LAFz?} z`7a?Aaz3ueQ%>6jyHVsdAKB>GMHscro?d&H>L{bKXN{c&)X-PRhT4~^0XfQa7GcOT zziQ#(w}*=NX-D`S2j4Gj>nWR2QE+<4nP$J}EsqU;(O~pVZQbl%_OTVz`EmSsZb_;gIm z#VvXd3WvPSojAdetL_ZCTpMUwjjabdb>oYT_O|=5rY67>KQt&Q{`TFm-i3pKLEXV} z+n_W$2BDJ3T{+NEYjYd8PfYx@479?&#%~OyJ9g~9`Rcyk_z~e7_qeE|il~Vu{#2oo zM<9|1yLR)0jGxem=*`(vXh{tI>nzZTHAAtwYx8Kj&^VxpTwESRe0eFDP2-S*E1_Zq zAeI>`uD^+1ZK-8!wkfjYDRciw7|JjnXk@u)eFzB4_@SbzYPu>>+&wEyNVDyQ9Tep?_@-e4xNV0+XFImV0LNGFVb$MJ#&bhBr!rCkW6O_)W{bQKf01 zsk}C8b-Rwy>Wojk4`#wUZoQ@#rJQW07OfDe!si)`lE^P7KL5&N?o|w5G$Za})uyOR zKaBk3e3e4&Lsi2-``Yd2UeM7--B5NcFjC@OG#7g>$x@gjOe&cjgm- zD%(Xd$8%Eb!^#V)LS^?Ch`*jgE_usmd7F5xDwO`VUZ*oZNm84sV^#`)KQ+%+7S8=4 zZUW!MTb&0=EW&Z~pGzfQPDg((xA89`8Cc3@iweyjv>pB$E0h{KXA5FLF2MrY#jq9M zLqwQ!7-jj>T0RnjPbr)(z>?BhPUY~`iN}1{%Kh59=n-FXYipn&@sp+kN_h^WW|ar5KHeIV;lM?y$oDz=RJ}v zD8WF8n*lm{=Qq@()#fkZ)8vGa( zNK>Wnwh!tWSU)Y?9F47RlbIy!H7z}tYLF$juIInv`$}Z4 zZTvuVr!?l4daM*@>DzCD=u)l-exyX8_Pety!4b~B4UROc(jy_iC#Qv&b8Q)+NjROI zfZpsDtL9E`oi~FRABS>0c5?$u16uun-}FGqvSi}bf*r0mTOAL^>UW(M*lTxBNTaka zKX_ddv@PM_P=+51QJe@{_gNV_#jTl_D!z79Sd$4$7E@pWYVT|?F3-h@sEV< z)KrRuWVr z8bu8!iCI5%&m~$Z##a}8&IcLRWpG)rpGdMVdb13)wl1+5fjgwFp?-ERJ`vp4d5@^P zFFO|#orXd%6+9cl5gV5lMB5@`+FCkvAU%2)uNa?uCF9wNFna}=(aW~j{pQI~t4zJ_ z>zgu^z~a8UJXahU+Yz!WgO<$U;C~cuZ%4dwZ zjlylINw0^)0u3J{kp1jKszf0lXW7OJHG17$WDZP}ScXG_MekY9@1!zv#r>s>>4bbw%yVVUGg@ZNjB=JC0X#~U1W^P0GY`V>9N zuWIh3S~L4|h5Jk6lBwASX>fgB@kk8R zFOBiE+7}EhWhth0w9V+F77GY@GZh3Cb1GNOYTe#z zfWZA*I3+;&k zSKlaB7%yf5|c@%`i-bBQQi{a!Z(2E7{M)fEB2$+ z3|sp<@Ju&XO1d;5@%>~IbbmL9-wl}qZWs)uq7v=CwxhDUwbddW@*jF%qd(`Q|5K7f zpd`~s!_VD#EvhA57Uj3Q@S@OSruietX{e(C@?O-n;bD!6yZ>^Uf#Eft^x$Te9T=NQY)^0Pcnkf_g_so8#HzTw%7H_?7`Ox#gx~G>n3Y~V z{^ICY5$2(5X@Y~@&f99w>yW#p`9 zpUpo}Uq-c=7B;4wxwF}wHA^?TGK|GXk{koJNBywGu^j=l+loK8UaI&WkTP0dY^_oB zTN?^sw6#_&V3h~eMMKJm7jtBN@(^ZT}d5*DduaEe%H5Uh1|GJVpP(g9AzF>)B!I#&cgl zn4+!mG$5s4!*{+71&ks*gva8}K zAmu5gzs3==GYuPGS^tFESY!FwYrE^@&>|MNf@R!vf`U+*oP`h092Zg!%4hYia&RS& z9aT}_XgStkk&wy?MqdgEo7TJb;M?2WU<|@}*VPqhsUvU$( z{HC>Kn`>4wU{$fJ6>`${bxNiPXGa~k7x8F(=hP(=kIjXr#S0WKwiXB7J~=R!=dt?> z6f78jad}InH!fg68M%2x?@5xzYr7AlbLA#&?(^&GE2CxX5h+_^vBR6yC@4!?;{_{{ z;`Wls_P|mcBCitte%#>M(+Mda#h&?Y0`gn2Bz{!+XCq!+tv(r|H`;i>MxXpbM5R%P-V#|V;^?dwyB%Tq^5V5eR5!iA z_7v_UXTn6QTfb_)aYvh(lipbQuIG1KmLCFkJ&(Z`J_gMT*GGfrzB;S-e0idM?{@7K z9mAY?`Q@SDd1(wiBHm~7w%ZCmFlB|(e>;bIPC58g*CHsP^Dz!SWO}7xXlIGsSFJ6q z>mD}Z;Wkk41!P`rb|nY>49zKCbJ-){E^2GCB5hXluO60;%5(w zfM8(lF`T9?K8B732W}Gq%b@ebn|zBkAk6Zaf+D3$HF@yyGC1L=%gPw4ulZZi8X^LQ znPPekxAdLPe76oxl4}y_)K3z7tDgTt)bmSAcBq-M37z#~&uWVil=V1l-(EQ!R|#x0HSJc~95gaRu@ArledS3(`LTf+hLpU*#W(lX z*9)DQXCFVaZ3W#@E)U7)S?nKCoJUtl_}~a7?qJejdXLUd@{a`aymdQy?E2PNuPy^Z z23jITu=GDyNXN(`pc;0BhL(=8!{!0Bpk97IXPox*b;`C$<$;*omn&YDQugTFAT9E?@S^bOl{b7ja`fq9rh}XWfjS*i|@V94?m0$j+1)T2z&)_<2mjRli-Hfu;m_T6Od z?oC@e%ZO{nx>C7X&i(wUKd7NVbvyppEzRE~=E%zyBmUrQG6||YX?q=c4?ev2 zIc8&iwxSIL6P!Le*CWRu(sO_p>Dfe{3o7~4f70dx&J#acWw#lZvwGwoKDnWxD%>T# z>MIN^*_1xBQe>03GZDMCF!)21)30Yg5Yk7$byi)*y;Uh*{M(ZhB0cc6ORTlS>x9+i zb3`k9mbr5k9CYd(VK(@O4NB;tD;E?<87Kdr0RLeEi$Hf$7)#ETTa#>mk>js19uAfX z>1Y=)z?Z*X`s0bJC9QgD+1(GkOm{mAU$pdjEua ztwtjV4Ns1`aClWE!UByh`u*kqo*s7O!7=&>`BU~h=s!R3?-l=dZo){Zk(-A{uf;Ic zc`-2VS9@6te0x*Z+&i~vjUTYnbUB_l3w28^CLy8fsm0a01MGiW?N75ieNtVU zHZA5GCI2$Cz{u#mkUOt&*wbJ!fyPTG;R=WR8K%kyIFwHY^)D~~d~+n=x5&>1I){OB zg#;SkVzZeKFaGrhfRxwD=YIk6ql=LD`?eu?m@yojEE62Zk6kjIVDx4R|2_T}ARPcm w$AJGA+t~rOv-9d@J?x+VIpIG(GO`%=^fyV7rHVdRJOVs)wV;{>>USRgAFSx@S^xk5 diff --git a/docs/capabilities.md b/docs/capabilities.md deleted file mode 100644 index ba4c8d86..00000000 --- a/docs/capabilities.md +++ /dev/null @@ -1,417 +0,0 @@ -# Capabilities - -Your integration's `capabilities` describe how it interacts with LaunchDarkly. - -We support the following capabilities: - -- [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`) -- [Trigger](#trigger-trigger) (`trigger`) -- [Flag link](#flag-link-flaglink) (`flagLink`) -- [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) -- [Feature store](#feature-store-featurestore) (`featureStore`) - -## Audit log events hook (`auditLogEventsHook`) - -An audit log events hook is a webhook that LaunchDarkly sends whenever an event happens inside of LaunchDarkly. Each of these events result in an event being published to LaunchDarkly's audit log. You can use this capability to send data to or trigger an event in another service. - -The `auditLogEventsHook` has three properties: - -1. [`endpoint`](#endpoint): - The HTTP handler that will receive the webhook. -2. [`templates`](#templates): - A map of template paths relative to your integration's directory. You can use templates to transform the raw audit log events to a format that your integration expects. These templates can be any file type. -3. [`defaultPolicy`](#default-policy): - An array of LaunchDarkly policies. The policies determine which events to send to your webhook endpoint. To learn more, read [Using policies](https://docs.launchdarkly.com/home/members/role-policies). - -Here's an example of an audit log events hook capability that subscribes to flag events in a LaunchDarkly account: - -```json - "capabilities": { - "auditLogEventsHook": { - "includeErrorResponseBody": false, - "endpoint": { - "url": "{{endpointUrl}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, - "templates": { - "flag": "templates/flag.json" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } -``` - -### Endpoint - -Every `auditLogEventsHook` capability must specify the [endpoint](endpoint.md) to which LaunchDarkly should send webhook data. - -### Templates - -Before the `auditLogEventsHook` capability sends the request to the endpoint handling your webhook, you can transform the body of the request sent to your handler. - -In your manifest, you can specify templates to be executed when webhook events are of kinds `flag`, `project`, and `environment`. Additionally, you can specify a `default` template as a catch-all for any event without a more specific template. You can also specify a `validation` template to provide users with the ability to validate their connection by sending a test event from LaunchDarkly to your service. - -Here is an example: - -```json - "templates": { - "default": "templates/default.json.hbs", - "flag": "templates/flag.json.hbs", - "project": "templates/project.json.hbs", - "environment": "templates/environment.json.hbs", - "validation": "templates/default.json.hbs" - }, -``` - -If you don't provide one or more templates, LaunchDarkly sends you a default JSON payload that looks like this: - -```json -{ - "_links": { - "canonical": { - "href": "/api/v2/flags/always-snippet/example-test", - "type": "application/json" - }, - "parent": { - "href": "/api/v2/auditlog", - "type": "application/json" - }, - "self": { - "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", - "type": "application/json" - }, - "site": { - "href": "/always-snippet/production/features/example-test", - "type": "text/html" - } - }, - "_id": "5defebd006121dd9f7ea90d0", - "_accountId": "", - "timestamp": { - "milliseconds": 1580778134028, - "seconds": 1580778134, - "rfc3339": "2020-02-04T01:02:14Z", - "simple": "2020-02-04 01:02:14" - }, - "kind": "flag", - "name": "Example test", - "description": "", - "shortDescription": "", - "comment": "This is just a test", - "member": { - "_links": { - "parent": { - "href": "/api/v2/members", - "type": "application/json" - }, - "self": { - "href": "/api/v2/members/569f514183f2164430000002", - "type": "application/json" - } - }, - "_id": "569f514183f2164430000002", - "email": "testing@example.com", - "firstName": "Henry", - "lastName": "Barrow" - }, - "titleVerb": "", - "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", - "title": "Henrietta Powell turned on the flag Example test in 'Production'", - "target": { - "_links": null, - "name": "" - } -} -``` - -If you choose to provide one or more templates, LaunchDarkly renders your template using the context data above. Your template can be any text-based format, but you must specify the appropriate `Content-Type` header in your `endpoint.headers` property to match the content type of your template body. - -We use a basic subset of the Handlebars template syntax to render your template. To learn more about Handlebars syntax, read [Handlebars Language Guide](https://handlebarsjs.com/guide/). - -In addition to the basic language syntax, we support the following [built-in helpers](https://handlebarsjs.com/guide/builtin-helpers.html): - -- `if` -- `unless` -- `each` -- `with` -- `lookup` - -We also support the following custom helpers: - -- `equal`: renders a block if the string version of both arguments are equal -- `pathEncode` - URL path encodes the string version of the argument -- `queryEncode` - URL query encodes the string version of the argument -- `basicAuthHeaderValue`: transforms `username` and `password` arguments into the `Authorization` header value required for a basic auth, including the `Basic ` prefix -- `formatWithOffset`: adds an offset in seconds to a unix milliseconds timestamp and formats the timestamp using one of the supported formats detailed below - -We support the following timestamp formats: - -- `milliseconds`: Unix milliseconds -- `seconds`: Unix seconds -- `rfc3339`: [RFC3339 format](https://datatracker.ietf.org/doc/html/rfc3339), for example, `2020-02-04T01:02:14Z` -- `simple`: timestamp string formatted as `yyyy-mm-dd h:MM:ss`, for example, `2020-02-04 01:03:59` - -To test your templates, you can run `npm run preview $INTEGRATION_NAME` or use the [Handlebars Sandbox](http://tryhandlebarsjs.com/). - -### Default policy - -Users of your integration can specify an array of [LaunchDarkly policies](https://docs.launchdarkly.com/home/members/role-policies) to filter which events to send to your webhook endpoint. - -To simplify onboarding your integration, you can specify a default policy which follows best practices for your integration's use case. - -Assuming your integration only cares about flag activity, we recommend the following default policy. This policy specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects. - -Here is the policy: - -```json - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] -``` - -### Include error response body (`includeErrorResponseBody`) - -A static domain is one in which the domain part of the endpoint is not a template variable. For endpoints defined with static domains, you can specify the optional property `includeErrorResponseBody` in your `auditLogEventsHook` configuration to view any errors LaunchDarkly receives when it sends events to your endpoint. This is particularly useful for users troubleshooting issues with their integration. - -Here is an example: - -```json - "includeErrorResponseBody": true, - "endpoint": { - "url": "https://static-domian.com/apiToken?={{apiToken}}", - "method": "POST" - }, -``` - -### Validation - -To preview your integration's templates with sample data, run `npm run preview $INTEGRATION_NAME`. - -Alternatively, to produce a sample `curl` command, run `npm run curl $INTEGRATION_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. - -## Trigger (`trigger`) - -The trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. By default, the trigger URL contains a globally unique path parameter to provide security in the form of an [unguessable URL](https://www.schneier.com/blog/archives/2015/07/googles_unguess.html). - -The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. - -If the integration offers the option to send test events or webhook requests, the optional `testEventNameRegexp` field lets you to specify regex to match the expected `eventName` value. This tells our integration framework not to make any real flag or resource changes associated with matching events. - -If your webhooks' request bodies are non-empty, you can specify the optional `parser` object with one or more of `eventName`, `value`, and `url`. The provided values will flow through LaunchDarkly into the resulting audit log messages when your service invokes a trigger in LaunchDarkly. - -Here is an example `trigger` capability: - -```json - "trigger": { - "documentation": "https://example.com/configuring-webhooks", - "parser": { - "eventName": "/event", - "value": "/value", - "url": "/links/self/href" - }, - } -``` - -If an integration only has the trigger capability, the word "trigger" will be added to its name in the LaunchDarkly UI. For this reason, do not include the word "trigger" in the manifest name. Review the [generic-trigger manifest](/integrations/generic-trigger/manifest.json) for an example. - -## Flag link (`flagLink`) - -The [flag link](https://docs.launchdarkly.com/home/flags/links) capability gives LaunchDarkly users the ability to associate feature flags with resources contained in external services, such as Slack messages and Jira issues. This capability is used to apply custom formatting and metadata to flag links that originate from your integration service. - -For complete examples, see the [Slack App manifest](/integrations/slack-app/manifest.json) and the [Jira integration manifest](/integrations/jira/manifest.json). - -![The flag "links" tab showcasing Jira and Slack links.](./assets/flag%20links.png) -_The flag "links" tab showcasing Jira and Slack links._ - -The flag link capability has the following properties: - -### `header` (string) - -This property specifies the sentence-cased title to show for all flag links for the integration, e.g. "Jira issue", "Slack conversation". - -### `metadata` (object) - -The `metadata` object specifies the shape of the data the [flag link POST body and API response](). Additionally, the metadata can be referenced in the visual representation of the flag link and may be indexed for search purposes. In the integration manifest, the `metadata` object is a mapping of a metadata key to a metadata value object that specifies the format of the metadata item. - -For example, the [Jira integration](/integrations/jira/manifest.json) has the following `metadata` object: - -```json -"metadata": { - "creator": { - "type": "string" - }, - "iconUrl": { - "type": "uri" - }, - "issueKey": { - "type": "string" - }, - "issueTitle": { - "type": "string" - } -}, - -``` - -### `uiBlocks` (object) - -The `uiBlocks` object specifies the look and feel of the integration's flag links in the LaunchDarkly UI. Any combination of the following properties can be specified: - -- `image` - an object specifying the icon or avatar used to represent the link. Handlebars templating can be utilized in the `sourceUrl` field to reference metadata submitted by the integration when the link is created. - -- `title` - an object specifying the flag link title. UI block `elements` are used to provide design flexibility. - -- `context` - an object specifying additional information about the flag link. UI block `elements` are used to shape the message. - -### UI block elements - -The `title` and `context` UI blocks take advantage of UI block elements to provide flexible formatting. A UI block element is an object comprised of a required `text` field and may contain one or more of the following properties: - -- `isBold` (boolean) - Whether or not the text should be rendered in bold face. -- `isTimestamp` (boolean) - Whether or not the text should be converted from unix milliseconds to a human-readable format -- `url` (string) - If provided, the block element will link to the rendered URL. - -Both the `text` and `url` properties can include handlebars template variables to reference metadata submitted by the integration when the link is created. - -For example, the [Slack App integration](/integrations/slack-app/manifest.json)'s `context` UI block is specified as follows: - -```json -"context": { - "elements": [ - { "text": "Posted in" }, - { "text": "#{{{metadata.channelName}}}", "isBold": true }, - { "text": "View message", "url": "{{{deepLink}}}" } - ] -} -``` - -This results in flag links context messages in the following format: - -> Posted in **#example-channel** [View message](https://example.com) - -### `emptyState` (object) - -This `emptyState` object species the message used to assist users when there have not been any flag links created for the integration. The `emptyState` object contains two properties: - -- `title` - The title heading of the empty state message. -- `leadText` - Text or markup content detailing how users can create flag links for this integration. - -For example, the [Jira integration](/integrations/jira/manifest.json)'s `emptyState` object is as follows: - -```json -"emptyState": { - "title": "There are no Jira issues that link to this flag.", - "leadText": "Jira issues connected to this feature flag will automatically appear here. To learn how to enable the Jira integration or to connect an issue to a feature flag, [read our documentation](https://docs.launchdarkly.com/home/flags/links#creating-jira-flag-links)" -}, -``` - -## Reserved custom properties (`reservedCustomProperties`) - -Custom properties allow you to store data in LaunchDarkly alongside a feature flag. For example, you can use custom properties to indicate flag-level associations with data on your service. If you don't have any flag-level associations or configurations, you don't need to use this capability. - -To learn more, read [Custom properties](https://docs.launchdarkly.com/home/connecting/custom-properties). - -By default, users must specify a custom property name and key when they attach the custom property value to a feature flag. This step introduces the possibility of user error. To prevent this, developers can _reserve_ a custom property for their integration, which makes it much easier for users to correctly add the property's value to feature flags. - -Reserved custom properties require a `name` and `key`. Adding a `description` is optional. - -After your integration is configured by a user, the custom property starts appearing in the dropdown on the flag's **Settings** page. - -Here is an example `reservedCustomProperties` capability: - -```json - "reservedCustomProperties": [ - { - "name": "Foobar Entities", - "description": "Foobar Description", - "key": "foobar" - } - ], -``` - -## Feature store (`featureStore`) - -**LaunchDarkly's feature store functionality is only available to customers who have opted in to an Early Access Program (EAP). To access to this feature, [join the EAP](https://launchdarkly.com/eap).** - -The feature store capability allows you to specify an endpoint that can receive a payload containing up-to-date flag data from LaunchDarkly. - -In addition to [`formVariables`](form-variables.md), the `featureStore` has two properties, a required `featureStoreRequest` and an optional `validationRequest`. - -### `featureStoreRequest` - -This specifies the request [`endpoint`](endpoint.md) that LaunchDarkly makes when flag data are updated. You can do this using an [`endpoint`](endpoint.md) and a `parser`. - -In addition to the form variables defined in your manifest, you can use the special variable `_featureStoreKey`. `_featureStoreKey` is provided by LaunchDarkly, and is unique per environment. - -### `validationRequest` (optional) - -Specifying a validation request allows customers to verify that they have properly filled out the details to correctly make a request. - -The `parser` object allows LaunchDarkly to interpret the response of the validation request. It allows a mapping of success and errors for the given response body of the request in the form of a [JSON pointer](https://datatracker.ietf.org/doc/html/rfc6901). The `parser` object has two properties: a required `success` and an optional `error`. - -Here is an example `parse` object: - -```json - "parser": { - "success": "/success", - "error": "/error" - }, -``` - -Choose an endpoint that will indicate by its response that the specified form variables are correct, but which has no side effects. - -Here is an example `featureStore` capability: - -```json - "featureStoreRequest": { - "endpoint": { - "url": "https://example.com/{{accountId}}/dictionary/{{dictId}}/item/{{_featureStoreKey}}", - "method": "PUT", - "headers": [ - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - }, - { - "name": "Content-Type", - "value": "text/plain" - } - ] - } - }, - "validationRequest": { - "endpoint": { - "url": "https://example.com/{{accountId}}/dictionary/{{dictId}}/items", - "method": "GET", - "headers": [ - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, - "parser": { - "success": "/success" - } - } -``` diff --git a/docs/endpoint.md b/docs/endpoint.md deleted file mode 100644 index fc8c1879..00000000 --- a/docs/endpoint.md +++ /dev/null @@ -1,54 +0,0 @@ -# Endpoint - -Some capabilities require specifying an endpoint that LaunchDarkly can make requests to. For example, an endpoint could be specified as follows: - -```json - "endpoint": { - "url": "{{endpointUrl}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, -``` - -This specification must include all appropriate request semantics including the URL, method, and headers. - -In the example above, the properties `endpoint.url` and `endpoint.headers[].value` accept template variables. These template variables can reference any [`formVariables`](form-variables.md) you've defined in your manifest. This lets you configure a dynamic endpoint based on the `formVariables` your integration collects from the user. - -The templating language LaunchDarkly uses is based off of a subset of the Handlebars syntax. To learn more, read the [Handlebars documentation](https://handlebarsjs.com/). - -This example uses the `endpointUrl` form variable as the URL of the endpoint and the `apiToken` as a `Bearer` token in the `Authorization` header: - -```json - "endpoint": { - "url": "{{endpointUrl}}", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, -``` - -This example uses the `apiToken` form variable as a query parameter on the URL: - -```json - "endpoint": { - "url": "https://example.com/apiToken?={{apiToken}}", - "method": "POST" - }, -``` diff --git a/docs/form-variables.md b/docs/form-variables.md deleted file mode 100644 index 4f7ade1c..00000000 --- a/docs/form-variables.md +++ /dev/null @@ -1,42 +0,0 @@ -# Form variables - -Most integrations need to collect one or more pieces of configuration data that support the integration, such as API tokens or webhook endpoints. - -To support these configurations, describe a set of `formVariables` that define these configuration properties. The `formVariables` populate a form in the LaunchDarkly user interface (UI) that users complete to add your integration. - -Here's an example: - -```json - "formVariables": [ - { - "key": "endpointUrl", - "name": "Webhook endpoint URL", - "description": "Enter the URL to the webhook endpoint", - "defaultValue": "https://example.com/inbound_webhook", - "type": "url" - }, - { - "key": "apiToken", - "name": "API Key", - "description": "Enter your [API key](https://example.com/api) here", - "type": "string", - "isSecret": true - } - ], -``` - -The `formVariables` entry above displays as the following UI on the [LaunchDarkly Integrations page](https://app.launchdarkly.com/default/integrations): - -![Example configuration form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) - -Form variables apply to the entire integration configuration. There are no capability-specific form variables. - -The `key`, `name`, `description`, and `type` are required. - -The `formVariables[].description` is used as a field label on the UI. You can use simple Markdown to link a word or phrase to an external URL. - -Accepted form variable `type`s are `string`, `boolean`, `uri`, `enum`, and `dynamicEnum`. - -Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. If you provide a `defaultValue`, you must also set `isOptional` to `true` and vice versa. - -To learn more, read the [manifest schema](../manifest.schema.json). diff --git a/docs/getting-started.md b/docs/getting-started.md deleted file mode 100644 index 058ce1f3..00000000 --- a/docs/getting-started.md +++ /dev/null @@ -1,84 +0,0 @@ -# Getting started - -There are several steps to building an integration with LaunchDarkly. - -## Prerequisites - -Before you connect LaunchDarkly with a third-party service, replicate your integration's desired behavior in an isolated standalone environment separate from LaunchDarkly. - -The easiest way to do this is to use [`curl`](https://curl.se/docs/manpage.html). Find the API documentation for your third-party service and execute sample commands against the service. When you execute your sample commands, observe the request semantics. This helps streamline your manifest and template definitions. - -If you are looking to integrate with a third-party service that you are not directly associated with, please open a [Feature Request](https://github.com/launchdarkly/integration-framework/issues/new/choose) describing your goal and expectations for the integration before submitting any pull requests. - -## Step 0: Requirements - -Every integration is required to provide two SVG logo files, one in horizontal and one in square dimensions. - -Square SVGs are rendered in a 40x40 container. - -Horizontal SVGs are render with a height of 55px while retaining the original aspect ratio of the file. - -The usage of these files is further described in Step 3. - -## Step 1: Fork this repository - -Fork this repository to your own GitHub account. - -After you finish building your integration, you can submit a pull request to LaunchDarkly to have it approved and deployed. - -To learn more about submitting a pull request, read [Step 8: Submit your integration](#step-8-submit-your-integration). - -## Step 2: Create a new directory inside `./integrations` - -Create a new directory inside the [integrations](../integrations) directory. Name it after your organization or give it the integration's name, for example, `your-company-name-dot-com`. The directory name must not have any spaces and must use [kebab-casing](https://wiki.c2.com/?KebabCase). - -Only change files and directories inside your new directory. Our validation process rejects any pull requests with modified content outside of your directory. - -## Step 3: Create your integration manifest - -Each integration contains a manifest defining basic concepts about your integration and organization. Manifests also instruct LaunchDarkly in how to interact with your integration. - -Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. It's important to configure your manifest correctly. - -To learn more, read [Integration manifest](manifest.md). - -## Step 4: Collect integration configuration data from LaunchDarkly account members - -Most integrations need to collect one or more pieces of configuration data that support the integration. For example, your integration may collect API tokens or webhook endpoints. - -You can describe a set of `formVariables` that define these configuration properties. - -To learn more, read [Form variables](form-variables.md). - -## Step 5: Define your integration's capabilities - -The next step to define your LaunchDarkly integration is describing its `capabilities`. Your integration's `capabilities` are how it interacts with LaunchDarkly. - -To learn more, read [Capabilities](capabilities.md). - -## Step 6: Validate your integration - -To validate your integration: - -1. Run `npm install` to install the validation dependencies. -2. Run `npm test` to run the validation suite. - -Use Node.js v16 when running the above `npm` commands. - -Additionally, we recommend you install [pre-commit hooks](https://pre-commit.com/#install) with `pre-commit install`. This runs the validation suite before every commit, saving you time if you need to troubleshoot anything. - -Some of the capabilities have their own validation tools. To learn more, read [Capabilities](capabilities.md). - -## Step 7: Create your user documentation and README - -Now that your integration is built and validated, you must provide documentation for users and integration maintainers. - -Find LaunchDarkly's user documentation at [docs.launchdarkly.com](https://docs.launchdarkly.com/integrations). You can submit new docs to the [LaunchDarkly-Docs repository](https://github.com/launchdarkly/LaunchDarkly-Docs). Submit a pull request to this repository with a new integrations guide. Follow the pattern and language used by existing integration guides. - -In addition to user documentation, you must to provide guidance on how to maintain and test your integration. Specify this developer-focused documentation in an integration README (`README.md`) in your integration's directory. The README should also link to the user documentation you provide. - -## Step 8: Submit your integration - -After you've built your integration, [submit a pull request against this repository](https://github.com/launchdarkly/integration-framework/pull/new/main). - -When you submit a pull request, your branch will run through some automated validations and be reviewed by our team. If we're ready to publish your integration, we'll get your permission and publish your integration and documentation live on our site. diff --git a/docs/manifest.md b/docs/manifest.md deleted file mode 100644 index ae7140cd..00000000 --- a/docs/manifest.md +++ /dev/null @@ -1,71 +0,0 @@ -# Integration manifest - -Each integration contains a manifest defining basic concepts about your integration and organization. Manifests also instruct LaunchDarkly in how to interact with your integration. - -Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. It's important to configure your manifest correctly. - -## Introduction - -Create an empty `manifest.json` file inside your new directory. You will use the `manifest.json` to describe your integration's details and capabilities. - -The properties of LaunchDarkly's integration manifests are defined through a [JSON schema](../manifest.schema.json). Many IDEs can provide you inline help and validation while editing your manifest. You can register the JSON schema in your IDE to enable this kind of help. - -If you use [VSCode](https://code.visualstudio.com/), it detects the settings in this repository and applies the schema validation without any additional configuration. - -![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) - -## Getting started - -The first part of the manifest describes your organization, contacts, URLs, and a few items LaunchDarkly needs to list your integration properly. - -We use most of this information when we render your integration card and configuration form in the LaunchDarkly user interface (UI). - -```json -{ - "name": "Sample Integration", - "version": "1.0.0", - "overview": "Short one-liner describing your integration", - "description": "Send flag data to space. Markdown-based description.", - "author": "Example Dot Com", - "supportEmail": "support@example.com", - "links": { - "site": "https://example.com", - "privacyPolicy": "https://example.com/privacy" - }, - "categories": ["monitoring"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - "requiresOAuth": false -} -``` - -There are a few properties in the manifest that can accept simple [Markdown](https://daringfireball.net/projects/markdown/). One of them is the `description`. LaunchDarkly's UI converts Markdown to HTML. To get the best results, only use simple Markdown, such as links and basic text formatting. - -The `icons` described in the manifest are in SVG format. This is intentional. We do not accept other image formats. - -We use your organization's or integration's logo in the LaunchDarkly UI and in the public integrations listing on [launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG files allow your logo to scale nicely on different devices. To make sure your logo appears correctly everywhere we use it, make sure that it doesn't have any padding around the image. - -The `icon.square` and `icon.horizontal` properties point to relative paths. These paths are relative to your integration's directory. You are free to create any directories and files that support your integration. - -### Categories - -The following values are supported for the `"categories"` attribute: `"analytics"`, `"approval"`, `"authentication"`, `"automation"`, `"code-references"`, `"customer-support"`, `"data"`, `"developer-tools"`, `"infrastructure"`, `"issue-tracking"`, `"log-management"`, `"messaging"`, `"monitoring"`, and `"notifications"`. - -## OAuth - -Many integrations in LaunchDarkly use API tokens. However, if your API requires OAuth for authentication, we can support that as well. We support two types of OAuth: - -- [Authorization Code Flow](https://oauth.net/2/grant-types/authorization-code/) - (also known as "3-legged OAuth") -- [Client Credentials Flow](https://oauth.net/2/grant-types/client-credentials/) - (also known as "2-legged OAuth") - -With both of these flows, LaunchDarkly acts as the OAuth consumer. In order for this to work, LaunchDarkly needs to store a consumer ID and secret. Contact us at [integrations@launchdarkly.com](mailto:integrations@launchdarkly.com) to register your OAuth consumer details. You'll also need to set the `requiresOAuth` root-level property in your manifest to `true`. At runtime, LaunchDarkly will look up your OAuth consumer ID and secret from our registry using the `oauthIntegrationKey` value from your app's manifest. **Setting the `requiresOAuth` property to `true` will not enable OAuth on your integration. You need to provide us with the OAuth consumer details first.** - -## Form variables and capabilities - -Form variables and capabilities are the most important part of the manifest. They define the primary interactions that LaunchDarkly and users will have with your integration. - -Read more about [form variables](form-variables.md) and [capabilities](capabilities.md). From fe53cea14815836f4a40a0c8f29fde7f0b7959ac Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Thu, 16 Jun 2022 15:10:09 -0700 Subject: [PATCH 544/936] Fixes line break --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 14446c5d..c560dfe6 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,7 @@ [![CircleCI](https://circleci.com/gh/launchdarkly/integration-framework.svg?style=svg&circle-token=9a44436c3b22e7fb6a22df1ad9a2455a0d6f2d34)](https://circleci.com/gh/launchdarkly/integration-framework) -Feature flags give you control over your deployment and rollout. They can also provide context to third-party tools that show you how your application reacts to flag changes. You can integrate these tools with LaunchDarkly using the LaunchDarkly integration framework. For additional background, read [Using the LaunchDarkly integration framework -](https://docs.launchdarkly.com/integrations/building-integrations) in our LaunchDarkly product documentation. +Feature flags give you control over your deployment and rollout. They can also provide context to third-party tools that show you how your application reacts to flag changes. You can integrate these tools with LaunchDarkly using the LaunchDarkly integration framework. For additional background, read [Using the LaunchDarkly integration framework](https://docs.launchdarkly.com/integrations/building-integrations) in our LaunchDarkly product documentation. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly to provide the external tools with more context. From 181d693a073ea26ecd83707a706b7f7f568e0631 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 17 Jun 2022 10:17:19 +0200 Subject: [PATCH 545/936] [sc-156682] add terraform cloud manifest (#365) * added integration for pagerduty * added a placeholder logo for now * changed icon to PD icons * added links to the payload * beginning the terraform cloud integration * fix up manifest * final * this is the one * add host name form variable * fix resources and metadata Co-authored-by: munnawar hashim --- .../assets/images/terraform_horizontal.svg | 1 + .../assets/images/terraform_square.svg | 12 ++++ integrations/terraform-cloud/manifest.json | 72 +++++++++++++++++++ .../templates/default.json.hbs | 16 +++++ 4 files changed, 101 insertions(+) create mode 100755 integrations/terraform-cloud/assets/images/terraform_horizontal.svg create mode 100644 integrations/terraform-cloud/assets/images/terraform_square.svg create mode 100644 integrations/terraform-cloud/manifest.json create mode 100644 integrations/terraform-cloud/templates/default.json.hbs diff --git a/integrations/terraform-cloud/assets/images/terraform_horizontal.svg b/integrations/terraform-cloud/assets/images/terraform_horizontal.svg new file mode 100755 index 00000000..7b6ff8c0 --- /dev/null +++ b/integrations/terraform-cloud/assets/images/terraform_horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/terraform-cloud/assets/images/terraform_square.svg b/integrations/terraform-cloud/assets/images/terraform_square.svg new file mode 100644 index 00000000..ba7c24b8 --- /dev/null +++ b/integrations/terraform-cloud/assets/images/terraform_square.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/integrations/terraform-cloud/manifest.json b/integrations/terraform-cloud/manifest.json new file mode 100644 index 00000000..9692184d --- /dev/null +++ b/integrations/terraform-cloud/manifest.json @@ -0,0 +1,72 @@ +{ + "name": "Terraform Cloud (Enterprise)", + "version": "1.0.0", + "overview": "Trigger Terraform runs when resources changes in LaunchDarkly.", + "description": "Send resource change events directly to Terraform Cloud's Runs API to trigger runs in Terraform Cloud (Enterprise).", + "author": "LaunchDarkly Labs", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://cloud.hashicorp.com/products/terraform", + "launchdarklyDocs": "https://docs.launchdarkly.com", + "privacyPolicy": "https://www.hashicorp.com/privacy" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/images/terraform_square.svg", + "horizontal": "assets/images/terraform_horizontal.svg" + }, + "formVariables": [ + { + "key": "hostName", + "name": "Terraform Enterprise Host Name", + "type": "string", + "description": "Enter your Terraform Enterprise host name in the format https://.", + "isOptional": true, + "defaultValue": "https://app.terraform.io" + }, + { + "key": "token", + "name": "Terraform User / Team Token", + "type": "string", + "description": "Enter your Terraform Enterprise [user token or team token](https://www.terraform.io/cloud-docs/users-teams-organizations/users#creating-a-token).", + "isSecret": true, + "isOptional": false + }, + { + "key": "workspaceId", + "name": "Workspace ID", + "type": "string", + "description": "Enter the ID of the Terraform workspace you want runs to trigger for based on the policy below.", + "isSecret": false, + "isOptional": false + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{hostName}}/api/v2/runs", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/vnd.api+json" + }, + { + "name": "Authorization", + "value": "Bearer {{token}}" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "deny", + "resources": ["proj/*:env/*:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/terraform-cloud/templates/default.json.hbs b/integrations/terraform-cloud/templates/default.json.hbs new file mode 100644 index 00000000..20e18fba --- /dev/null +++ b/integrations/terraform-cloud/templates/default.json.hbs @@ -0,0 +1,16 @@ +{ + "data": { + "attributes": { + "message": "This run was triggered by the following changes: {{{title.plainText}}}" + }, + "type":"runs", + "relationships": { + "workspace": { + "data": { + "type": "workspaces", + "id": "{{{formVariables.workspaceId}}}" + } + } + } + } +} From 40b64822290f5d3d92c95a006bcb6026040b4fa6 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 17 Jun 2022 12:35:32 +0200 Subject: [PATCH 546/936] Munnawarhashim/sc 156682/moonshots xviii small fixes (#366) * small fixes * make run title shorter --- integrations/terraform-cloud/manifest.json | 4 ++-- integrations/terraform-cloud/templates/default.json.hbs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/terraform-cloud/manifest.json b/integrations/terraform-cloud/manifest.json index 9692184d..f8a1c1f6 100644 --- a/integrations/terraform-cloud/manifest.json +++ b/integrations/terraform-cloud/manifest.json @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com", "privacyPolicy": "https://www.hashicorp.com/privacy" }, - "categories": ["monitoring"], + "categories": ["automation", "infrastructure"], "icons": { "square": "assets/images/terraform_square.svg", "horizontal": "assets/images/terraform_horizontal.svg" @@ -20,7 +20,7 @@ "key": "hostName", "name": "Terraform Enterprise Host Name", "type": "string", - "description": "Enter your Terraform Enterprise host name in the format https://.", + "description": "Enter your Terraform Enterprise host name in the format https://HOST_URL.", "isOptional": true, "defaultValue": "https://app.terraform.io" }, diff --git a/integrations/terraform-cloud/templates/default.json.hbs b/integrations/terraform-cloud/templates/default.json.hbs index 20e18fba..61735e2f 100644 --- a/integrations/terraform-cloud/templates/default.json.hbs +++ b/integrations/terraform-cloud/templates/default.json.hbs @@ -1,7 +1,7 @@ { "data": { "attributes": { - "message": "This run was triggered by the following changes: {{{title.plainText}}}" + "message": "Triggered via LaunchDarkly: {{{title.plainText}}}" }, "type":"runs", "relationships": { From 8ca043d69f6fdf3e160d7904486eb1b7782030ed Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 17 Jun 2022 19:00:52 +0100 Subject: [PATCH 547/936] Update Zendesk goaltender card to point to marketplace listing (#349) --- integrations/zendesk/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/zendesk/manifest.json b/integrations/zendesk/manifest.json index 74e28243..1c0ac2a0 100644 --- a/integrations/zendesk/manifest.json +++ b/integrations/zendesk/manifest.json @@ -6,7 +6,7 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://www.zendesk.com", + "site": "https://www.zendesk.com/marketplace/apps/support/474556/launchdarkly", "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/zendesk", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, From 96a6c770b215b76abc4f8821bde418f34a143a54 Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Fri, 17 Jun 2022 11:20:12 -0700 Subject: [PATCH 548/936] Updates manifest and readme --- integrations/appoptics/README.md | 6 +++--- integrations/appoptics/manifest.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/appoptics/README.md b/integrations/appoptics/README.md index 9b9e50d1..ae913484 100644 --- a/integrations/appoptics/README.md +++ b/integrations/appoptics/README.md @@ -1,7 +1,7 @@ # AppOptics -[User documentation](https://example.com) +API documentation for this integration is available on the AppOptics API documentation site: [AppOptics](https://docs.appoptics.com/api/#create-an-annotation) -[API documentation](https://docs.appoptics.com/api/#create-an-annotation) +## Getting started with the AppOptics integration -Run `npm run curl appoptics` in the root repository directory to generate a `curl` command to send data to AppOptics. +Run `npm run curl appoptics` in the root repository directory to generate a `curl` command to send data to AppOptics. \ No newline at end of file diff --git a/integrations/appoptics/manifest.json b/integrations/appoptics/manifest.json index 91ee86c9..18ee7c43 100644 --- a/integrations/appoptics/manifest.json +++ b/integrations/appoptics/manifest.json @@ -18,7 +18,7 @@ { "key": "streamName", "name": "AppOptics annotation stream name", - "description": "Enter the Annotation stream Name that will be used for the request to the [Annotation API](https://docs.appoptics.com/api/?shell#create-an-annotation).", + "description": "Enter the annotation stream name that will be used for the request to the [Annotation API](https://docs.appoptics.com/api/?shell#create-an-annotation).", "type": "string", "isSecret": false }, @@ -32,7 +32,7 @@ { "key": "apiKey", "name": "AppOptics API key", - "description": "Enter your AppOptics API Key as shown on your [account page](https://my.appoptics.com/organization/tokens).", + "description": "Enter your AppOptics API key as shown on your [account page](https://my.appoptics.com/organization/tokens).", "type": "string", "isSecret": true } From 82b93d757b3a43a500e74aac246de8a85098af1f Mon Sep 17 00:00:00 2001 From: Fabian Feldberg Date: Mon, 20 Jun 2022 14:33:10 +0100 Subject: [PATCH 549/936] provisional integration card and template --- .../cloudtrail/assets/images/square.svg | 18 +++++ integrations/cloudtrail/manifest.json | 65 +++++++++++++++++++ .../cloudtrail/templates/default.json.hbs | 34 ++++++++++ 3 files changed, 117 insertions(+) create mode 100644 integrations/cloudtrail/assets/images/square.svg create mode 100644 integrations/cloudtrail/manifest.json create mode 100644 integrations/cloudtrail/templates/default.json.hbs diff --git a/integrations/cloudtrail/assets/images/square.svg b/integrations/cloudtrail/assets/images/square.svg new file mode 100644 index 00000000..8e762b90 --- /dev/null +++ b/integrations/cloudtrail/assets/images/square.svg @@ -0,0 +1,18 @@ + + + + Icon-Architecture/64/Arch_AWS-Cloud-Trail_64 + Created with Sketch. + + + + + + + + + + + + + diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json new file mode 100644 index 00000000..a0446cda --- /dev/null +++ b/integrations/cloudtrail/manifest.json @@ -0,0 +1,65 @@ +{ + "name": "AWS CloudTrail", + "version": "1.0.0", + "overview": "Export LaunchDarkly audit events.", + "description": "Export LaunchDarkly audit events to AWS CloudTrail via Open Audit Events.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://aws.amazon.com/cloudtrail/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/more", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["monitoring", "analytics"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "formVariables": [ + { + "key": "accountId", + "name": "AWS account ID", + "description": "Enter your [AWS account ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html#FindingYourAWSId). The associated account must be configured to use CloudTrail Lake.", + "type": "string", + "placeholder": "123456" + }, + { + "key": "iamRoleArn", + "name": "Ingest IAM Role ARN", + "description": "Enter the ARN of the IAM Role for LaunchDarkly to assume to post to your AWS CloudTrail destination.", + "type": "string", + "isSecret": true + }, + { + "key": "ingestionChannelArn", + "name": "CloudTrail Ingestion Channel ARN", + "description": "Enter the ARN of the CloudTrail Ingestion Channel for LaunchDarkly to use.", + "type": "string", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["*"], + "actions": ["*"] + } + ], + "endpoint": { + "method": "POST", + "url": "", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "default": "" + } + } + } +} diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs new file mode 100644 index 00000000..278244a7 --- /dev/null +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -0,0 +1,34 @@ +{ + "id": "{{_id}}", + eventData: [{ + "eventVersion": "0.1", + "userIdentity": { + "type": "user", + "principalId": "{{member._id}}", + "details": { + "email": "{{member.email}}", + "firstName": "{{member.firstName}}", + "lastName": "{{member.lastName}}" + } + }, + "eventTime": "{{timestamp.rfc3339}}", + "eventSource": "Launchdarkly", + "eventName": "{{kind}}", + "recipientAccountId": "{{formVariables.accountId}}", + "UUID": "{{_id}}", + "additionalEventData": { + "type": "{{verbKind}}", + "targetId": "{{target._id}}", + {{#if project}} + "projectKey": "{{project.key}}", + {{/if}} + {{#if project.environment}} + "environmentKey": "{{project.environment.key}}", + {{/if}} + {{#if tags}} + "tags": {{tags}}, + {{/if}} + "plainText": "{{title.plainText}}" + } + }] +} From 79c42feddaa7ba531bd206f944cf698f5e0c4596 Mon Sep 17 00:00:00 2001 From: Fabian Feldberg Date: Mon, 20 Jun 2022 14:35:34 +0100 Subject: [PATCH 550/936] fix missing newline in unrelated readme --- integrations/appoptics/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/appoptics/README.md b/integrations/appoptics/README.md index ae913484..b6492d4c 100644 --- a/integrations/appoptics/README.md +++ b/integrations/appoptics/README.md @@ -4,4 +4,4 @@ API documentation for this integration is available on the AppOptics API documen ## Getting started with the AppOptics integration -Run `npm run curl appoptics` in the root repository directory to generate a `curl` command to send data to AppOptics. \ No newline at end of file +Run `npm run curl appoptics` in the root repository directory to generate a `curl` command to send data to AppOptics. From a9edf8e85f7978a4600bfc3a58217dd9f76ee5f4 Mon Sep 17 00:00:00 2001 From: Fabian Feldberg Date: Mon, 20 Jun 2022 14:39:09 +0100 Subject: [PATCH 551/936] fix LaunchDarkly capitalisation --- integrations/cloudtrail/templates/default.json.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index 278244a7..c2918114 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -12,7 +12,7 @@ } }, "eventTime": "{{timestamp.rfc3339}}", - "eventSource": "Launchdarkly", + "eventSource": "LaunchDarkly", "eventName": "{{kind}}", "recipientAccountId": "{{formVariables.accountId}}", "UUID": "{{_id}}", From 8366733f3d2b20693c20d5da970f6c9575be85b3 Mon Sep 17 00:00:00 2001 From: Fabian Feldberg Date: Mon, 20 Jun 2022 14:54:29 +0100 Subject: [PATCH 552/936] small changes --- integrations/cloudtrail/manifest.json | 4 ++-- integrations/cloudtrail/templates/default.json.hbs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index a0446cda..28991ef8 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -49,7 +49,7 @@ ], "endpoint": { "method": "POST", - "url": "", + "url": "https://www.example.com", "headers": [ { "name": "Content-Type", @@ -58,7 +58,7 @@ ] }, "templates": { - "default": "" + "default": "templates/default.json.hbs" } } } diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index c2918114..d345deae 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -1,6 +1,6 @@ { "id": "{{_id}}", - eventData: [{ + "eventData": [{ "eventVersion": "0.1", "userIdentity": { "type": "user", From 965bfd5c78935d35b5a7c04e7f487e3a9a42fd15 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 20 Jun 2022 19:53:35 -0500 Subject: [PATCH 553/936] Added dependsOn field for form variables --- manifest.schema.d.ts | 48 +++++ manifest.schema.json | 400 ++++++++++++++++++++++++++++++++++++++- schemas/definitions.json | 79 +++++++- 3 files changed, 522 insertions(+), 5 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 8467d2e4..b1b2a6d8 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -248,6 +248,53 @@ export type Label = string; * Relative JSON path to values for each item in the options array to be used as dropdown values */ export type Value1 = string; +/** + * Event that triggers when the dependencies for the form fields should be evaluated. + */ +export type Event = "onFormInit" | "onFormChanged"; +/** + * Key for the dependee form field + */ +export type FieldKey = string; +/** + * Action to be taken when your defined conditions evaluates to true + */ +export type Action = "hideField"; +/** + * Name of the operator for evaluating a condition. + */ +export type Operator = + | "lessThan" + | "lessThanOrEqualTo" + | "greaterThan" + | "greaterThanOrEqualTo" + | "equalTo" + | "notEqual" + | "contains" + | "startsWith" + | "endsWith"; +/** + * Target value that conditions are evaluated against + */ +export type Value2 = string; +/** + * Conditional configurations to be evaluated to decide whether an action should taken for the form field. + */ +export type Conditions = { + operator: Operator; + value: Value2; + [k: string]: unknown; +}[]; +/** + * Dependency configuration to control the state and visibility of the form field. + */ +export type DependsOn = { + event: Event; + fieldKey: FieldKey; + action: Action; + conditions: Conditions; + [k: string]: unknown; +}[]; /** * Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`. */ @@ -542,6 +589,7 @@ export interface FormVariable { defaultValue?: DefaultValue; allowedValues?: AllowedValues; dynamicOptions?: DynamicOptions; + dependsOn?: DependsOn; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index acb0a33d..00af6ab6 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -285,7 +285,8 @@ "isOptional", "defaultValue", "allowedValues", - "dynamicOptions" + "dynamicOptions", + "dependsOn" ] }, "properties": { @@ -525,6 +526,103 @@ } } } + }, + "dependsOn": { + "$id": "#/definitions/form-variable/depends-on", + "title": "Depends on", + "type": "array", + "description": "Dependency configuration to control the state and visibility of the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "event", + "fieldKey", + "conditions", + "action" + ] + }, + "required": [ + "event", + "fieldKey", + "conditions", + "action" + ], + "properties": { + "event": { + "$id": "#/definitions/form-variable/depends-on/trigger", + "title": "Event", + "type": "string", + "description": "Event that triggers when the dependencies for the form fields should be evaluated.", + "enum": [ + "onFormInit", + "onFormChanged" + ] + }, + "fieldKey": { + "$id": "#/definitions/form-variable/depends-on/field-key", + "title": "Field key", + "type": "string", + "description": "Key for the dependee form field", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "action": { + "$id": "#/definitions/form-variable/depends-on/action", + "title": "Action", + "type": "string", + "enum": [ + "hideField" + ], + "description": "Action to be taken when your defined conditions evaluates to true" + }, + "conditions": { + "$id": "#/definitions/form-variable/depends-on/conditions", + "title": "Conditions", + "type": "array", + "description": "Conditional configurations to be evaluated to decide whether an action should taken for the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "operator", + "value" + ] + }, + "required": [ + "operator", + "value" + ], + "properties": { + "operator": { + "$id": "#/definitions/form-variable/depends-on/conditions/operator", + "title": "Operator", + "type": "string", + "description": "Name of the operator for evaluating a condition.", + "enum": [ + "lessThan", + "lessThanOrEqualTo", + "greaterThan", + "greaterThanOrEqualTo", + "equalTo", + "notEqual", + "contains", + "startsWith", + "endsWith" + ] + }, + "value": { + "$id": "#/definitions/form-variable/depends-on/conditions/value", + "title": "Value", + "type": "string", + "maxLength": 250, + "description": "Target value that conditions are evaluated against" + } + } + } + } + } + } } }, "required": [ @@ -1179,7 +1277,8 @@ "isOptional", "defaultValue", "allowedValues", - "dynamicOptions" + "dynamicOptions", + "dependsOn" ] }, "properties": { @@ -1419,6 +1518,103 @@ } } } + }, + "dependsOn": { + "$id": "#/definitions/form-variable/depends-on", + "title": "Depends on", + "type": "array", + "description": "Dependency configuration to control the state and visibility of the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "event", + "fieldKey", + "conditions", + "action" + ] + }, + "required": [ + "event", + "fieldKey", + "conditions", + "action" + ], + "properties": { + "event": { + "$id": "#/definitions/form-variable/depends-on/trigger", + "title": "Event", + "type": "string", + "description": "Event that triggers when the dependencies for the form fields should be evaluated.", + "enum": [ + "onFormInit", + "onFormChanged" + ] + }, + "fieldKey": { + "$id": "#/definitions/form-variable/depends-on/field-key", + "title": "Field key", + "type": "string", + "description": "Key for the dependee form field", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "action": { + "$id": "#/definitions/form-variable/depends-on/action", + "title": "Action", + "type": "string", + "enum": [ + "hideField" + ], + "description": "Action to be taken when your defined conditions evaluates to true" + }, + "conditions": { + "$id": "#/definitions/form-variable/depends-on/conditions", + "title": "Conditions", + "type": "array", + "description": "Conditional configurations to be evaluated to decide whether an action should taken for the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "operator", + "value" + ] + }, + "required": [ + "operator", + "value" + ], + "properties": { + "operator": { + "$id": "#/definitions/form-variable/depends-on/conditions/operator", + "title": "Operator", + "type": "string", + "description": "Name of the operator for evaluating a condition.", + "enum": [ + "lessThan", + "lessThanOrEqualTo", + "greaterThan", + "greaterThanOrEqualTo", + "equalTo", + "notEqual", + "contains", + "startsWith", + "endsWith" + ] + }, + "value": { + "$id": "#/definitions/form-variable/depends-on/conditions/value", + "title": "Value", + "type": "string", + "maxLength": 250, + "description": "Target value that conditions are evaluated against" + } + } + } + } + } + } } }, "required": [ @@ -1451,7 +1647,8 @@ "isOptional", "defaultValue", "allowedValues", - "dynamicOptions" + "dynamicOptions", + "dependsOn" ] }, "properties": { @@ -1691,6 +1888,103 @@ } } } + }, + "dependsOn": { + "$id": "#/definitions/form-variable/depends-on", + "title": "Depends on", + "type": "array", + "description": "Dependency configuration to control the state and visibility of the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "event", + "fieldKey", + "conditions", + "action" + ] + }, + "required": [ + "event", + "fieldKey", + "conditions", + "action" + ], + "properties": { + "event": { + "$id": "#/definitions/form-variable/depends-on/trigger", + "title": "Event", + "type": "string", + "description": "Event that triggers when the dependencies for the form fields should be evaluated.", + "enum": [ + "onFormInit", + "onFormChanged" + ] + }, + "fieldKey": { + "$id": "#/definitions/form-variable/depends-on/field-key", + "title": "Field key", + "type": "string", + "description": "Key for the dependee form field", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "action": { + "$id": "#/definitions/form-variable/depends-on/action", + "title": "Action", + "type": "string", + "enum": [ + "hideField" + ], + "description": "Action to be taken when your defined conditions evaluates to true" + }, + "conditions": { + "$id": "#/definitions/form-variable/depends-on/conditions", + "title": "Conditions", + "type": "array", + "description": "Conditional configurations to be evaluated to decide whether an action should taken for the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "operator", + "value" + ] + }, + "required": [ + "operator", + "value" + ], + "properties": { + "operator": { + "$id": "#/definitions/form-variable/depends-on/conditions/operator", + "title": "Operator", + "type": "string", + "description": "Name of the operator for evaluating a condition.", + "enum": [ + "lessThan", + "lessThanOrEqualTo", + "greaterThan", + "greaterThanOrEqualTo", + "equalTo", + "notEqual", + "contains", + "startsWith", + "endsWith" + ] + }, + "value": { + "$id": "#/definitions/form-variable/depends-on/conditions/value", + "title": "Value", + "type": "string", + "maxLength": 250, + "description": "Target value that conditions are evaluated against" + } + } + } + } + } + } } }, "required": [ @@ -2441,7 +2735,8 @@ "isOptional", "defaultValue", "allowedValues", - "dynamicOptions" + "dynamicOptions", + "dependsOn" ] }, "properties": { @@ -2681,6 +2976,103 @@ } } } + }, + "dependsOn": { + "$id": "#/definitions/form-variable/depends-on", + "title": "Depends on", + "type": "array", + "description": "Dependency configuration to control the state and visibility of the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "event", + "fieldKey", + "conditions", + "action" + ] + }, + "required": [ + "event", + "fieldKey", + "conditions", + "action" + ], + "properties": { + "event": { + "$id": "#/definitions/form-variable/depends-on/trigger", + "title": "Event", + "type": "string", + "description": "Event that triggers when the dependencies for the form fields should be evaluated.", + "enum": [ + "onFormInit", + "onFormChanged" + ] + }, + "fieldKey": { + "$id": "#/definitions/form-variable/depends-on/field-key", + "title": "Field key", + "type": "string", + "description": "Key for the dependee form field", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "action": { + "$id": "#/definitions/form-variable/depends-on/action", + "title": "Action", + "type": "string", + "enum": [ + "hideField" + ], + "description": "Action to be taken when your defined conditions evaluates to true" + }, + "conditions": { + "$id": "#/definitions/form-variable/depends-on/conditions", + "title": "Conditions", + "type": "array", + "description": "Conditional configurations to be evaluated to decide whether an action should taken for the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "operator", + "value" + ] + }, + "required": [ + "operator", + "value" + ], + "properties": { + "operator": { + "$id": "#/definitions/form-variable/depends-on/conditions/operator", + "title": "Operator", + "type": "string", + "description": "Name of the operator for evaluating a condition.", + "enum": [ + "lessThan", + "lessThanOrEqualTo", + "greaterThan", + "greaterThanOrEqualTo", + "equalTo", + "notEqual", + "contains", + "startsWith", + "endsWith" + ] + }, + "value": { + "$id": "#/definitions/form-variable/depends-on/conditions/value", + "title": "Value", + "type": "string", + "maxLength": 250, + "description": "Target value that conditions are evaluated against" + } + } + } + } + } + } } }, "required": [ diff --git a/schemas/definitions.json b/schemas/definitions.json index 19799b78..19e0aff1 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -116,7 +116,8 @@ "isOptional", "defaultValue", "allowedValues", - "dynamicOptions" + "dynamicOptions", + "dependsOn" ] }, "properties": { @@ -238,6 +239,82 @@ } } } + }, + "dependsOn": { + "$id": "#/definitions/form-variable/depends-on", + "title": "Depends on", + "type": "array", + "description": "Dependency configuration to control the state and visibility of the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": ["event", "fieldKey", "conditions", "action"] + }, + "required": ["event", "fieldKey", "conditions", "action"], + "properties": { + "event": { + "$id": "#/definitions/form-variable/depends-on/trigger", + "title": "Event", + "type": "string", + "description": "Event that triggers when the dependencies for the form fields should be evaluated.", + "enum": ["onFormInit", "onFormChanged"] + }, + "fieldKey": { + "$id": "#/definitions/form-variable/depends-on/field-key", + "title": "Field key", + "type": "string", + "description": "Key for the dependee form field", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "action": { + "$id": "#/definitions/form-variable/depends-on/action", + "title": "Action", + "type": "string", + "enum": ["hideField"], + "description": "Action to be taken when your defined conditions evaluates to true" + }, + "conditions": { + "$id": "#/definitions/form-variable/depends-on/conditions", + "title": "Conditions", + "type": "array", + "description": "Conditional configurations to be evaluated to decide whether an action should taken for the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": ["operator", "value"] + }, + "required": ["operator", "value"], + "properties": { + "operator": { + "$id": "#/definitions/form-variable/depends-on/conditions/operator", + "title": "Operator", + "type": "string", + "description": "Name of the operator for evaluating a condition.", + "enum": [ + "lessThan", + "lessThanOrEqualTo", + "greaterThan", + "greaterThanOrEqualTo", + "equalTo", + "notEqual", + "contains", + "startsWith", + "endsWith" + ] + }, + "value": { + "$id": "#/definitions/form-variable/depends-on/conditions/value", + "title": "Value", + "type": "string", + "maxLength": 250, + "description": "Target value that conditions are evaluated against" + } + } + } + } + } + } } }, "required": ["key", "name", "type", "description"] From a3b6bced799291bbdc7851f242d0b91952876514 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 20 Jun 2022 20:00:08 -0500 Subject: [PATCH 554/936] Run pre-commit --- integrations/appoptics/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/appoptics/README.md b/integrations/appoptics/README.md index ae913484..b6492d4c 100644 --- a/integrations/appoptics/README.md +++ b/integrations/appoptics/README.md @@ -4,4 +4,4 @@ API documentation for this integration is available on the AppOptics API documen ## Getting started with the AppOptics integration -Run `npm run curl appoptics` in the root repository directory to generate a `curl` command to send data to AppOptics. \ No newline at end of file +Run `npm run curl appoptics` in the root repository directory to generate a `curl` command to send data to AppOptics. From 2245c13428915d715a89b7fc7960ae65afe8871b Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 22 Jun 2022 20:12:07 -0500 Subject: [PATCH 555/936] Updated field names and added isHidden prop to allow hiding a field by default and showing them only when a condition is true --- manifest.schema.d.ts | 19 ++-- manifest.schema.json | 192 +++++++++++++++++++++++---------------- schemas/definitions.json | 45 ++++++--- 3 files changed, 159 insertions(+), 97 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index b1b2a6d8..9384e4b9 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -208,6 +208,10 @@ export type IsThisVariableASecret = boolean; * Variables marked as optional won't be required on the UI */ export type IsThisVariableOptional = boolean; +/** + * Variables marked as hidden won't be displayed on the UI + */ +export type IsThisVariableHidden = boolean; /** * Default value for variable. Can be overridden by the user in the UI */ @@ -249,17 +253,17 @@ export type Label = string; */ export type Value1 = string; /** - * Event that triggers when the dependencies for the form fields should be evaluated. + * Key for the form variable that this form field depends on */ -export type Event = "onFormInit" | "onFormChanged"; +export type VariableKey = string; /** - * Key for the dependee form field + * Which form variable type is the variable key defined or located in? */ -export type FieldKey = string; +export type VariableLocation = "flagFormVariables" | "environmentFormVariables" | "formVariables"; /** * Action to be taken when your defined conditions evaluates to true */ -export type Action = "hideField"; +export type Action = "hideField" | "showField"; /** * Name of the operator for evaluating a condition. */ @@ -289,8 +293,8 @@ export type Conditions = { * Dependency configuration to control the state and visibility of the form field. */ export type DependsOn = { - event: Event; - fieldKey: FieldKey; + variableKey: VariableKey; + variableLocation: VariableLocation; action: Action; conditions: Conditions; [k: string]: unknown; @@ -586,6 +590,7 @@ export interface FormVariable { placeholder?: Description1; isSecret?: IsThisVariableASecret; isOptional?: IsThisVariableOptional; + isHidden?: IsThisVariableHidden; defaultValue?: DefaultValue; allowedValues?: AllowedValues; dynamicOptions?: DynamicOptions; diff --git a/manifest.schema.json b/manifest.schema.json index 00af6ab6..a14559b2 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -282,6 +282,7 @@ "description", "placeholder", "isSecret", + "isHidden", "isOptional", "defaultValue", "allowedValues", @@ -346,6 +347,13 @@ "description": "Variables marked as optional won't be required on the UI", "default": false }, + "isHidden": { + "$id": "#/definitions/form-variable/is-hidden", + "title": "Is this variable hidden?", + "type": "boolean", + "description": "Variables marked as hidden won't be displayed on the UI", + "default": false + }, "defaultValue": { "$id": "#/definitions/form-variable/default-value", "title": "Default value", @@ -536,43 +544,45 @@ "type": "object", "propertyNames": { "enum": [ - "event", - "fieldKey", + "variableKey", + "variableLocation", "conditions", "action" ] }, "required": [ - "event", - "fieldKey", + "variableKey", + "variableLocation", "conditions", "action" ], "properties": { - "event": { - "$id": "#/definitions/form-variable/depends-on/trigger", - "title": "Event", + "variableKey": { + "$id": "#/definitions/form-variable/depends-on/dependee-key", + "title": "Variable key", "type": "string", - "description": "Event that triggers when the dependencies for the form fields should be evaluated.", - "enum": [ - "onFormInit", - "onFormChanged" - ] - }, - "fieldKey": { - "$id": "#/definitions/form-variable/depends-on/field-key", - "title": "Field key", - "type": "string", - "description": "Key for the dependee form field", + "description": "Key for the form variable that this form field depends on", "maxLength": 20, "pattern": "^[^\\s]*$" }, + "variableLocation": { + "$id": "#/definitions/form-variable/depends-on/dependee-key-location", + "title": "Variable Location", + "type": "string", + "description": "Which form variable type is the variable key defined or located in?", + "enum": [ + "flagFormVariables", + "environmentFormVariables", + "formVariables" + ] + }, "action": { "$id": "#/definitions/form-variable/depends-on/action", "title": "Action", "type": "string", "enum": [ - "hideField" + "hideField", + "showField" ], "description": "Action to be taken when your defined conditions evaluates to true" }, @@ -1274,6 +1284,7 @@ "description", "placeholder", "isSecret", + "isHidden", "isOptional", "defaultValue", "allowedValues", @@ -1338,6 +1349,13 @@ "description": "Variables marked as optional won't be required on the UI", "default": false }, + "isHidden": { + "$id": "#/definitions/form-variable/is-hidden", + "title": "Is this variable hidden?", + "type": "boolean", + "description": "Variables marked as hidden won't be displayed on the UI", + "default": false + }, "defaultValue": { "$id": "#/definitions/form-variable/default-value", "title": "Default value", @@ -1528,43 +1546,45 @@ "type": "object", "propertyNames": { "enum": [ - "event", - "fieldKey", + "variableKey", + "variableLocation", "conditions", "action" ] }, "required": [ - "event", - "fieldKey", + "variableKey", + "variableLocation", "conditions", "action" ], "properties": { - "event": { - "$id": "#/definitions/form-variable/depends-on/trigger", - "title": "Event", + "variableKey": { + "$id": "#/definitions/form-variable/depends-on/dependee-key", + "title": "Variable key", "type": "string", - "description": "Event that triggers when the dependencies for the form fields should be evaluated.", - "enum": [ - "onFormInit", - "onFormChanged" - ] - }, - "fieldKey": { - "$id": "#/definitions/form-variable/depends-on/field-key", - "title": "Field key", - "type": "string", - "description": "Key for the dependee form field", + "description": "Key for the form variable that this form field depends on", "maxLength": 20, "pattern": "^[^\\s]*$" }, + "variableLocation": { + "$id": "#/definitions/form-variable/depends-on/dependee-key-location", + "title": "Variable Location", + "type": "string", + "description": "Which form variable type is the variable key defined or located in?", + "enum": [ + "flagFormVariables", + "environmentFormVariables", + "formVariables" + ] + }, "action": { "$id": "#/definitions/form-variable/depends-on/action", "title": "Action", "type": "string", "enum": [ - "hideField" + "hideField", + "showField" ], "description": "Action to be taken when your defined conditions evaluates to true" }, @@ -1644,6 +1664,7 @@ "description", "placeholder", "isSecret", + "isHidden", "isOptional", "defaultValue", "allowedValues", @@ -1708,6 +1729,13 @@ "description": "Variables marked as optional won't be required on the UI", "default": false }, + "isHidden": { + "$id": "#/definitions/form-variable/is-hidden", + "title": "Is this variable hidden?", + "type": "boolean", + "description": "Variables marked as hidden won't be displayed on the UI", + "default": false + }, "defaultValue": { "$id": "#/definitions/form-variable/default-value", "title": "Default value", @@ -1898,43 +1926,45 @@ "type": "object", "propertyNames": { "enum": [ - "event", - "fieldKey", + "variableKey", + "variableLocation", "conditions", "action" ] }, "required": [ - "event", - "fieldKey", + "variableKey", + "variableLocation", "conditions", "action" ], "properties": { - "event": { - "$id": "#/definitions/form-variable/depends-on/trigger", - "title": "Event", + "variableKey": { + "$id": "#/definitions/form-variable/depends-on/dependee-key", + "title": "Variable key", "type": "string", - "description": "Event that triggers when the dependencies for the form fields should be evaluated.", - "enum": [ - "onFormInit", - "onFormChanged" - ] - }, - "fieldKey": { - "$id": "#/definitions/form-variable/depends-on/field-key", - "title": "Field key", - "type": "string", - "description": "Key for the dependee form field", + "description": "Key for the form variable that this form field depends on", "maxLength": 20, "pattern": "^[^\\s]*$" }, + "variableLocation": { + "$id": "#/definitions/form-variable/depends-on/dependee-key-location", + "title": "Variable Location", + "type": "string", + "description": "Which form variable type is the variable key defined or located in?", + "enum": [ + "flagFormVariables", + "environmentFormVariables", + "formVariables" + ] + }, "action": { "$id": "#/definitions/form-variable/depends-on/action", "title": "Action", "type": "string", "enum": [ - "hideField" + "hideField", + "showField" ], "description": "Action to be taken when your defined conditions evaluates to true" }, @@ -2732,6 +2762,7 @@ "description", "placeholder", "isSecret", + "isHidden", "isOptional", "defaultValue", "allowedValues", @@ -2796,6 +2827,13 @@ "description": "Variables marked as optional won't be required on the UI", "default": false }, + "isHidden": { + "$id": "#/definitions/form-variable/is-hidden", + "title": "Is this variable hidden?", + "type": "boolean", + "description": "Variables marked as hidden won't be displayed on the UI", + "default": false + }, "defaultValue": { "$id": "#/definitions/form-variable/default-value", "title": "Default value", @@ -2986,43 +3024,45 @@ "type": "object", "propertyNames": { "enum": [ - "event", - "fieldKey", + "variableKey", + "variableLocation", "conditions", "action" ] }, "required": [ - "event", - "fieldKey", + "variableKey", + "variableLocation", "conditions", "action" ], "properties": { - "event": { - "$id": "#/definitions/form-variable/depends-on/trigger", - "title": "Event", + "variableKey": { + "$id": "#/definitions/form-variable/depends-on/dependee-key", + "title": "Variable key", "type": "string", - "description": "Event that triggers when the dependencies for the form fields should be evaluated.", - "enum": [ - "onFormInit", - "onFormChanged" - ] - }, - "fieldKey": { - "$id": "#/definitions/form-variable/depends-on/field-key", - "title": "Field key", - "type": "string", - "description": "Key for the dependee form field", + "description": "Key for the form variable that this form field depends on", "maxLength": 20, "pattern": "^[^\\s]*$" }, + "variableLocation": { + "$id": "#/definitions/form-variable/depends-on/dependee-key-location", + "title": "Variable Location", + "type": "string", + "description": "Which form variable type is the variable key defined or located in?", + "enum": [ + "flagFormVariables", + "environmentFormVariables", + "formVariables" + ] + }, "action": { "$id": "#/definitions/form-variable/depends-on/action", "title": "Action", "type": "string", "enum": [ - "hideField" + "hideField", + "showField" ], "description": "Action to be taken when your defined conditions evaluates to true" }, diff --git a/schemas/definitions.json b/schemas/definitions.json index 19e0aff1..75e2520a 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -113,6 +113,7 @@ "description", "placeholder", "isSecret", + "isHidden", "isOptional", "defaultValue", "allowedValues", @@ -170,6 +171,13 @@ "description": "Variables marked as optional won't be required on the UI", "default": false }, + "isHidden": { + "$id": "#/definitions/form-variable/is-hidden", + "title": "Is this variable hidden?", + "type": "boolean", + "description": "Variables marked as hidden won't be displayed on the UI", + "default": false + }, "defaultValue": { "$id": "#/definitions/form-variable/default-value", "title": "Default value", @@ -248,30 +256,39 @@ "items": { "type": "object", "propertyNames": { - "enum": ["event", "fieldKey", "conditions", "action"] + "enum": ["variableKey", "variableLocation", "conditions", "action"] }, - "required": ["event", "fieldKey", "conditions", "action"], + "required": [ + "variableKey", + "variableLocation", + "conditions", + "action" + ], "properties": { - "event": { - "$id": "#/definitions/form-variable/depends-on/trigger", - "title": "Event", + "variableKey": { + "$id": "#/definitions/form-variable/depends-on/dependee-key", + "title": "Variable key", "type": "string", - "description": "Event that triggers when the dependencies for the form fields should be evaluated.", - "enum": ["onFormInit", "onFormChanged"] - }, - "fieldKey": { - "$id": "#/definitions/form-variable/depends-on/field-key", - "title": "Field key", - "type": "string", - "description": "Key for the dependee form field", + "description": "Key for the form variable that this form field depends on", "maxLength": 20, "pattern": "^[^\\s]*$" }, + "variableLocation": { + "$id": "#/definitions/form-variable/depends-on/dependee-key-location", + "title": "Variable Location", + "type": "string", + "description": "Which form variable type is the variable key defined or located in?", + "enum": [ + "flagFormVariables", + "environmentFormVariables", + "formVariables" + ] + }, "action": { "$id": "#/definitions/form-variable/depends-on/action", "title": "Action", "type": "string", - "enum": ["hideField"], + "enum": ["hideField", "showField"], "description": "Action to be taken when your defined conditions evaluates to true" }, "conditions": { From b3b1f5740e12a520643f974aeaa341abc0baecb6 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 22 Jun 2022 20:14:23 -0500 Subject: [PATCH 556/936] Corrected doc for isHidden field --- manifest.schema.d.ts | 4 ++-- manifest.schema.json | 8 ++++---- schemas/definitions.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 9384e4b9..7bd301ea 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -211,7 +211,7 @@ export type IsThisVariableOptional = boolean; /** * Variables marked as hidden won't be displayed on the UI */ -export type IsThisVariableHidden = boolean; +export type HideVariableInTheUI = boolean; /** * Default value for variable. Can be overridden by the user in the UI */ @@ -590,7 +590,7 @@ export interface FormVariable { placeholder?: Description1; isSecret?: IsThisVariableASecret; isOptional?: IsThisVariableOptional; - isHidden?: IsThisVariableHidden; + isHidden?: HideVariableInTheUI; defaultValue?: DefaultValue; allowedValues?: AllowedValues; dynamicOptions?: DynamicOptions; diff --git a/manifest.schema.json b/manifest.schema.json index a14559b2..601a1253 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -349,7 +349,7 @@ }, "isHidden": { "$id": "#/definitions/form-variable/is-hidden", - "title": "Is this variable hidden?", + "title": "Hide variable in the UI", "type": "boolean", "description": "Variables marked as hidden won't be displayed on the UI", "default": false @@ -1351,7 +1351,7 @@ }, "isHidden": { "$id": "#/definitions/form-variable/is-hidden", - "title": "Is this variable hidden?", + "title": "Hide variable in the UI", "type": "boolean", "description": "Variables marked as hidden won't be displayed on the UI", "default": false @@ -1731,7 +1731,7 @@ }, "isHidden": { "$id": "#/definitions/form-variable/is-hidden", - "title": "Is this variable hidden?", + "title": "Hide variable in the UI", "type": "boolean", "description": "Variables marked as hidden won't be displayed on the UI", "default": false @@ -2829,7 +2829,7 @@ }, "isHidden": { "$id": "#/definitions/form-variable/is-hidden", - "title": "Is this variable hidden?", + "title": "Hide variable in the UI", "type": "boolean", "description": "Variables marked as hidden won't be displayed on the UI", "default": false diff --git a/schemas/definitions.json b/schemas/definitions.json index 75e2520a..ff344c5a 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -173,7 +173,7 @@ }, "isHidden": { "$id": "#/definitions/form-variable/is-hidden", - "title": "Is this variable hidden?", + "title": "Hide variable in the UI", "type": "boolean", "description": "Variables marked as hidden won't be displayed on the UI", "default": false From a2f6e3e2e00db6ce42448d4dbf23a41a46ffab54 Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Fri, 24 Jun 2022 14:17:34 -0700 Subject: [PATCH 557/936] Updates readme and manifest --- integrations/elastic/README.md | 10 ++++++---- integrations/elastic/manifest.json | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/integrations/elastic/README.md b/integrations/elastic/README.md index 96b0831a..9a68fe4a 100644 --- a/integrations/elastic/README.md +++ b/integrations/elastic/README.md @@ -1,9 +1,11 @@ -# The Elastic (ELK) Stack Integration +# The Elastic (ELK) Stack integration -[User documentation](https://docs.launchdarkly.com/integrations/elastic-stack) +Documentation for this integration is available on the LaunchDarkly documentation site: [ELK Stack](https://docs.launchdarkly.com/integrations/elastic-stack) -[API documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) +API documentation for this integration is available on the Elastic documentation site: [Elastic Search](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) -[Elastic Create API Key Documentation](https://www.elastic.co/guide/en/elasticsearch/reference/7.6/security-api-create-api-key.html) +Documentation about creating API keys is available on the Elastic documentation site: [Elastic Create API key documentation](https://www.elastic.co/guide/en/elasticsearch/reference/7.6/security-api-create-api-key.html) + +## Getting started with the ELK Stack integration Run `npm run curl elastic` in the root repository directory to generate a `curl` command to send data to your Elastic cluster. diff --git a/integrations/elastic/manifest.json b/integrations/elastic/manifest.json index dbd6609e..c5a97aba 100644 --- a/integrations/elastic/manifest.json +++ b/integrations/elastic/manifest.json @@ -19,7 +19,7 @@ { "key": "url", "name": "Elasticsearch endpoint URL", - "description": "Enter the URL for your Elasticsearch endpoint including socket", + "description": "Enter the URL for your Elasticsearch endpoint, including the socket", "type": "uri", "isSecret": false, "placeholder": "https://cluster.region.aws.found.io:9243", @@ -28,7 +28,7 @@ { "key": "token", "name": "Authentication token", - "description": "Enter the [base64 _credentials_ based on your API Key](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html)", + "description": "Enter the base64 _credentials_ based on your [API Key](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html)", "type": "string", "isSecret": true, "isOptional": false From b95d960fb2e239929ebdb6b86ded268224fc655e Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Fri, 24 Jun 2022 14:20:14 -0700 Subject: [PATCH 558/936] Copyedits readme and manifest --- integrations/generic-trigger/README.md | 4 +++- integrations/generic-trigger/manifest.json | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/integrations/generic-trigger/README.md b/integrations/generic-trigger/README.md index ec669a56..50534944 100644 --- a/integrations/generic-trigger/README.md +++ b/integrations/generic-trigger/README.md @@ -1,3 +1,5 @@ # Generic trigger -This integration allows for *any* tool with outbound webhook capabilities to utilize LaunchDarkly's triggers functionality. See https://docs.launchdarkly.com/home/feature-workflows/triggers#creating-a-new-flag-trigger for more information. +This integration allows *any* tool with outbound webhook capabilities to use LaunchDarkly's flag triggers feature. + +To learn more, read [Creating a new flag trigger](https://docs.launchdarkly.com/home/feature-workflows/triggers#creating-a-new-flag-trigger). diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json index c94237fe..f3d80881 100644 --- a/integrations/generic-trigger/manifest.json +++ b/integrations/generic-trigger/manifest.json @@ -3,7 +3,7 @@ "version": "1.0.0", "overview": "Remotely trigger flag changes using a unique webhook URL.", "description": "Remotely trigger flag changes using a unique webhook URL.", - "details": "Triggers let you remotely execute flag changes, and generic triggers can be set up to work with any service that fires a webhook. Use a generic trigger from scripts, in-house tools, and monitoring or tracker services to turn flags on or off directly from your application.", + "details": "Triggers let you remotely execute flag changes. You can set up generic triggers to work with any service that fires a webhook. Use a generic trigger from scripts, in-house tools, and monitoring or tracker services to turn flags on or off directly from your application.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From ccf3de9053953784dbd267878c7c5c8c29a3a15f Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 24 Jun 2022 17:59:10 -0500 Subject: [PATCH 559/936] Added additional ServiceNow fields to allow customer to send additional info as part of their approval requests in SNow --- integrations/servicenow-normal/manifest.json | 62 +++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/integrations/servicenow-normal/manifest.json b/integrations/servicenow-normal/manifest.json index d4d7cf9f..14e3c4b3 100644 --- a/integrations/servicenow-normal/manifest.json +++ b/integrations/servicenow-normal/manifest.json @@ -22,6 +22,50 @@ "capabilities": { "approval": { "name": "ServiceNow (Normal Change Request)", + "flagFormVariables": [ + { + "key": "configurationItem", + "name": "Configuration Item", + "description": "System id of the configuration item associated with the change request.", + "isHidden": true, + "isOptional": true, + "type": "string", + "dependsOn": [ + { + "variableKey": "configItemFlag", + "variableLocation": "environmentFormVariables", + "action": "showField", + "conditions": [ + { + "operator": "equalTo", + "value": "true" + } + ] + } + ] + }, + { + "key": "implementationPlan", + "name": "Implementation Plan", + "description": "Sequential steps to execute to implement this change.", + "isHidden": true, + "isOptional": true, + "type": "string", + "dependsOn": [ + { + "variableKey": "implPlanFlag", + "variableLocation": "environmentFormVariables", + "action": "showField", + "conditions": [ + { + "operator": "equalTo", + "value": "true" + } + ] + } + ] + } + ], "environmentFormVariables": [ { "key": "detail_column", @@ -31,6 +75,22 @@ "defaultValue": "justification", "isOptional": true, "placeholder": "justification" + }, + { + "key": "configItemFlag", + "name": "Configuration Item", + "description": "Request configuration item in approval requests.", + "type": "boolean", + "defaultValue": "false", + "isOptional": true + }, + { + "key": "implPlanFlag", + "name": "Implementation Plan", + "description": "Request implementation plan in approval requests.", + "type": "boolean", + "defaultValue": "false", + "isOptional": true } ], "creationRequest": { @@ -44,7 +104,7 @@ } ] }, - "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\"}", + "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", {{#if flagFormVariables.implementationPlan}}\"implementation_plan\": \"{{{flagFormVariables.implementationPlan}}}\",{{/if}} {{#if flagFormVariables.configurationItem}}\"cmdb_ci\": \"{{{flagFormVariables.configurationItem}}}\",{{/if}} \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\"}", "parser": { "approvalId": "/result/sys_id/value", "statusValue": "/result/state/value", From 306bb056166e7ff38ae886c7c8a95f362f464421 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 29 Jun 2022 16:07:08 -0500 Subject: [PATCH 560/936] Added deliveryMethod prop to audit logs capability definition and updated template for cloudtrail manifest --- integrations/cloudtrail/manifest.json | 11 +---------- integrations/cloudtrail/templates/default.json.hbs | 5 ++++- manifest.schema.d.ts | 7 ++++++- manifest.schema.json | 13 +++++++++++-- schemas/capabilities/auditLogEventsHook.json | 12 ++++++++++-- 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 28991ef8..407bf906 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -47,16 +47,7 @@ "actions": ["*"] } ], - "endpoint": { - "method": "POST", - "url": "https://www.example.com", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - } - ] - }, + "deliveryMethod": "custom", "templates": { "default": "templates/default.json.hbs" } diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index d345deae..764043e8 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -28,7 +28,10 @@ {{#if tags}} "tags": {{tags}}, {{/if}} - "plainText": "{{title.plainText}}" + {{#if auditLog}} + "auditLog": {{{auditLog}}}, + {{/if}} + "plainText": "{{{title.plainText}}}" } }] } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 8467d2e4..bd2a6fa0 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -304,6 +304,10 @@ export type Resources = string[]; * Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI */ export type IncludeErrorResponseBody = boolean; +/** + * Describes how the audit log event will be delivered to the destination. Custom delivery method indicates a custom delivery implementation in LaunchDarkly will be used. + */ +export type DeliveryMethod = "custom"; /** * The reserved custom property's display name. */ @@ -598,10 +602,11 @@ export interface Capabilities { * This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint. */ export interface AuditLogEventsHook { - endpoint: Endpoint; + endpoint?: Endpoint; templates: WebhookBodyTemplate; defaultPolicy?: DefaultPolicy; includeErrorResponseBody?: IncludeErrorResponseBody; + deliveryMethod?: DeliveryMethod; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index acb0a33d..f41c8706 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -562,7 +562,8 @@ "endpoint", "templates", "defaultPolicy", - "includeErrorResponseBody" + "includeErrorResponseBody", + "deliveryMethod" ] }, "properties": { @@ -819,10 +820,18 @@ "type": "boolean", "description": "Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI", "default": false + }, + "deliveryMethod": { + "$id": "#/properties/delivery-method", + "title": "Delivery Method", + "type": "string", + "enum": [ + "custom" + ], + "description": "Describes how the audit log event will be delivered to the destination. Custom delivery method indicates a custom delivery implementation in LaunchDarkly will be used." } }, "required": [ - "endpoint", "templates" ] }, diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index 4c716496..ed521f97 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -10,7 +10,8 @@ "endpoint", "templates", "defaultPolicy", - "includeErrorResponseBody" + "includeErrorResponseBody", + "deliveryMethod" ] }, "properties": { @@ -158,8 +159,15 @@ "type": "boolean", "description": "Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI", "default": false + }, + "deliveryMethod": { + "$id": "#/properties/delivery-method", + "title": "Delivery Method", + "type": "string", + "enum": ["custom"], + "description": "Describes how the audit log event will be delivered to the destination. Custom delivery method indicates a custom delivery implementation in LaunchDarkly will be used." } }, - "required": ["endpoint", "templates"] + "required": ["templates"] } } From d7fb37736c980a734223d21b16b42c5da8ee2208 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 29 Jun 2022 16:08:38 -0500 Subject: [PATCH 561/936] Set the cloudtrail integration as hidden until its ready for test --- integrations/cloudtrail/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 407bf906..cf877143 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -5,6 +5,7 @@ "description": "Export LaunchDarkly audit events to AWS CloudTrail via Open Audit Events.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", + "hideOnIntegrationsPage": true, "links": { "site": "https://aws.amazon.com/cloudtrail/", "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/more", From 4318ea57d6aad9ec14db978bdde2900364c94cb7 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 6 Jul 2022 10:08:08 -0500 Subject: [PATCH 562/936] Removed hideFromIntegrationPage prop and control visible with flag --- integrations/cloudtrail/manifest.json | 1 - 1 file changed, 1 deletion(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index cf877143..407bf906 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -5,7 +5,6 @@ "description": "Export LaunchDarkly audit events to AWS CloudTrail via Open Audit Events.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", - "hideOnIntegrationsPage": true, "links": { "site": "https://aws.amazon.com/cloudtrail/", "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/more", From a2a8d426b59197a05d7bc2a95c78c174b9ee4fdc Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 6 Jul 2022 22:09:52 +0100 Subject: [PATCH 563/936] Add more fields to Zapier manifest --- .../zapier/templates/default.json.hbs | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/integrations/zapier/templates/default.json.hbs b/integrations/zapier/templates/default.json.hbs index 5a0e9de3..c124d8ec 100644 --- a/integrations/zapier/templates/default.json.hbs +++ b/integrations/zapier/templates/default.json.hbs @@ -1,6 +1,25 @@ { - "name": "{{name}}", + "name": "{{{name}}}", "key": "{{key}}", - "user": "{{member.email}}", - "message": "{{title.plainText}}" + "kind": "{{kind}}", + "member": { + "email": "{{{member.email}}}", + "name": "{{{member.displayName}}}" + }, + "message": { + "plainText": "{{{title.plainText}}}", + "markdown": "{{{title.markdown}}}" + }, + "details": { + "plainText": "{{{details.plainText}}}", + "markdown": "{{{details.markdown}}}" + }, + "comment": "{{#if comment}}{{{comment}}}{{/if}}", + "links": { + "site": "{{{_links.site.href}}}", + "details": "{{{_links.details.href}}}" + }, + "timestamp": { + "milliseconds": {{{timestamp.milliseconds}}} + } } From 93ca29bcb3c750e8b23c000e7b6ffc61172307b3 Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Thu, 7 Jul 2022 16:15:57 -0700 Subject: [PATCH 564/936] Copyedits readme and manifest --- integrations/honeycomb/README.md | 25 ++++++++++++++++++------- integrations/honeycomb/manifest.json | 2 +- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/integrations/honeycomb/README.md b/integrations/honeycomb/README.md index 97393205..55c4ac58 100644 --- a/integrations/honeycomb/README.md +++ b/integrations/honeycomb/README.md @@ -1,21 +1,32 @@ # Honeycomb -[User documentation](https://docs.launchdarkly.com/integrations/honeycomb) +Documentation for this integration is available on the LaunchDarkly documentation site: [Honeycomb](https://docs.launchdarkly.com/integrations/honeycomb) -[API documentation](https://docs.honeycomb.io/api/markers/) +API documentation for this integration is available on the Honeycomb documentation site: [Markers API](https://docs.honeycomb.io/api/markers/) + +## Getting started with the Honeycomb integration Run `npm run curl honeycomb` in the root repository directory to generate a `curl` command to send data to Honeycomb. -### Triggers +### Using flag triggers with Honeycomb. + +You can configure triggers/webhooks for your Honeycomb account. To learn more, read the [Honeycomb documentation](https://docs.honeycomb.io/working-with-your-data/triggers/). + +To test a webhook integration: + +1. Navigate to the Honeycomb Integration Center: `https://ui.honeycomb.io/teams//integrations`. +2. Create a new 'Webhook' type integration. You need to enter a shared secret to create the webhook, but it does not affect the request. +3. Choose the 'Test' option. -Please consult the [Honeycomb documentation](https://docs.honeycomb.io/working-with-your-data/triggers/) to configure webhooks/triggers from your Honeycomb account. +Next, test the trigger: -To test, go to the Honeycomb Integration Center at https://ui.honeycomb.io/teams//integrations and create a new integration of type 'Webhook'. You need to enter a shared secret to create the webhook but it will not affect the request. There is the option to 'Test' at this point. +1. Navigate to the 'Triggers' tab. +2. Add the integration you just created as a recipient on any one of the triggers. +3. Save the integration and choose the 'Test' option. -To make sure it works on the trigger itself, you'll have to go to the 'Triggers' tab and add the integration you just created as a recipient on any one of the triggers (all the way at the bottom). Once saved, there should also be the option to 'Test' at this point. +Here is an example payload: -A sample payload looks like this: ``` { "version":"v0.1.0", diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index a1cf20f0..6a8f3ab7 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -19,7 +19,7 @@ { "key": "datasetName", "name": "Honeycomb dataset name", - "description": "Enter the name of your Honeycomb dataset. This value will associate LaunchDarkly data with the corresponding Honeycomb dataset.", + "description": "Enter the name of your Honeycomb dataset. This associates LaunchDarkly data with the corresponding Honeycomb dataset.", "type": "string", "placeholder": "production", "isSecret": false From dd676bbce6e3cd67471884e40ccb2a66e0a42ec5 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 8 Jul 2022 13:11:16 -0500 Subject: [PATCH 565/936] Used unescapeJSONstring helper to unescape audit log string into json object to be ingested into AWS cloudtrail --- .../cloudtrail/templates/default.json.hbs | 67 +++++++++---------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index 764043e8..36be1964 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -1,37 +1,34 @@ { - "id": "{{_id}}", - "eventData": [{ - "eventVersion": "0.1", - "userIdentity": { - "type": "user", - "principalId": "{{member._id}}", - "details": { - "email": "{{member.email}}", - "firstName": "{{member.firstName}}", - "lastName": "{{member.lastName}}" - } - }, - "eventTime": "{{timestamp.rfc3339}}", - "eventSource": "LaunchDarkly", - "eventName": "{{kind}}", - "recipientAccountId": "{{formVariables.accountId}}", - "UUID": "{{_id}}", - "additionalEventData": { - "type": "{{verbKind}}", - "targetId": "{{target._id}}", - {{#if project}} - "projectKey": "{{project.key}}", - {{/if}} - {{#if project.environment}} - "environmentKey": "{{project.environment.key}}", - {{/if}} - {{#if tags}} - "tags": {{tags}}, - {{/if}} - {{#if auditLog}} - "auditLog": {{{auditLog}}}, - {{/if}} - "plainText": "{{{title.plainText}}}" - } - }] + "eventVersion": "0.1", + "userIdentity": { + "type": "user", + "principalId": "{{member._id}}", + "details": { + "email": "{{member.email}}", + "firstName": "{{member.firstName}}", + "lastName": "{{member.lastName}}" + } + }, + "eventTime": "{{timestamp.rfc3339}}", + "eventSource": "LaunchDarkly", + "eventName": "{{kind}}", + "recipientAccountId": "{{formVariables.accountId}}", + "UUID": "{{_id}}", + "additionalEventData": { + "type": "{{verbKind}}", + "targetId": "{{target._id}}", + {{#if project}} + "projectKey": "{{project.key}}", + {{/if}} + {{#if project.environment}} + "environmentKey": "{{project.environment.key}}", + {{/if}} + {{#if tags}} + "tags": {{tags}}, + {{/if}} + {{#if auditLog}} + "auditLog": {{{unescapeJSONString auditLog}}}, + {{/if}} + "plainText": "{{{title.plainText}}}" + } } From 7247b6d4705a218d8fce9698b0dd963611af445e Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 8 Jul 2022 14:05:27 -0500 Subject: [PATCH 566/936] Removed audit log from request body for beta release --- integrations/cloudtrail/templates/default.json.hbs | 3 --- 1 file changed, 3 deletions(-) diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index 36be1964..1f827dbe 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -26,9 +26,6 @@ {{#if tags}} "tags": {{tags}}, {{/if}} - {{#if auditLog}} - "auditLog": {{{unescapeJSONString auditLog}}}, - {{/if}} "plainText": "{{{title.plainText}}}" } } From ea3d716a030f1b5511cf46dcce72646dae2e3536 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 11 Jul 2022 09:27:11 -0500 Subject: [PATCH 567/936] Updated default cloudtrail policy to prevent UI validation errors when creating a cloudtrail subscription --- integrations/cloudtrail/manifest.json | 2 +- integrations/cloudtrail/templates/default.json.hbs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 407bf906..dc60912b 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -43,7 +43,7 @@ "defaultPolicy": [ { "effect": "allow", - "resources": ["*"], + "resources": ["proj/*:env/production:flag/*"], "actions": ["*"] } ], diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index 1f827dbe..0c9a09ca 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -20,6 +20,9 @@ {{#if project}} "projectKey": "{{project.key}}", {{/if}} + {{#if _links.details.href}} + "deepLink": "{{_links.details.href}}", + {{/if}} {{#if project.environment}} "environmentKey": "{{project.environment.key}}", {{/if}} From a199028546bfe6687ee0929b9122610be574c4c3 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 11 Jul 2022 19:34:24 +0100 Subject: [PATCH 568/936] Add new horizontal zapier logo (#379) --- integrations/zapier/assets/images/horizontal.svg | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/integrations/zapier/assets/images/horizontal.svg b/integrations/zapier/assets/images/horizontal.svg index 00f530b9..54cef0cb 100644 --- a/integrations/zapier/assets/images/horizontal.svg +++ b/integrations/zapier/assets/images/horizontal.svg @@ -1 +1,10 @@ -zapier-logo + + + + + + + + + + From ec4de4a6148f937086d1298092f86a5243e7e296 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 11 Jul 2022 18:52:18 -0500 Subject: [PATCH 569/936] Added validation support cloudtrail integration --- integrations/cloudtrail/manifest.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index dc60912b..64f2cb2b 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -49,7 +49,8 @@ ], "deliveryMethod": "custom", "templates": { - "default": "templates/default.json.hbs" + "default": "templates/default.json.hbs", + "validation": "templates/default.json.hbs" } } } From 60d6ae9d7a0c8c190d3cee2b1eebfe5bc86d824a Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 13 Jul 2022 09:17:30 -0500 Subject: [PATCH 570/936] Enabled error response body for cloudtrail integration errors --- __tests__/validateIntegrationManifests.js | 14 +++++++------- integrations/cloudtrail/manifest.json | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index ab0e6f2e..cbaf1788 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -171,13 +171,13 @@ describe('All integrations', () => { 'capabilities.auditLogEventsHook.includeErrorResponseBody', null ); - if (includeErrorResponseBody) { - // if there is no host domain replacement in the `endpoint` field then we are fine - const endpointUrlTemplate = _.get( - manifest, - 'capabilities.auditLogEventsHook.endpoint.url', - null - ); + // if there is no host domain replacement in the `endpoint` field then we are fine + const endpointUrlTemplate = _.get( + manifest, + 'capabilities.auditLogEventsHook.endpoint.url', + null + ); + if (endpointUrlTemplate && includeErrorResponseBody) { if (endpointUrlTemplate.startsWith('{{')) { const varName = endpointUrlTemplate.substring( 2, diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 64f2cb2b..1ab1421e 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -40,6 +40,7 @@ ], "capabilities": { "auditLogEventsHook": { + "includeErrorResponseBody": true, "defaultPolicy": [ { "effect": "allow", From b3bb87047097424870a1bf93fca8af33bf0646cd Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Thu, 14 Jul 2022 09:06:47 -0400 Subject: [PATCH 571/936] [sc-159613] basic scaffolding for integration (#376) * basic scaffolding for integration * lint fixes --- package-lock.json | 2844 +++++++++++++++++++++--- package.json | 1 + plopfile.js | 61 + template/integration/manifest.json.hbs | 24 + 4 files changed, 2674 insertions(+), 256 deletions(-) create mode 100644 plopfile.js create mode 100644 template/integration/manifest.json.hbs diff --git a/package-lock.json b/package-lock.json index 78b639b8..9200c598 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "dateformat": "^4.5.1", + "plop": "^3.1.1", "url-parse": "^1.5.9" }, "devDependencies": { @@ -778,6 +779,38 @@ "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", @@ -846,6 +879,11 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/fined": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/fined/-/fined-1.1.3.tgz", + "integrity": "sha512-CWYnSRnun3CGbt6taXeVo2lCbuaj4mchVJ4UF/BdU5TSuIn3AmS13pGMwCsBUoehGbhZrBrpNJZSZI5EVilXww==" + }, "node_modules/@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -865,6 +903,15 @@ "@types/node": "*" } }, + "node_modules/@types/inquirer": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.1.tgz", + "integrity": "sha512-wKW3SKIUMmltbykg4I5JzCVzUhkuD9trD6efAmYgN2MrSntY0SMRQzEnD3mkyJ/rv9NLbTC7g3hKKE86YwEDLw==", + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -895,6 +942,15 @@ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, + "node_modules/@types/liftoff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-Ny/PJkO6nxWAQnaet8q/oWz15lrfwvdvBpuY4treB0CSsBO1CG0fVuNLngR3m3bepQLd+E4c3Y3DlC2okpUvPw==", + "dependencies": { + "@types/fined": "*", + "@types/node": "*" + } + }, "node_modules/@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -904,8 +960,7 @@ "node_modules/@types/node": { "version": "14.14.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", - "dev": true + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.0", @@ -925,6 +980,14 @@ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, + "node_modules/@types/through": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", + "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yargs": { "version": "15.0.12", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", @@ -989,6 +1052,18 @@ "node": ">= 6.0.0" } }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1009,7 +1084,6 @@ "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, "dependencies": { "type-fest": "^0.11.0" }, @@ -1024,7 +1098,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1033,7 +1106,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1099,6 +1171,30 @@ "node": ">=0.10.0" } }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -1230,8 +1326,7 @@ "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "node_modules/base": { "version": "0.11.2", @@ -1263,11 +1358,39 @@ "node": ">=0.10.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", + "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1277,7 +1400,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -1300,6 +1422,29 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1341,6 +1486,15 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -1350,6 +1504,16 @@ "node": ">=6" } }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", @@ -1378,6 +1542,25 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -1387,6 +1570,11 @@ "node": ">=10" } }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -1497,6 +1685,14 @@ "node": ">=0.10.0" } }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, "node_modules/cli-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", @@ -1520,6 +1716,36 @@ "node": ">=0.10.0" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "engines": { + "node": ">= 10" + } + }, "node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -1531,6 +1757,14 @@ "wrap-ansi": "^6.2.0" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -1564,7 +1798,6 @@ "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, "dependencies": { "color-name": "~1.1.4" }, @@ -1575,8 +1808,7 @@ "node_modules/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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -1599,8 +1831,17 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } }, "node_modules/convert-source-map": { "version": "1.7.0", @@ -1746,6 +1987,14 @@ "node": ">=0.10.0" } }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "dependencies": { + "clone": "^1.0.2" + } + }, "node_modules/define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -1759,6 +2008,46 @@ "node": ">=0.10.0" } }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1768,6 +2057,14 @@ "node": ">=0.4.0" } }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -1786,6 +2083,17 @@ "node": ">= 10.14.2" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -1807,6 +2115,15 @@ "node": ">=8" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", @@ -1822,8 +2139,7 @@ "node_modules/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 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -2134,6 +2450,17 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/expect": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", @@ -2166,6 +2493,11 @@ "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", "dev": true }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -2179,6 +2511,19 @@ "node": ">=0.10.0" } }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -2237,6 +2582,21 @@ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/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", @@ -2249,6 +2609,14 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -2258,11 +2626,32 @@ "bser": "2.1.1" } }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/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, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2283,11 +2672,66 @@ "node": ">=8" } }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flagged-respawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dependencies": { + "for-in": "^1.0.1" + }, "engines": { "node": ">=0.10.0" } @@ -2321,8 +2765,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.2.1", @@ -2341,8 +2784,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -2399,7 +2841,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2415,6 +2856,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/glob-promise": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", @@ -2430,20 +2882,87 @@ "glob": "*" } }, - "node_modules/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, - "engines": { - "node": ">=4" + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "node_modules/growly": { "version": "1.3.0", @@ -2456,7 +2975,6 @@ "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -2477,7 +2995,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -2489,7 +3006,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -2557,6 +3073,26 @@ "node": ">=0.10.0" } }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -2621,7 +3157,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -2629,6 +3164,33 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" + } + }, "node_modules/import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", @@ -2654,11 +3216,18 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2667,8 +3236,177 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/inquirer/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/is-accessor-descriptor": { "version": "1.0.0", @@ -2707,10 +3445,9 @@ } }, "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dependencies": { "has": "^1.0.3" }, @@ -2776,7 +3513,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2785,7 +3521,6 @@ "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, "engines": { "node": ">=8" } @@ -2800,10 +3535,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2811,15 +3545,41 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/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, "engines": { "node": ">=0.12.0" } }, + "node_modules/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2844,6 +3604,17 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -2859,11 +3630,32 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", + "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -2887,17 +3679,26 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3235,18 +4036,6 @@ "node": ">=10.12.0" } }, - "node_modules/jest-junit/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-leak-detector": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", @@ -3717,18 +4506,6 @@ "node": ">=10.0.0" } }, - "node_modules/json-schema-to-typescript/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3769,7 +4546,6 @@ "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, "engines": { "node": ">=0.10.0" } @@ -3805,6 +4581,32 @@ "node": ">= 0.8.0" } }, + "node_modules/liftoff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/liftoff/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -3826,8 +4628,46 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } }, "node_modules/lru-cache": { "version": "6.0.0", @@ -3874,6 +4714,17 @@ "semver": "bin/semver.js" } }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -3887,7 +4738,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3926,17 +4776,24 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, "node_modules/mime-db": { @@ -3964,7 +4821,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } @@ -3973,7 +4829,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3984,8 +4839,7 @@ "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/mixin-deep": { "version": "1.3.2", @@ -4000,12 +4854,28 @@ "node": ">=0.10.0" } }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/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 }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -4048,8 +4918,7 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/next-tick": { "version": "1.0.0", @@ -4063,6 +4932,15 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -4106,7 +4984,30 @@ "semver": "bin/semver.js" }, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/node-plop": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.31.0.tgz", + "integrity": "sha512-aKLPxiBoFTNUovvtK8j/Whc4PZREkYx6htw2HJPiU8wYquXmN8pkd9B3xlFo6AJ4ZlzFsQSf/NXR5xET8EqRYw==", + "dependencies": { + "@types/inquirer": "^8.2.1", + "change-case": "^4.1.2", + "del": "^6.0.0", + "globby": "^13.1.1", + "handlebars": "^4.4.3", + "inquirer": "^8.2.2", + "isbinaryfile": "^4.0.8", + "lodash.get": "^4.4.2", + "lower-case": "^2.0.2", + "mkdirp": "^1.0.4", + "resolve": "^1.20.0", + "title-case": "^3.0.3", + "upper-case": "^2.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/normalize-package-data": { @@ -4254,11 +5155,36 @@ "node": ">=0.10.0" } }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -4270,7 +5196,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -4279,7 +5204,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -4307,6 +5231,101 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", + "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "dependencies": { + "bl": "^5.0.0", + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/p-each-series": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", @@ -4355,6 +5374,20 @@ "node": ">=8" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -4364,6 +5397,28 @@ "node": ">=6" } }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/parse-json": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", @@ -4382,12 +5437,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", @@ -4397,6 +5469,15 @@ "node": ">=0.10.0" } }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4410,7 +5491,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4427,14 +5507,39 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -4466,6 +5571,38 @@ "node": ">=8" } }, + "node_modules/plop": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plop/-/plop-3.1.1.tgz", + "integrity": "sha512-NuctKmuNUACXBQn25bBr5oj/75nHxdKGwjA/+b7cVoj1sp+gTVqcc8eAr4QcNJgMPsZWRJBN2kMkgmsqbqV9gg==", + "dependencies": { + "@types/liftoff": "^4.0.0", + "chalk": "^5.0.1", + "interpret": "^2.2.0", + "liftoff": "^4.0.0", + "minimist": "^1.2.6", + "node-plop": "^0.31.0", + "ora": "^6.0.1", + "v8flags": "^4.0.0" + }, + "bin": { + "plop": "bin/plop.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/plop/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -4554,6 +5691,25 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/react-is": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", @@ -4610,6 +5766,30 @@ "node": ">=8" } }, + "node_modules/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -4668,13 +5848,16 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4692,6 +5875,18 @@ "node": ">=8" } }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -4708,6 +5903,18 @@ "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -4717,11 +5924,19 @@ "node": ">=0.12" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -4741,6 +5956,44 @@ "node": "6.* || >= 7.*" } }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -4759,8 +6012,7 @@ "node_modules/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==" }, "node_modules/sane": { "version": "4.1.0", @@ -5068,6 +6320,16 @@ "semver": "bin/semver" } }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -5141,8 +6403,7 @@ "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -5154,11 +6415,19 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -5360,7 +6629,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5558,6 +6826,33 @@ "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", "dev": true }, + "node_modules/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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -5575,7 +6870,6 @@ "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, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5589,7 +6883,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5628,7 +6921,6 @@ "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, "dependencies": { "has-flag": "^4.0.0" }, @@ -5649,6 +6941,17 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -5712,6 +7015,11 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, "node_modules/timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -5722,6 +7030,25 @@ "next-tick": "1" } }, + "node_modules/title-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", + "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -5780,7 +7107,6 @@ "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, "dependencies": { "is-number": "^7.0.0" }, @@ -5814,6 +7140,11 @@ "node": ">=8" } }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -5845,7 +7176,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true, "engines": { "node": ">=8" }, @@ -5866,7 +7196,6 @@ "version": "3.13.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", "integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", - "dev": true, "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -5875,6 +7204,14 @@ "node": ">=0.8.0" } }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -5956,6 +7293,22 @@ "node": ">=0.10.0" } }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -5990,6 +7343,11 @@ "node": ">=0.10.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -6022,6 +7380,14 @@ "node": ">= 8" } }, + "node_modules/v8flags": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.0.tgz", + "integrity": "sha512-83N0OkTbn6gOjJ2awNuzuK4czeGxwEwBoTqlhBZhnp8o0IJ72mXRQKphj/azwRf3acbDJZYZhbOPEJHd884ELg==", + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/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", @@ -6062,6 +7428,14 @@ "makeerror": "1.0.x" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -6133,8 +7507,7 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "node_modules/wrap-ansi": { "version": "6.2.0", @@ -6153,8 +7526,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -6898,6 +8270,29 @@ "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@sinonjs/commons": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", @@ -6963,6 +8358,11 @@ "@babel/types": "^7.3.0" } }, + "@types/fined": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/fined/-/fined-1.1.3.tgz", + "integrity": "sha512-CWYnSRnun3CGbt6taXeVo2lCbuaj4mchVJ4UF/BdU5TSuIn3AmS13pGMwCsBUoehGbhZrBrpNJZSZI5EVilXww==" + }, "@types/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", @@ -6982,6 +8382,15 @@ "@types/node": "*" } }, + "@types/inquirer": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.1.tgz", + "integrity": "sha512-wKW3SKIUMmltbykg4I5JzCVzUhkuD9trD6efAmYgN2MrSntY0SMRQzEnD3mkyJ/rv9NLbTC7g3hKKE86YwEDLw==", + "requires": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -7012,6 +8421,15 @@ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, + "@types/liftoff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-Ny/PJkO6nxWAQnaet8q/oWz15lrfwvdvBpuY4treB0CSsBO1CG0fVuNLngR3m3bepQLd+E4c3Y3DlC2okpUvPw==", + "requires": { + "@types/fined": "*", + "@types/node": "*" + } + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -7021,8 +8439,7 @@ "@types/node": { "version": "14.14.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", - "dev": true + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -7042,6 +8459,14 @@ "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, + "@types/through": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", + "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "requires": { + "@types/node": "*" + } + }, "@types/yargs": { "version": "15.0.12", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", @@ -7094,6 +8519,15 @@ "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==", + "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", @@ -7110,7 +8544,6 @@ "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" } @@ -7118,14 +8551,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "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" } @@ -7173,6 +8604,21 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==" + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -7271,8 +8717,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -7300,11 +8745,25 @@ } } }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bl": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", + "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", + "requires": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7314,7 +8773,6 @@ "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" } @@ -7334,6 +8792,15 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -7369,12 +8836,31 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", @@ -7394,12 +8880,36 @@ "supports-color": "^7.1.0" } }, + "change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "requires": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "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", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -7492,6 +9002,11 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, "cli-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", @@ -7514,6 +9029,24 @@ } } }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" + }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -7525,6 +9058,11 @@ "wrap-ansi": "^6.2.0" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -7551,7 +9089,6 @@ "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" } @@ -7559,8 +9096,7 @@ "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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "combined-stream": { "version": "1.0.8", @@ -7580,8 +9116,17 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } }, "convert-source-map": { "version": "1.7.0", @@ -7697,6 +9242,14 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "requires": { + "clone": "^1.0.2" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -7707,12 +9260,47 @@ "isobject": "^3.0.1" } }, + "del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "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" + }, + "dependencies": { + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + } + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -7725,6 +9313,14 @@ "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", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -7742,6 +9338,15 @@ } } }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", @@ -7751,8 +9356,7 @@ "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 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "end-of-stream": { "version": "1.4.4", @@ -8005,6 +9609,14 @@ } } }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, "expect": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", @@ -8036,6 +9648,11 @@ } } }, + "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", @@ -8046,6 +9663,16 @@ "is-extendable": "^1.0.1" } }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -8094,6 +9721,18 @@ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "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", @@ -8106,6 +9745,14 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -8115,11 +9762,25 @@ "bser": "2.1.1" } }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + } + } + }, "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" } @@ -8134,11 +9795,53 @@ "path-exists": "^4.0.0" } }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0", + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + } + } + }, + "flagged-respawn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "requires": { + "for-in": "^1.0.1" + } }, "form-data": { "version": "3.0.1", @@ -8163,8 +9866,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.2.1", @@ -8176,8 +9878,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "gensync": { "version": "1.0.0-beta.2", @@ -8216,7 +9917,6 @@ "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", "inflight": "^1.0.4", @@ -8226,6 +9926,14 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, "glob-promise": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", @@ -8235,17 +9943,67 @@ "@types/glob": "*" } }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "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==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "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 }, + "globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "dependencies": { + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + } + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "growly": { "version": "1.3.0", @@ -8258,7 +10016,6 @@ "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, "requires": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -8271,7 +10028,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -8279,8 +10035,7 @@ "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 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "has-value": { "version": "1.0.0", @@ -8334,6 +10089,23 @@ } } }, + "header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "requires": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -8386,11 +10158,20 @@ "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.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + }, "import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", @@ -8407,11 +10188,15 @@ "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", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -8420,8 +10205,123 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } }, "is-accessor-descriptor": { "version": "1.0.0", @@ -8454,10 +10354,9 @@ } }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "requires": { "has": "^1.0.3" } @@ -8501,14 +10400,12 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "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 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-fn": { "version": "2.1.0", @@ -8517,19 +10414,32 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, + "is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==" + }, "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 + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "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==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" }, "is-plain-object": { "version": "2.0.4", @@ -8552,6 +10462,14 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -8564,11 +10482,23 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-unicode-supported": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", + "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==" + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-wsl": { "version": "2.2.0", @@ -8586,17 +10516,20 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "istanbul-lib-coverage": { "version": "3.0.0", @@ -8858,14 +10791,6 @@ "strip-ansi": "^6.0.1", "uuid": "^8.3.2", "xml": "^1.0.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } } }, "jest-leak-detector": { @@ -9239,14 +11164,6 @@ "mz": "^2.7.0", "prettier": "^2.2.0", "stdin": "0.0.1" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } } }, "json-schema-traverse": { @@ -9279,8 +11196,7 @@ "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 + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "kleur": { "version": "3.0.3", @@ -9304,6 +11220,28 @@ "type-check": "~0.3.2" } }, + "liftoff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", + "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "object.map": "^1.0.1", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + } + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -9322,8 +11260,36 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "requires": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "dependencies": { + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" + } + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } }, "lru-cache": { "version": "6.0.0", @@ -9360,6 +11326,14 @@ } } }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -9372,8 +11346,7 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "map-visit": { "version": "1.0.0", @@ -9406,14 +11379,18 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime-db": { @@ -9434,14 +11411,12 @@ "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 + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -9449,8 +11424,7 @@ "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "mixin-deep": { "version": "1.3.2", @@ -9462,12 +11436,22 @@ "is-extendable": "^1.0.1" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, "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 }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -9507,8 +11491,7 @@ "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "next-tick": { "version": "1.0.0", @@ -9522,6 +11505,15 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -9561,6 +11553,26 @@ } } }, + "node-plop": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.31.0.tgz", + "integrity": "sha512-aKLPxiBoFTNUovvtK8j/Whc4PZREkYx6htw2HJPiU8wYquXmN8pkd9B3xlFo6AJ4ZlzFsQSf/NXR5xET8EqRYw==", + "requires": { + "@types/inquirer": "^8.2.1", + "change-case": "^4.1.2", + "del": "^6.0.0", + "globby": "^13.1.1", + "handlebars": "^4.4.3", + "inquirer": "^8.2.2", + "isbinaryfile": "^4.0.8", + "lodash.get": "^4.4.2", + "lower-case": "^2.0.2", + "mkdirp": "^1.0.4", + "resolve": "^1.20.0", + "title-case": "^3.0.3", + "upper-case": "^2.0.2" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -9677,11 +11689,30 @@ "isobject": "^3.0.0" } }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, "requires": { "isobject": "^3.0.1" } @@ -9690,7 +11721,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -9699,7 +11729,6 @@ "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" } @@ -9718,6 +11747,64 @@ "word-wrap": "~1.2.3" } }, + "ora": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", + "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "requires": { + "bl": "^5.0.0", + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" + }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, "p-each-series": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", @@ -9748,12 +11835,39 @@ "p-limit": "^2.2.0" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, "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 }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, "parse-json": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", @@ -9766,18 +11880,41 @@ "lines-and-columns": "^1.1.6" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" + }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9787,8 +11924,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -9799,14 +11935,30 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pirates": { "version": "4.0.1", @@ -9826,6 +11978,28 @@ "find-up": "^4.0.0" } }, + "plop": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plop/-/plop-3.1.1.tgz", + "integrity": "sha512-NuctKmuNUACXBQn25bBr5oj/75nHxdKGwjA/+b7cVoj1sp+gTVqcc8eAr4QcNJgMPsZWRJBN2kMkgmsqbqV9gg==", + "requires": { + "@types/liftoff": "^4.0.0", + "chalk": "^5.0.1", + "interpret": "^2.2.0", + "liftoff": "^4.0.0", + "minimist": "^1.2.6", + "node-plop": "^0.31.0", + "ora": "^6.0.1", + "v8flags": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" + } + } + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -9893,6 +12067,11 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, "react-is": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", @@ -9938,6 +12117,24 @@ } } }, + "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==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -9984,13 +12181,13 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { @@ -10002,6 +12199,15 @@ "resolve-from": "^5.0.0" } }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -10014,17 +12220,30 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.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 }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "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" } @@ -10035,6 +12254,27 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", "dev": true }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "requires": { + "tslib": "^2.1.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -10053,8 +12293,7 @@ "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==" }, "sane": { "version": "4.1.0", @@ -10300,6 +12539,16 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, + "sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -10360,8 +12609,7 @@ "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "sisteransi": { "version": "1.0.5", @@ -10372,8 +12620,16 @@ "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } }, "snapdragon": { "version": "0.8.2", @@ -10540,8 +12796,7 @@ "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 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { "version": "0.5.3", @@ -10712,6 +12967,21 @@ "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", "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==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "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==" + } + } + }, "string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -10726,7 +12996,6 @@ "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", @@ -10737,7 +13006,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -10764,7 +13032,6 @@ "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" } @@ -10779,6 +13046,11 @@ "supports-color": "^7.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -10830,6 +13102,11 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, "timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", @@ -10840,6 +13117,22 @@ "next-tick": "1" } }, + "title-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", + "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "requires": { + "tslib": "^2.0.3" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -10888,7 +13181,6 @@ "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" } @@ -10913,6 +13205,11 @@ "punycode": "^2.1.1" } }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -10937,8 +13234,7 @@ "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 + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" }, "typedarray-to-buffer": { "version": "3.1.5", @@ -10953,9 +13249,13 @@ "version": "3.13.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", "integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", - "dev": true, "optional": true }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -11022,6 +13322,22 @@ } } }, + "upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "requires": { + "tslib": "^2.0.3" + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -11052,6 +13368,11 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -11077,6 +13398,11 @@ } } }, + "v8flags": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.0.tgz", + "integrity": "sha512-83N0OkTbn6gOjJ2awNuzuK4czeGxwEwBoTqlhBZhnp8o0IJ72mXRQKphj/azwRf3acbDJZYZhbOPEJHd884ELg==" + }, "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", @@ -11114,6 +13440,14 @@ "makeerror": "1.0.x" } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "requires": { + "defaults": "^1.0.3" + } + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -11170,8 +13504,7 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "wrap-ansi": { "version": "6.2.0", @@ -11187,8 +13520,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "3.0.3", diff --git a/package.json b/package.json index ca6fe4da..a3f463fa 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "json-schema-to-typescript": "^10.0.0", "jsonpointer": "^5.0.0", "lodash": "^4.17.21", + "plop": "^3.1.1", "prettier": "^2.0.1" }, "dependencies": { diff --git a/plopfile.js b/plopfile.js new file mode 100644 index 00000000..bd6baeac --- /dev/null +++ b/plopfile.js @@ -0,0 +1,61 @@ +module.exports = function (plop) { + plop.setGenerator('integration', { + description: 'add a new integration to integration framework', + + // inquirer prompts + prompts: [ + { + type: 'input', + name: 'name', + message: 'Company or Integration name:', + }, + { + type: 'input', + name: 'website', + message: 'Company URL:', + }, + { + type: 'input', + name: 'supportEmail', + message: 'Support Email Address:', + }, + { + type: 'input', + name: 'author', + message: 'Author, can be company or individual:', + }, + { + type: 'input', + name: 'overview', + message: + 'Quick overview of the integration. (minimum 10 characters). Longer description will be asked next:', + }, + { + type: 'input', + name: 'description', + message: + 'In-depth description of the integration when user clicks on? Minimum 50 characters:', + }, + ], + + // actions to perform + actions: [ + { + type: 'add', + path: 'integrations/{{dashCase name}}/manifest.json', + templateFile: 'template/integration/manifest.json.hbs', + }, + { + type: 'add', + path: 'integrations/{{dashCase name}}/assets/horizontal.svg', + }, + { + type: 'add', + path: 'integrations/{{dashCase name}}/assets/square.svg', + }, + 'Congratulations! You have created a new LaunchDarkly integration.', + "Don't forget, any lines in the manifest.json with $FIX_ME will need to be manually updated in the manifest.", + 'The empty files in under your new directory `/assets` should be replaced with SVGs of the logo.', + ], + }); +}; diff --git a/template/integration/manifest.json.hbs b/template/integration/manifest.json.hbs new file mode 100644 index 00000000..968bb460 --- /dev/null +++ b/template/integration/manifest.json.hbs @@ -0,0 +1,24 @@ +{ + "name": "{{ sentenceCase name }}", + "version": "1.0.0", + "overview": "{{ overview }}", + "description": "{{ description }}", + "author": "{{ author }}", + "supportEmail": "{{ supportEmail }}", + "links": { + "site": "{{ website }}", + "launchdarklyDocs": "$FIX_ME", + "privacyPolicy": "$FIX_ME" + }, + "categories": ["$FIX_ME"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + "$FIX_ME, see integrations/sample-integration/manifest.json for examples. If this is a Learn More card only, please delete the entire `formVariable` section." + ], + "capabilities": { + "$FIX_ME, see integrations/sample-integration/manifest.json for examples. If this is a Learn More card only, please delete the entire `capabilities` section." + } +} From debc2486359a5934a44e8e3e91d237d4b663a7ab Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 14 Jul 2022 15:39:36 +0100 Subject: [PATCH 572/936] rename some fields to account for new schema, remove PII from userDetails (#382) --- integrations/cloudtrail/templates/default.json.hbs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index 0c9a09ca..24f130f6 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -1,19 +1,14 @@ { - "eventVersion": "0.1", + "version": "1.0", "userIdentity": { "type": "user", - "principalId": "{{member._id}}", - "details": { - "email": "{{member.email}}", - "firstName": "{{member.firstName}}", - "lastName": "{{member.lastName}}" - } + "principalId": "{{member._id}}" }, "eventTime": "{{timestamp.rfc3339}}", "eventSource": "LaunchDarkly", "eventName": "{{kind}}", "recipientAccountId": "{{formVariables.accountId}}", - "UUID": "{{_id}}", + "UID": "{{_id}}", "additionalEventData": { "type": "{{verbKind}}", "targetId": "{{target._id}}", From 8f5c2afc1d4037fbb60bbea47700e5a1836bbbee Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 15 Jul 2022 14:16:20 +0100 Subject: [PATCH 573/936] undo changes until we can clarify with aws (#383) --- integrations/cloudtrail/templates/default.json.hbs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index 24f130f6..f6b7c622 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -1,5 +1,5 @@ { - "version": "1.0", + "eventVersion": "1.0", "userIdentity": { "type": "user", "principalId": "{{member._id}}" @@ -8,7 +8,7 @@ "eventSource": "LaunchDarkly", "eventName": "{{kind}}", "recipientAccountId": "{{formVariables.accountId}}", - "UID": "{{_id}}", + "UUID": "{{_id}}", "additionalEventData": { "type": "{{verbKind}}", "targetId": "{{target._id}}", From 2059c5f8f3dd4b03e4d6228c4f485196c37aee72 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 27 Jul 2022 11:43:26 +0100 Subject: [PATCH 574/936] remove all PII from cloudtrail templating (#384) --- integrations/cloudtrail/manifest.json | 1 + .../cloudtrail/templates/default.json.hbs | 2 +- .../cloudtrail/templates/member.json.hbs | 29 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 integrations/cloudtrail/templates/member.json.hbs diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 1ab1421e..d8b7da0b 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -51,6 +51,7 @@ "deliveryMethod": "custom", "templates": { "default": "templates/default.json.hbs", + "member": "templates/member.json.hbs", "validation": "templates/default.json.hbs" } } diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index f6b7c622..a9cc9cb9 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -24,6 +24,6 @@ {{#if tags}} "tags": {{tags}}, {{/if}} - "plainText": "{{{title.plainText}}}" + "plainText": "A member {{titleVerb}} {{#if target.name}} {{{target.name}}} {{else}} {{{target._id}}}{{/if}}" } } diff --git a/integrations/cloudtrail/templates/member.json.hbs b/integrations/cloudtrail/templates/member.json.hbs new file mode 100644 index 00000000..ae95f780 --- /dev/null +++ b/integrations/cloudtrail/templates/member.json.hbs @@ -0,0 +1,29 @@ +{ + "eventVersion": "1.0", + "userIdentity": { + "type": "user", + "principalId": "{{member._id}}" + }, + "eventTime": "{{timestamp.rfc3339}}", + "eventSource": "LaunchDarkly", + "eventName": "{{kind}}", + "recipientAccountId": "{{formVariables.accountId}}", + "UUID": "{{_id}}", + "additionalEventData": { + "type": "{{verbKind}}", + "targetId": "{{target._id}}", + {{#if project}} + "projectKey": "{{project.key}}", + {{/if}} + {{#if _links.details.href}} + "deepLink": "{{_links.details.href}}", + {{/if}} + {{#if project.environment}} + "environmentKey": "{{project.environment.key}}", + {{/if}} + {{#if tags}} + "tags": {{tags}}, + {{/if}} + "plainText": "Member {{member._id}} {{{titleVerb}}} {{{target._id}}}" + } +} From 578fda856e57143e86188a3ff5eff0c1587e651c Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 1 Aug 2022 14:57:43 +0100 Subject: [PATCH 575/936] run npm install (#385) --- package-lock.json | 602 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 488 insertions(+), 114 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9200c598..b947c9a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,6 @@ "license": "ISC", "dependencies": { "dateformat": "^4.5.1", - "plop": "^3.1.1", "url-parse": "^1.5.9" }, "devDependencies": { @@ -23,6 +22,7 @@ "json-schema-to-typescript": "^10.0.0", "jsonpointer": "^5.0.0", "lodash": "^4.17.21", + "plop": "^3.1.1", "prettier": "^2.0.1" } }, @@ -783,6 +783,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -795,6 +796,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } @@ -803,6 +805,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -882,7 +885,8 @@ "node_modules/@types/fined": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@types/fined/-/fined-1.1.3.tgz", - "integrity": "sha512-CWYnSRnun3CGbt6taXeVo2lCbuaj4mchVJ4UF/BdU5TSuIn3AmS13pGMwCsBUoehGbhZrBrpNJZSZI5EVilXww==" + "integrity": "sha512-CWYnSRnun3CGbt6taXeVo2lCbuaj4mchVJ4UF/BdU5TSuIn3AmS13pGMwCsBUoehGbhZrBrpNJZSZI5EVilXww==", + "dev": true }, "node_modules/@types/glob": { "version": "7.1.3", @@ -907,6 +911,7 @@ "version": "8.2.1", "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.1.tgz", "integrity": "sha512-wKW3SKIUMmltbykg4I5JzCVzUhkuD9trD6efAmYgN2MrSntY0SMRQzEnD3mkyJ/rv9NLbTC7g3hKKE86YwEDLw==", + "dev": true, "dependencies": { "@types/through": "*", "rxjs": "^7.2.0" @@ -946,6 +951,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/liftoff/-/liftoff-4.0.0.tgz", "integrity": "sha512-Ny/PJkO6nxWAQnaet8q/oWz15lrfwvdvBpuY4treB0CSsBO1CG0fVuNLngR3m3bepQLd+E4c3Y3DlC2okpUvPw==", + "dev": true, "dependencies": { "@types/fined": "*", "@types/node": "*" @@ -960,7 +966,8 @@ "node_modules/@types/node": { "version": "14.14.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", + "dev": true }, "node_modules/@types/normalize-package-data": { "version": "2.4.0", @@ -984,6 +991,7 @@ "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -1056,6 +1064,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -1084,6 +1093,7 @@ "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, "dependencies": { "type-fest": "^0.11.0" }, @@ -1098,6 +1108,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -1106,6 +1117,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1175,6 +1187,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -1183,6 +1196,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -1191,6 +1205,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "engines": { "node": ">=8" } @@ -1326,7 +1341,8 @@ "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "node_modules/base": { "version": "0.11.2", @@ -1362,6 +1378,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -1381,6 +1398,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", + "dev": true, "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", @@ -1391,6 +1409,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1400,6 +1419,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -1426,6 +1446,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, "funding": [ { "type": "github", @@ -1490,6 +1511,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -1508,6 +1530,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -1546,6 +1569,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, "dependencies": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", @@ -1573,7 +1597,8 @@ "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, "node_modules/ci-info": { "version": "2.0.0", @@ -1689,6 +1714,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, "engines": { "node": ">=6" } @@ -1720,6 +1746,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -1731,6 +1758,7 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, "engines": { "node": ">=6" }, @@ -1742,6 +1770,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, "engines": { "node": ">= 10" } @@ -1761,6 +1790,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, "engines": { "node": ">=0.8" } @@ -1798,6 +1828,7 @@ "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, "dependencies": { "color-name": "~1.1.4" }, @@ -1808,7 +1839,8 @@ "node_modules/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==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -1831,12 +1863,14 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "node_modules/constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -1991,6 +2025,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "dev": true, "dependencies": { "clone": "^1.0.2" } @@ -2012,6 +2047,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dev": true, "dependencies": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", @@ -2033,6 +2069,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -2061,6 +2098,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2087,6 +2125,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -2119,6 +2158,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -2139,7 +2179,8 @@ "node_modules/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==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -2454,6 +2495,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, "dependencies": { "homedir-polyfill": "^1.0.1" }, @@ -2496,7 +2538,8 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/extend-shallow": { "version": "3.0.2", @@ -2515,6 +2558,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -2586,6 +2630,7 @@ "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2613,6 +2658,7 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -2630,6 +2676,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -2644,6 +2691,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -2652,6 +2700,7 @@ "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, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2676,6 +2725,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, "dependencies": { "detect-file": "^1.0.0", "is-glob": "^4.0.3", @@ -2690,6 +2740,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "dev": true, "dependencies": { "expand-tilde": "^2.0.2", "is-plain-object": "^5.0.0", @@ -2705,6 +2756,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2713,6 +2765,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", + "dev": true, "engines": { "node": ">= 10.13.0" } @@ -2721,6 +2774,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2729,6 +2783,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, "dependencies": { "for-in": "^1.0.1" }, @@ -2765,7 +2820,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "node_modules/fsevents": { "version": "2.2.1", @@ -2784,7 +2840,8 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -2841,6 +2898,7 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2860,6 +2918,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -2886,6 +2945,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -2899,6 +2959,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -2914,6 +2975,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -2934,6 +2996,7 @@ "version": "13.1.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dev": true, "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -2952,6 +3015,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, "engines": { "node": ">=12" }, @@ -2962,7 +3026,8 @@ "node_modules/graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true }, "node_modules/growly": { "version": "1.3.0", @@ -2975,6 +3040,7 @@ "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -2995,6 +3061,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -3006,6 +3073,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3077,6 +3145,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, "dependencies": { "capital-case": "^1.0.4", "tslib": "^2.0.3" @@ -3086,6 +3155,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, "dependencies": { "parse-passwd": "^1.0.0" }, @@ -3157,6 +3227,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -3168,6 +3239,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -3187,6 +3259,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, "engines": { "node": ">= 4" } @@ -3220,6 +3293,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, "engines": { "node": ">=8" } @@ -3228,6 +3302,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3236,17 +3311,20 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "node_modules/inquirer": { "version": "8.2.4", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -3272,6 +3350,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3282,6 +3361,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -3305,6 +3385,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3320,6 +3401,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, "engines": { "node": ">=8" } @@ -3328,6 +3410,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, "engines": { "node": ">=10" }, @@ -3339,6 +3422,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -3354,6 +3438,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -3376,6 +3461,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -3392,6 +3478,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, "engines": { "node": ">= 0.10" } @@ -3400,6 +3487,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, "dependencies": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" @@ -3448,6 +3536,7 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -3513,6 +3602,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3521,6 +3611,7 @@ "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, "engines": { "node": ">=8" } @@ -3538,6 +3629,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -3549,6 +3641,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, "engines": { "node": ">=12" }, @@ -3560,6 +3653,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -3568,6 +3662,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, "engines": { "node": ">=6" } @@ -3576,6 +3671,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3608,6 +3704,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, "dependencies": { "is-unc-path": "^1.0.0" }, @@ -3634,6 +3731,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, "dependencies": { "unc-path-regex": "^0.1.2" }, @@ -3645,6 +3743,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", + "dev": true, "engines": { "node": ">=12" }, @@ -3656,6 +3755,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3683,6 +3783,7 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, "engines": { "node": ">= 8.0.0" }, @@ -3693,12 +3794,14 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4546,6 +4649,7 @@ "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, "engines": { "node": ">=0.10.0" } @@ -4585,6 +4689,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "dev": true, "dependencies": { "extend": "^3.0.2", "findup-sync": "^5.0.0", @@ -4603,6 +4708,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4628,17 +4734,20 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true }, "node_modules/log-symbols": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, "dependencies": { "chalk": "^5.0.0", "is-unicode-supported": "^1.1.0" @@ -4654,6 +4763,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -4665,6 +4775,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -4718,6 +4829,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, "dependencies": { "kind-of": "^6.0.2" }, @@ -4738,6 +4850,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -4780,6 +4893,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { "node": ">= 8" } @@ -4788,6 +4902,7 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -4821,6 +4936,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } @@ -4829,6 +4945,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4839,7 +4956,8 @@ "node_modules/minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "node_modules/mixin-deep": { "version": "1.3.2", @@ -4858,6 +4976,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -4874,7 +4993,8 @@ "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true }, "node_modules/mz": { "version": "2.7.0", @@ -4918,7 +5038,8 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "node_modules/next-tick": { "version": "1.0.0", @@ -4936,6 +5057,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -4991,6 +5113,7 @@ "version": "0.31.0", "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.31.0.tgz", "integrity": "sha512-aKLPxiBoFTNUovvtK8j/Whc4PZREkYx6htw2HJPiU8wYquXmN8pkd9B3xlFo6AJ4ZlzFsQSf/NXR5xET8EqRYw==", + "dev": true, "dependencies": { "@types/inquirer": "^8.2.1", "change-case": "^4.1.2", @@ -5159,6 +5282,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, "dependencies": { "array-each": "^1.0.1", "array-slice": "^1.0.0", @@ -5173,6 +5297,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, "dependencies": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" @@ -5185,6 +5310,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -5196,6 +5322,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "dependencies": { "wrappy": "1" } @@ -5204,6 +5331,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -5235,6 +5363,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "dev": true, "dependencies": { "bl": "^5.0.0", "chalk": "^5.0.0", @@ -5257,6 +5386,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, "engines": { "node": ">=12" }, @@ -5268,6 +5398,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -5279,6 +5410,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, "dependencies": { "restore-cursor": "^4.0.0" }, @@ -5293,6 +5425,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -5308,6 +5441,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -5322,6 +5456,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5378,6 +5513,7 @@ "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, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -5401,6 +5537,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -5410,6 +5547,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", @@ -5441,6 +5579,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5455,6 +5594,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -5473,6 +5613,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -5491,6 +5632,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5507,12 +5649,14 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, "dependencies": { "path-root-regex": "^0.1.0" }, @@ -5524,6 +5668,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5532,6 +5677,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "engines": { "node": ">=8" } @@ -5540,6 +5686,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -5575,6 +5722,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/plop/-/plop-3.1.1.tgz", "integrity": "sha512-NuctKmuNUACXBQn25bBr5oj/75nHxdKGwjA/+b7cVoj1sp+gTVqcc8eAr4QcNJgMPsZWRJBN2kMkgmsqbqV9gg==", + "dev": true, "dependencies": { "@types/liftoff": "^4.0.0", "chalk": "^5.0.1", @@ -5596,6 +5744,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -5695,6 +5844,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -5770,6 +5920,7 @@ "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, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5783,6 +5934,7 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, "dependencies": { "resolve": "^1.20.0" }, @@ -5851,6 +6003,7 @@ "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -5879,6 +6032,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" @@ -5907,6 +6061,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -5928,6 +6083,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -5937,6 +6093,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -5960,6 +6117,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -5968,6 +6126,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -5990,6 +6149,7 @@ "version": "7.5.5", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, "dependencies": { "tslib": "^2.1.0" } @@ -6012,7 +6172,8 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/sane": { "version": "4.1.0", @@ -6324,6 +6485,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -6403,7 +6565,8 @@ "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", @@ -6415,6 +6578,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } @@ -6423,6 +6587,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -6629,6 +6794,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6830,6 +6996,7 @@ "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, "dependencies": { "safe-buffer": "~5.2.0" } @@ -6838,6 +7005,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -6870,6 +7038,7 @@ "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, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6883,6 +7052,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6921,6 +7091,7 @@ "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, "dependencies": { "has-flag": "^4.0.0" }, @@ -6945,6 +7116,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -7018,7 +7190,8 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "node_modules/timers-ext": { "version": "0.1.7", @@ -7034,6 +7207,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -7042,6 +7216,7 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -7107,6 +7282,7 @@ "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, "dependencies": { "is-number": "^7.0.0" }, @@ -7143,7 +7319,8 @@ "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true }, "node_modules/type": { "version": "1.2.0", @@ -7176,6 +7353,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, "engines": { "node": ">=8" }, @@ -7196,6 +7374,7 @@ "version": "3.13.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", "integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", + "dev": true, "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -7208,6 +7387,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -7297,6 +7477,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -7305,6 +7486,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -7346,7 +7528,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/uuid": { "version": "8.3.2", @@ -7384,6 +7567,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.0.tgz", "integrity": "sha512-83N0OkTbn6gOjJ2awNuzuK4czeGxwEwBoTqlhBZhnp8o0IJ72mXRQKphj/azwRf3acbDJZYZhbOPEJHd884ELg==", + "dev": true, "engines": { "node": ">= 10.13.0" } @@ -7432,6 +7616,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, "dependencies": { "defaults": "^1.0.3" } @@ -7507,7 +7692,8 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true }, "node_modules/wrap-ansi": { "version": "6.2.0", @@ -7526,7 +7712,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -8274,6 +8461,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -8282,12 +8470,14 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -8361,7 +8551,8 @@ "@types/fined": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@types/fined/-/fined-1.1.3.tgz", - "integrity": "sha512-CWYnSRnun3CGbt6taXeVo2lCbuaj4mchVJ4UF/BdU5TSuIn3AmS13pGMwCsBUoehGbhZrBrpNJZSZI5EVilXww==" + "integrity": "sha512-CWYnSRnun3CGbt6taXeVo2lCbuaj4mchVJ4UF/BdU5TSuIn3AmS13pGMwCsBUoehGbhZrBrpNJZSZI5EVilXww==", + "dev": true }, "@types/glob": { "version": "7.1.3", @@ -8386,6 +8577,7 @@ "version": "8.2.1", "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.1.tgz", "integrity": "sha512-wKW3SKIUMmltbykg4I5JzCVzUhkuD9trD6efAmYgN2MrSntY0SMRQzEnD3mkyJ/rv9NLbTC7g3hKKE86YwEDLw==", + "dev": true, "requires": { "@types/through": "*", "rxjs": "^7.2.0" @@ -8425,6 +8617,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/liftoff/-/liftoff-4.0.0.tgz", "integrity": "sha512-Ny/PJkO6nxWAQnaet8q/oWz15lrfwvdvBpuY4treB0CSsBO1CG0fVuNLngR3m3bepQLd+E4c3Y3DlC2okpUvPw==", + "dev": true, "requires": { "@types/fined": "*", "@types/node": "*" @@ -8439,7 +8632,8 @@ "@types/node": { "version": "14.14.14", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==" + "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", + "dev": true }, "@types/normalize-package-data": { "version": "2.4.0", @@ -8463,6 +8657,7 @@ "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "dev": true, "requires": { "@types/node": "*" } @@ -8523,6 +8718,7 @@ "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" @@ -8544,6 +8740,7 @@ "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" } @@ -8551,12 +8748,14 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "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==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -8607,17 +8806,20 @@ "array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==" + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true }, "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true }, "array-unique": { "version": "0.3.2", @@ -8717,7 +8919,8 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "base": { "version": "0.11.2", @@ -8748,12 +8951,14 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true }, "bl": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", + "dev": true, "requires": { "buffer": "^6.0.3", "inherits": "^2.0.4", @@ -8764,6 +8969,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8773,6 +8979,7 @@ "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" } @@ -8796,6 +9003,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -8840,6 +9048,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, "requires": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -8855,6 +9064,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -8884,6 +9094,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, "requires": { "camel-case": "^4.1.2", "capital-case": "^1.0.4", @@ -8908,7 +9119,8 @@ "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, "ci-info": { "version": "2.0.0", @@ -9005,7 +9217,8 @@ "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true }, "cli-color": { "version": "2.0.0", @@ -9033,6 +9246,7 @@ "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" } @@ -9040,12 +9254,14 @@ "cli-spinners": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true }, "cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true }, "cliui": { "version": "6.0.0", @@ -9061,7 +9277,8 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true }, "co": { "version": "4.6.0", @@ -9089,6 +9306,7 @@ "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" } @@ -9096,7 +9314,8 @@ "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==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "combined-stream": { "version": "1.0.8", @@ -9116,12 +9335,14 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -9246,6 +9467,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "dev": true, "requires": { "clone": "^1.0.2" } @@ -9264,6 +9486,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dev": true, "requires": { "globby": "^11.0.1", "graceful-fs": "^4.2.4", @@ -9279,6 +9502,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -9299,7 +9523,8 @@ "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==" + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true }, "detect-newline": { "version": "3.1.0", @@ -9317,6 +9542,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "requires": { "path-type": "^4.0.0" } @@ -9342,6 +9568,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -9356,7 +9583,8 @@ "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==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "end-of-stream": { "version": "1.4.4", @@ -9613,6 +9841,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, "requires": { "homedir-polyfill": "^1.0.1" } @@ -9651,7 +9880,8 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extend-shallow": { "version": "3.0.2", @@ -9667,6 +9897,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -9725,6 +9956,7 @@ "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -9749,6 +9981,7 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, "requires": { "reusify": "^1.0.4" } @@ -9766,6 +9999,7 @@ "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" }, @@ -9773,7 +10007,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true } } }, @@ -9781,6 +10016,7 @@ "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" } @@ -9799,6 +10035,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, "requires": { "detect-file": "^1.0.0", "is-glob": "^4.0.3", @@ -9810,6 +10047,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", + "dev": true, "requires": { "expand-tilde": "^2.0.2", "is-plain-object": "^5.0.0", @@ -9821,24 +10059,28 @@ "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true } } }, "flagged-respawn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", - "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==" + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", + "dev": true }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, "requires": { "for-in": "^1.0.1" } @@ -9866,7 +10108,8 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fsevents": { "version": "2.2.1", @@ -9878,7 +10121,8 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, "gensync": { "version": "1.0.0-beta.2", @@ -9917,6 +10161,7 @@ "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", "inflight": "^1.0.4", @@ -9930,6 +10175,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -9947,6 +10193,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, "requires": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -9957,6 +10204,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, "requires": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -9969,6 +10217,7 @@ "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" } @@ -9985,6 +10234,7 @@ "version": "13.1.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dev": true, "requires": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -9996,14 +10246,16 @@ "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true } } }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true }, "growly": { "version": "1.3.0", @@ -10016,6 +10268,7 @@ "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, "requires": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -10028,6 +10281,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -10035,7 +10289,8 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "has-value": { "version": "1.0.0", @@ -10093,6 +10348,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, "requires": { "capital-case": "^1.0.4", "tslib": "^2.0.3" @@ -10102,6 +10358,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, "requires": { "parse-passwd": "^1.0.0" } @@ -10158,6 +10415,7 @@ "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" } @@ -10165,12 +10423,14 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true }, "import-local": { "version": "3.0.2", @@ -10191,12 +10451,14 @@ "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -10205,17 +10467,20 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "inquirer": { "version": "8.2.4", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, "requires": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -10238,6 +10503,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -10248,6 +10514,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -10257,6 +10524,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10265,17 +10533,20 @@ "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, "requires": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -10285,6 +10556,7 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, "requires": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -10301,6 +10573,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -10312,12 +10585,14 @@ "interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, "requires": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" @@ -10357,6 +10632,7 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, "requires": { "has": "^1.0.3" } @@ -10400,12 +10676,14 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "is-generator-fn": { "version": "2.1.0", @@ -10417,6 +10695,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -10424,22 +10703,26 @@ "is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==" + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "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==" + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true }, "is-plain-object": { "version": "2.0.4", @@ -10466,6 +10749,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, "requires": { "is-unc-path": "^1.0.0" } @@ -10486,6 +10770,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, "requires": { "unc-path-regex": "^0.1.2" } @@ -10493,12 +10778,14 @@ "is-unicode-supported": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", - "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==" + "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", + "dev": true }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, "is-wsl": { "version": "2.2.0", @@ -10519,17 +10806,20 @@ "isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==" + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, "istanbul-lib-coverage": { "version": "3.0.0", @@ -11196,7 +11486,8 @@ "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==" + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true }, "kleur": { "version": "3.0.3", @@ -11224,6 +11515,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", + "dev": true, "requires": { "extend": "^3.0.2", "findup-sync": "^5.0.0", @@ -11238,7 +11530,8 @@ "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true } } }, @@ -11260,17 +11553,20 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true }, "log-symbols": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, "requires": { "chalk": "^5.0.0", "is-unicode-supported": "^1.1.0" @@ -11279,7 +11575,8 @@ "chalk": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true } } }, @@ -11287,6 +11584,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, "requires": { "tslib": "^2.0.3" } @@ -11330,6 +11628,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, "requires": { "kind-of": "^6.0.2" } @@ -11346,7 +11645,8 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true }, "map-visit": { "version": "1.0.0", @@ -11382,12 +11682,14 @@ "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -11411,12 +11713,14 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -11424,7 +11728,8 @@ "minimist": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "mixin-deep": { "version": "1.3.2", @@ -11439,7 +11744,8 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "ms": { "version": "2.1.2", @@ -11450,7 +11756,8 @@ "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true }, "mz": { "version": "2.7.0", @@ -11491,7 +11798,8 @@ "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "next-tick": { "version": "1.0.0", @@ -11509,6 +11817,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, "requires": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -11557,6 +11866,7 @@ "version": "0.31.0", "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.31.0.tgz", "integrity": "sha512-aKLPxiBoFTNUovvtK8j/Whc4PZREkYx6htw2HJPiU8wYquXmN8pkd9B3xlFo6AJ4ZlzFsQSf/NXR5xET8EqRYw==", + "dev": true, "requires": { "@types/inquirer": "^8.2.1", "change-case": "^4.1.2", @@ -11693,6 +12003,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, "requires": { "array-each": "^1.0.1", "array-slice": "^1.0.0", @@ -11704,6 +12015,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, "requires": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" @@ -11713,6 +12025,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, "requires": { "isobject": "^3.0.1" } @@ -11721,6 +12034,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -11729,6 +12043,7 @@ "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" } @@ -11751,6 +12066,7 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "dev": true, "requires": { "bl": "^5.0.0", "chalk": "^5.0.0", @@ -11766,17 +12082,20 @@ "ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true }, "chalk": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true }, "cli-cursor": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, "requires": { "restore-cursor": "^4.0.0" } @@ -11785,6 +12104,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -11794,6 +12114,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, "requires": { "ansi-regex": "^6.0.1" } @@ -11803,7 +12124,8 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true }, "p-each-series": { "version": "2.2.0", @@ -11839,6 +12161,7 @@ "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" } @@ -11853,6 +12176,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -11862,6 +12186,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, "requires": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", @@ -11883,7 +12208,8 @@ "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true }, "parse5": { "version": "6.0.1", @@ -11895,6 +12221,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -11910,6 +12237,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -11924,7 +12252,8 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "3.1.1", @@ -11935,12 +12264,14 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, "requires": { "path-root-regex": "^0.1.0" } @@ -11948,17 +12279,20 @@ "path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true }, "pirates": { "version": "4.0.1", @@ -11982,6 +12316,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/plop/-/plop-3.1.1.tgz", "integrity": "sha512-NuctKmuNUACXBQn25bBr5oj/75nHxdKGwjA/+b7cVoj1sp+gTVqcc8eAr4QcNJgMPsZWRJBN2kMkgmsqbqV9gg==", + "dev": true, "requires": { "@types/liftoff": "^4.0.0", "chalk": "^5.0.1", @@ -11996,7 +12331,8 @@ "chalk": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true } } }, @@ -12070,7 +12406,8 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true }, "react-is": { "version": "17.0.1", @@ -12121,6 +12458,7 @@ "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", @@ -12131,6 +12469,7 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, "requires": { "resolve": "^1.20.0" } @@ -12184,6 +12523,7 @@ "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, "requires": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -12203,6 +12543,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, "requires": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" @@ -12224,6 +12565,7 @@ "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" @@ -12238,12 +12580,14 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "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" } @@ -12257,12 +12601,14 @@ "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -12271,6 +12617,7 @@ "version": "7.5.5", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, "requires": { "tslib": "^2.1.0" } @@ -12293,7 +12640,8 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "sane": { "version": "4.1.0", @@ -12543,6 +12891,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3", @@ -12609,7 +12958,8 @@ "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true }, "sisteransi": { "version": "1.0.5", @@ -12620,12 +12970,14 @@ "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, "snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -12796,7 +13148,8 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "source-map-resolve": { "version": "0.5.3", @@ -12971,6 +13324,7 @@ "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" }, @@ -12978,7 +13332,8 @@ "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==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true } } }, @@ -12996,6 +13351,7 @@ "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", @@ -13006,6 +13362,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -13032,6 +13389,7 @@ "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" } @@ -13049,7 +13407,8 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true }, "symbol-tree": { "version": "3.2.4", @@ -13105,7 +13464,8 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "timers-ext": { "version": "0.1.7", @@ -13121,6 +13481,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "dev": true, "requires": { "tslib": "^2.0.3" } @@ -13129,6 +13490,7 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -13181,6 +13543,7 @@ "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" } @@ -13208,7 +13571,8 @@ "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true }, "type": { "version": "1.2.0", @@ -13234,7 +13598,8 @@ "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true }, "typedarray-to-buffer": { "version": "3.1.5", @@ -13249,12 +13614,14 @@ "version": "3.13.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", "integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", + "dev": true, "optional": true }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true }, "union-value": { "version": "1.0.1", @@ -13326,6 +13693,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, "requires": { "tslib": "^2.0.3" } @@ -13334,6 +13702,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, "requires": { "tslib": "^2.0.3" } @@ -13371,7 +13740,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "uuid": { "version": "8.3.2", @@ -13401,7 +13771,8 @@ "v8flags": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.0.tgz", - "integrity": "sha512-83N0OkTbn6gOjJ2awNuzuK4czeGxwEwBoTqlhBZhnp8o0IJ72mXRQKphj/azwRf3acbDJZYZhbOPEJHd884ELg==" + "integrity": "sha512-83N0OkTbn6gOjJ2awNuzuK4czeGxwEwBoTqlhBZhnp8o0IJ72mXRQKphj/azwRf3acbDJZYZhbOPEJHd884ELg==", + "dev": true }, "validate-npm-package-license": { "version": "3.0.4", @@ -13444,6 +13815,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, "requires": { "defaults": "^1.0.3" } @@ -13504,7 +13876,8 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true }, "wrap-ansi": { "version": "6.2.0", @@ -13520,7 +13893,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "write-file-atomic": { "version": "3.0.3", From cb91e456290ae84ce21dfe29429c9545c4ef447b Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 3 Aug 2022 10:59:35 +0100 Subject: [PATCH 576/936] correct readme for new relic insights (#386) --- integrations/new-relic-apm-insights/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/new-relic-apm-insights/README.md b/integrations/new-relic-apm-insights/README.md index 0c289b8b..67bdfc57 100644 --- a/integrations/new-relic-apm-insights/README.md +++ b/integrations/new-relic-apm-insights/README.md @@ -2,10 +2,10 @@ [User documentation](https://docs.launchdarkly.com/integrations/new-relic) -[API documentation](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments) +[API documentation](https://docs.newrelic.com/docs/data-apis/ingest-apis/event-api/introduction-event-api/) -Run `npm run curl new-relic-apm` in the root repository directory to generate a `curl` command to send data to New Relic. +Run `npm run curl new-relic-apm-insights` in the root repository directory to generate a `curl` command to send data to New Relic. Please note that this integration requires a New Relic APM account to function. -You should be able to see all LaunchDarkly flag events on the Deployment page +You should be able to see all LaunchDarkly flag events on the Data Explorer page of your APM console. From 1ba1f04e5f1401fe5930f748f8ccf9a7049f6acd Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Wed, 3 Aug 2022 15:29:24 -0700 Subject: [PATCH 577/936] Copyedits manifest and readme --- integrations/logdna/README.md | 6 ++++-- integrations/logdna/manifest.json | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/integrations/logdna/README.md b/integrations/logdna/README.md index 96944c1a..b8dabe25 100644 --- a/integrations/logdna/README.md +++ b/integrations/logdna/README.md @@ -1,7 +1,9 @@ # LogDNA -[User documentation](https://docs.launchdarkly.com/integrations/logdna) +User documentation for this integration is available on the LaunchDarkly documentation site: [LogDNA](https://docs.launchdarkly.com/integrations/logdna) -[API documentation](https://docs.logdna.com/reference#api) +API documentation for this integration is available on the LogDNA API documentation site: [LogDNA](https://docs.logdna.com/reference#api) + +## Getting started with the LogDNA integration Run `npm run curl logdna` in the root repository directory to generate a `curl` command to send data to LogDNA. diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index 15dfc0fd..fa548fcd 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -2,7 +2,7 @@ "name": "LogDNA", "version": "1.0.0", "overview": "Monitor LaunchDarkly flag events in LogDNA.", - "description": "This integration sends LaunchDarkly audit log events (flag, project, environment changes) to LogDNA.", + "description": "This integration sends LaunchDarkly audit log events, including flag, project, and environment changes, to LogDNA.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { @@ -27,7 +27,7 @@ { "key": "level", "name": "Log level", - "description": "The log level with which LaunchDarkly messages will be published.", + "description": "The level of log messages from LaunchDarkly.", "type": "string", "isSecret": false, "defaultValue": "INFO", From eb9a6998e6b45c1626c7e8e79a7cf7aee7a50fe2 Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Wed, 3 Aug 2022 15:34:37 -0700 Subject: [PATCH 578/936] Updates README --- integrations/msteams/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/msteams/README.md b/integrations/msteams/README.md index fdce1a5c..025599c4 100644 --- a/integrations/msteams/README.md +++ b/integrations/msteams/README.md @@ -1,7 +1,7 @@ # Microsoft Teams -[User documentation](https://example.com) +User documentation for this integration is available on the LaunchDarkly documentation site: [Microsoft Teams](https://docs.launchdarkly.com/integrations/microsoft-teams) -[API documentation](https://example.com) +## Getting started with the MSTeams integration Run `npm run curl msteams` in the root repository directory to generate a `curl` command to send data to Teams. From dcfe8e7e314790341273317ddfa5ecca322583c7 Mon Sep 17 00:00:00 2001 From: Sarah Day Date: Thu, 4 Aug 2022 11:16:35 -0700 Subject: [PATCH 579/936] Update README.md --- integrations/msteams/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/integrations/msteams/README.md b/integrations/msteams/README.md index 025599c4..11491f39 100644 --- a/integrations/msteams/README.md +++ b/integrations/msteams/README.md @@ -2,6 +2,8 @@ User documentation for this integration is available on the LaunchDarkly documentation site: [Microsoft Teams](https://docs.launchdarkly.com/integrations/microsoft-teams) +API documentation for this integration is available on Microsoft's documentation site: [Microsoft Teams](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using?tabs=cURL) + ## Getting started with the MSTeams integration Run `npm run curl msteams` in the root repository directory to generate a `curl` command to send data to Teams. From 1f0ac0d2cd1dcfe48d84d821c27ac692b29ee08c Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 9 Aug 2022 15:59:14 +0100 Subject: [PATCH 580/936] Make superficial change to test auto goaltender PR (#390) --- manifest.schema.d.ts | 2 +- manifest.schema.json | 2 +- schemas/base.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index cf07e9ff..59ec8945 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -536,7 +536,7 @@ export type Elements1 = UIBlockElement[]; export type OAuthIntegrationKey = string; /** - * Describes the capabilities and intent of a LaunchDarkly integration + * This schema describes the capabilities and intent of a LaunchDarkly integration */ export interface LaunchDarklyIntegrationsManifest { name: IntegrationName; diff --git a/manifest.schema.json b/manifest.schema.json index 9cb8c4ff..40005c5b 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://launchdarkly.com/schemas/v1.0/manifest.schema.json#", "title": "LaunchDarkly Integrations Manifest", - "description": "Describes the capabilities and intent of a LaunchDarkly integration", + "description": "This schema describes the capabilities and intent of a LaunchDarkly integration", "type": "object", "propertyNames": { "enum": [ diff --git a/schemas/base.json b/schemas/base.json index d8a4e42f..2ca94e92 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://launchdarkly.com/schemas/v1.0/manifest.schema.json#", "title": "LaunchDarkly Integrations Manifest", - "description": "Describes the capabilities and intent of a LaunchDarkly integration", + "description": "This schema describes the capabilities and intent of a LaunchDarkly integration", "type": "object", "propertyNames": { "enum": [ From b313fc937a1110a214fa182be7e985feb8c98be5 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 10 Aug 2022 13:54:45 +0100 Subject: [PATCH 581/936] Dynatrace: Add change detail to description field and add action as a custom property. (#389) * Add change details to Dynatrace template * Put everything in the description --- integrations/dynatrace/templates/flag.json.hbs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/integrations/dynatrace/templates/flag.json.hbs b/integrations/dynatrace/templates/flag.json.hbs index 5ac12657..8d5d9155 100644 --- a/integrations/dynatrace/templates/flag.json.hbs +++ b/integrations/dynatrace/templates/flag.json.hbs @@ -30,11 +30,12 @@ "Environment key": "{{project.environment.key}}", "Comment": "{{#if comment}}{{comment}}{{/if}}", "User name": "{{member.displayName}}", - "User email": "{{ member.email }}" + "User email": "{{ member.email }}", + "Action": "{{verbKind}}" }, "start": {{ timestamp.milliseconds }}, "source": "LaunchDarkly", - "description": "{{{title.plainText}}}" + "description": "{{{title.plainText}}}{{#if details.plainText}}{{{details.plainText}}}{{/if}}" } {{/if}} {{/if}} From a31ab26ce2198d7b8901529b4d911b889939e090 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 10 Aug 2022 15:23:12 +0100 Subject: [PATCH 582/936] [sc-163714] Dynatrace: change API token to Access token to match their terminology (#391) * Dynatrace: change API token to Access token to match their terminology * Empty-commit --- integrations/dynatrace/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index c5f5275e..e239b99a 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -18,9 +18,9 @@ "formVariables": [ { "key": "apiToken", - "name": "Dynatrace API token", + "name": "Dynatrace Access token", "type": "string", - "description": "Enter your Dynatrace API token. [Learn more](https://www.dynatrace.com/support/help/shortlink/api-authentication#generate-a-token) about generating tokens. The 'access problem and event feed, metrics, and topology' scope is required.", + "description": "Enter your Dynatrace Access token. [Learn more](https://www.dynatrace.com/support/help/shortlink/api-authentication#generate-a-token) about generating tokens. The 'Access problem and event feed, metrics, and topology' scope is required.", "isSecret": true }, { From 0854c74700eb6b69c5c35289d30c62ba9da8abee Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 11 Aug 2022 20:54:03 +0100 Subject: [PATCH 583/936] [sc-163712] Invoke github action on goaltender repo whenever new commits are pushed to main (#392) --- .circleci/config.yml | 2 +- .github/workflows/notify_downstream_repo.yml | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/notify_downstream_repo.yml diff --git a/.circleci/config.yml b/.circleci/config.yml index cb7ac3c5..64d67f37 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -43,7 +43,7 @@ jobs: steps: - checkout - run: - name: send-webhook + name: Send webhook command: | if [ "$CIRCLE_REPOSITORY_URL" = "git@github.com:launchdarkly/integration-framework-private.git" ]; then ./scripts/send_webhook.sh diff --git a/.github/workflows/notify_downstream_repo.yml b/.github/workflows/notify_downstream_repo.yml new file mode 100644 index 00000000..ffa8355f --- /dev/null +++ b/.github/workflows/notify_downstream_repo.yml @@ -0,0 +1,19 @@ +name: Notify downstream repo of changes +on: + push: + branches: + - main + +jobs: + notify-downstream: + if: github.repository == 'launchdarkly/integration-framework-private' + runs-on: ubuntu-latest + steps: + - run: | + curl \ + -i \ + -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token ${{secrets.PR_CREATOR_GH_TOKEN}}" \ + https://api.github.com/repos/launchdarkly/${{secrets.DOWNSTREAM_REPO}}/actions/workflows/31993112/dispatches \ + -d '{"ref":"main"}' From 8af3f52416ee4776e83bf12b4307f2fe6edc5305 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 15 Aug 2022 11:01:21 +0100 Subject: [PATCH 584/936] Revert "Make superficial change to test auto goaltender PR (#390)" (#393) This reverts commit 1f0ac0d2cd1dcfe48d84d821c27ac692b29ee08c. --- manifest.schema.d.ts | 2 +- manifest.schema.json | 2 +- schemas/base.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 59ec8945..cf07e9ff 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -536,7 +536,7 @@ export type Elements1 = UIBlockElement[]; export type OAuthIntegrationKey = string; /** - * This schema describes the capabilities and intent of a LaunchDarkly integration + * Describes the capabilities and intent of a LaunchDarkly integration */ export interface LaunchDarklyIntegrationsManifest { name: IntegrationName; diff --git a/manifest.schema.json b/manifest.schema.json index 40005c5b..9cb8c4ff 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://launchdarkly.com/schemas/v1.0/manifest.schema.json#", "title": "LaunchDarkly Integrations Manifest", - "description": "This schema describes the capabilities and intent of a LaunchDarkly integration", + "description": "Describes the capabilities and intent of a LaunchDarkly integration", "type": "object", "propertyNames": { "enum": [ diff --git a/schemas/base.json b/schemas/base.json index 2ca94e92..d8a4e42f 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://launchdarkly.com/schemas/v1.0/manifest.schema.json#", "title": "LaunchDarkly Integrations Manifest", - "description": "This schema describes the capabilities and intent of a LaunchDarkly integration", + "description": "Describes the capabilities and intent of a LaunchDarkly integration", "type": "object", "propertyNames": { "enum": [ From b68f0fc671e55e14fc0bbfb76c4575786062d2bd Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Tue, 16 Aug 2022 13:14:26 -0700 Subject: [PATCH 585/936] [SC-164990] Add description field to Splunk integration This adds a description field to the Splunk auditlog template, using the same keys for description that the Dynatrace uses. --- integrations/splunk/templates/template.json.hbs | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/splunk/templates/template.json.hbs b/integrations/splunk/templates/template.json.hbs index 84a8c859..e73e96f5 100644 --- a/integrations/splunk/templates/template.json.hbs +++ b/integrations/splunk/templates/template.json.hbs @@ -3,6 +3,7 @@ "time": "{{timestamp.milliseconds}}", "event": { "kind": "{{kind}}", + "description": "{{{title.plainText}}}{{#if details.plainText}}{{{details.plainText}}}{{/if}}", {{#equal kind 'flag'}} "flag_name": "{{name}}", "flag_key": "{{key}}", From 50fb196f328699781fc7bba284c34c467f7fa53c Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Wed, 17 Aug 2022 09:56:46 -0700 Subject: [PATCH 586/936] Update integrations/splunk/templates/template.json.hbs Co-authored-by: Henry Barrow --- integrations/splunk/templates/template.json.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/splunk/templates/template.json.hbs b/integrations/splunk/templates/template.json.hbs index e73e96f5..041bc5e5 100644 --- a/integrations/splunk/templates/template.json.hbs +++ b/integrations/splunk/templates/template.json.hbs @@ -3,7 +3,7 @@ "time": "{{timestamp.milliseconds}}", "event": { "kind": "{{kind}}", - "description": "{{{title.plainText}}}{{#if details.plainText}}{{{details.plainText}}}{{/if}}", + "description": "{{{details.plainText}}}", {{#equal kind 'flag'}} "flag_name": "{{name}}", "flag_key": "{{key}}", From 7d93da3bb6808909a1b19d3b67c3ff904799550e Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 24 Aug 2022 10:44:23 +0100 Subject: [PATCH 587/936] [sc-165992] update description for clarity (#395) * update description for clarity * change to host base url Co-authored-by: Henry Barrow * nvm change it back * update placeholder to more resemble an hec endpoint Co-authored-by: Henry Barrow --- integrations/splunk/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index b3290727..d0cd6bc6 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -20,9 +20,9 @@ "key": "base-url", "name": "HTTP event collector base URL", "type": "string", - "description": "Enter your [Splunk HTTP event collector base URL](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector).", + "description": "Enter your [Splunk HTTP event collector base URL](https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector) (omitting the path).", "isSecret": false, - "placeholder": "https://mysplunkserver.example.com" + "placeholder": "https://http-inputs-.splunkcloud.com" }, { "key": "token", From 5334d304e9e742ac4fa92776cfad8cd12febeefb Mon Sep 17 00:00:00 2001 From: Jaz White Date: Thu, 25 Aug 2022 10:00:13 -0400 Subject: [PATCH 588/936] update gitlab integration key (#396) --- .../{gitlab-coderefs => gitlab}/assets/images/horizontal.svg | 0 integrations/{gitlab-coderefs => gitlab}/assets/images/square.svg | 0 integrations/{gitlab-coderefs => gitlab}/manifest.json | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename integrations/{gitlab-coderefs => gitlab}/assets/images/horizontal.svg (100%) rename integrations/{gitlab-coderefs => gitlab}/assets/images/square.svg (100%) rename integrations/{gitlab-coderefs => gitlab}/manifest.json (100%) diff --git a/integrations/gitlab-coderefs/assets/images/horizontal.svg b/integrations/gitlab/assets/images/horizontal.svg similarity index 100% rename from integrations/gitlab-coderefs/assets/images/horizontal.svg rename to integrations/gitlab/assets/images/horizontal.svg diff --git a/integrations/gitlab-coderefs/assets/images/square.svg b/integrations/gitlab/assets/images/square.svg similarity index 100% rename from integrations/gitlab-coderefs/assets/images/square.svg rename to integrations/gitlab/assets/images/square.svg diff --git a/integrations/gitlab-coderefs/manifest.json b/integrations/gitlab/manifest.json similarity index 100% rename from integrations/gitlab-coderefs/manifest.json rename to integrations/gitlab/manifest.json From 5cb29e2bace028d263fafc5a3ca7c3a58e5d918b Mon Sep 17 00:00:00 2001 From: Jaz White Date: Thu, 25 Aug 2022 11:59:42 -0400 Subject: [PATCH 589/936] gitlab needs legacy info for code refs integration (#397) --- integrations/gitlab/manifest.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/integrations/gitlab/manifest.json b/integrations/gitlab/manifest.json index 9919392c..43a51b50 100644 --- a/integrations/gitlab/manifest.json +++ b/integrations/gitlab/manifest.json @@ -16,5 +16,8 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, + "legacy": { + "kind": "codeRefs" + }, "otherCapabilities": ["codeRefs"] } From 8d86260bc71eadcd0b043778f4c69bfb5102b85f Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 30 Aug 2022 16:52:33 +0100 Subject: [PATCH 590/936] update schema as needed (#398) --- integrations/cloudtrail/templates/default.json.hbs | 4 ++-- integrations/cloudtrail/templates/member.json.hbs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index a9cc9cb9..886efd1f 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -1,5 +1,5 @@ { - "eventVersion": "1.0", + "version": "1.0", "userIdentity": { "type": "user", "principalId": "{{member._id}}" @@ -8,7 +8,7 @@ "eventSource": "LaunchDarkly", "eventName": "{{kind}}", "recipientAccountId": "{{formVariables.accountId}}", - "UUID": "{{_id}}", + "UID": "{{_id}}", "additionalEventData": { "type": "{{verbKind}}", "targetId": "{{target._id}}", diff --git a/integrations/cloudtrail/templates/member.json.hbs b/integrations/cloudtrail/templates/member.json.hbs index ae95f780..9be20200 100644 --- a/integrations/cloudtrail/templates/member.json.hbs +++ b/integrations/cloudtrail/templates/member.json.hbs @@ -1,5 +1,5 @@ { - "eventVersion": "1.0", + "version": "1.0", "userIdentity": { "type": "user", "principalId": "{{member._id}}" @@ -8,7 +8,7 @@ "eventSource": "LaunchDarkly", "eventName": "{{kind}}", "recipientAccountId": "{{formVariables.accountId}}", - "UUID": "{{_id}}", + "UID": "{{_id}}", "additionalEventData": { "type": "{{verbKind}}", "targetId": "{{target._id}}", From 82deab23c23a604822fdb5d2729b28622374e06e Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 30 Aug 2022 17:11:52 -0500 Subject: [PATCH 591/936] Renamed cloudtrail ingestion arn and disabled account id field from the UI --- integrations/cloudtrail/manifest.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index d8b7da0b..3335a010 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -21,7 +21,10 @@ "name": "AWS account ID", "description": "Enter your [AWS account ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html#FindingYourAWSId). The associated account must be configured to use CloudTrail Lake.", "type": "string", - "placeholder": "123456" + "placeholder": "123456", + "isHidden": true, + "isOptional": true, + "defaultValue": "" }, { "key": "iamRoleArn", @@ -32,8 +35,8 @@ }, { "key": "ingestionChannelArn", - "name": "CloudTrail Ingestion Channel ARN", - "description": "Enter the ARN of the CloudTrail Ingestion Channel for LaunchDarkly to use.", + "name": "Channel ARN", + "description": "Enter the Channel ARN for LaunchDarkly to use.", "type": "string", "isSecret": true } From eb738857bacd4b9afc2a0b88d687352a75df88cc Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 12 Sep 2022 15:58:15 +0100 Subject: [PATCH 592/936] Add verbKind as 'action' in Splunk template (#400) --- integrations/splunk/templates/template.json.hbs | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/splunk/templates/template.json.hbs b/integrations/splunk/templates/template.json.hbs index 041bc5e5..0039aab0 100644 --- a/integrations/splunk/templates/template.json.hbs +++ b/integrations/splunk/templates/template.json.hbs @@ -3,6 +3,7 @@ "time": "{{timestamp.milliseconds}}", "event": { "kind": "{{kind}}", + "action": "{{{verbKind}}}", "description": "{{{details.plainText}}}", {{#equal kind 'flag'}} "flag_name": "{{name}}", From 360c220615d5114042ae5aa02a399e4ef10ac2ae Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 12 Sep 2022 16:31:00 -0500 Subject: [PATCH 593/936] Updated CloudTrail integration card name --- integrations/cloudtrail/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 3335a010..7caa40bf 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -1,8 +1,8 @@ { - "name": "AWS CloudTrail", + "name": "AWS CloudTrail Lake", "version": "1.0.0", "overview": "Export LaunchDarkly audit events.", - "description": "Export LaunchDarkly audit events to AWS CloudTrail via Open Audit Events.", + "description": "Export LaunchDarkly audit events to AWS CloudTrail Lake via Open Audit Events.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 3904b0ac11bacfbd29a26ee5a444c4b092ee9966 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 13 Sep 2022 14:29:46 -0500 Subject: [PATCH 594/936] updated event source name --- integrations/cloudtrail/templates/member.json.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/cloudtrail/templates/member.json.hbs b/integrations/cloudtrail/templates/member.json.hbs index 9be20200..4699a287 100644 --- a/integrations/cloudtrail/templates/member.json.hbs +++ b/integrations/cloudtrail/templates/member.json.hbs @@ -5,7 +5,7 @@ "principalId": "{{member._id}}" }, "eventTime": "{{timestamp.rfc3339}}", - "eventSource": "LaunchDarkly", + "eventSource": "launchdarkly", "eventName": "{{kind}}", "recipientAccountId": "{{formVariables.accountId}}", "UID": "{{_id}}", From 925dd833d3f9fca9d70c74f6c7ad4f080d7869c4 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 13 Sep 2022 16:06:42 -0500 Subject: [PATCH 595/936] Updated manifest description for CloudTrail --- integrations/cloudtrail/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 7caa40bf..6e07f362 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -1,8 +1,8 @@ { "name": "AWS CloudTrail Lake", "version": "1.0.0", - "overview": "Export LaunchDarkly audit events.", - "description": "Export LaunchDarkly audit events to AWS CloudTrail Lake via Open Audit Events.", + "overview": "Send LaunchDarkly audit events to AWS CloudTrail Lake.", + "description": "AWS CloudTrail Lake integration lets you configure CloudTrail Lake to receive any activity from LaunchDarkly and store data in a CloudTrail Lake.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 5f65a95bd9c490915fa59e572b7b104a9bcedbb5 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 13 Sep 2022 16:08:30 -0500 Subject: [PATCH 596/936] small verbiage change --- integrations/cloudtrail/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 6e07f362..5d58540a 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -2,7 +2,7 @@ "name": "AWS CloudTrail Lake", "version": "1.0.0", "overview": "Send LaunchDarkly audit events to AWS CloudTrail Lake.", - "description": "AWS CloudTrail Lake integration lets you configure CloudTrail Lake to receive any activity from LaunchDarkly and store data in a CloudTrail Lake.", + "description": "AWS CloudTrail Lake integration lets you configure CloudTrail Lake to receive any activity from LaunchDarkly and store the data in a CloudTrail Lake.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 207cf14c7d9042381ffa083124741bbeec91ccf6 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 13 Sep 2022 16:09:09 -0500 Subject: [PATCH 597/936] small verbiage change --- integrations/cloudtrail/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 5d58540a..af803298 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -2,7 +2,7 @@ "name": "AWS CloudTrail Lake", "version": "1.0.0", "overview": "Send LaunchDarkly audit events to AWS CloudTrail Lake.", - "description": "AWS CloudTrail Lake integration lets you configure CloudTrail Lake to receive any activity from LaunchDarkly and store the data in a CloudTrail Lake.", + "description": "AWS CloudTrail Lake integration lets you configure CloudTrail Lake to receive any activity from LaunchDarkly and store the data in CloudTrail Lake.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 1ce1fb1bb1ecbb02efe7663706048f6fcee5c302 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 13 Sep 2022 17:12:01 -0500 Subject: [PATCH 598/936] Updated event source --- integrations/cloudtrail/templates/default.json.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index 886efd1f..e66b49b3 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -5,7 +5,7 @@ "principalId": "{{member._id}}" }, "eventTime": "{{timestamp.rfc3339}}", - "eventSource": "LaunchDarkly", + "eventSource": "launchdarkly", "eventName": "{{kind}}", "recipientAccountId": "{{formVariables.accountId}}", "UID": "{{_id}}", From c0e52bf06f80e4b6b9c3cc5ee5cac921590aead3 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 15 Sep 2022 17:34:26 +0100 Subject: [PATCH 599/936] add details field (#403) --- integrations/cloudtrail/templates/default.json.hbs | 5 +++++ integrations/cloudtrail/templates/member.json.hbs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index e66b49b3..1d9437df 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -24,6 +24,11 @@ {{#if tags}} "tags": {{tags}}, {{/if}} + {{#if details}} + {{#if details.plainText}} + "details": "{{details.plainText}}", + {{/if}} + {{/if}} "plainText": "A member {{titleVerb}} {{#if target.name}} {{{target.name}}} {{else}} {{{target._id}}}{{/if}}" } } diff --git a/integrations/cloudtrail/templates/member.json.hbs b/integrations/cloudtrail/templates/member.json.hbs index 4699a287..8cfa69a6 100644 --- a/integrations/cloudtrail/templates/member.json.hbs +++ b/integrations/cloudtrail/templates/member.json.hbs @@ -24,6 +24,11 @@ {{#if tags}} "tags": {{tags}}, {{/if}} + {{#if details}} + {{#if details.plainText}} + "details": "{{details.plainText}}", + {{/if}} + {{/if}} "plainText": "Member {{member._id}} {{{titleVerb}}} {{{target._id}}}" } } From ae56d82b787dbf0c5e8f21653258c348c99477dd Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 15 Sep 2022 16:08:51 -0500 Subject: [PATCH 600/936] Updated cloudtrail template per blitz feedback --- integrations/cloudtrail/templates/default.json.hbs | 9 ++++++--- integrations/cloudtrail/templates/member.json.hbs | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index 1d9437df..fb4474c8 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -22,13 +22,16 @@ "environmentKey": "{{project.environment.key}}", {{/if}} {{#if tags}} - "tags": {{tags}}, + "tags": [{{#each tags}}{{#if @index}}, {{/if}}"{{this}}"{{/each}}], {{/if}} {{#if details}} {{#if details.plainText}} - "details": "{{details.plainText}}", + "details": "{{{details.plainText}}}", {{/if}} {{/if}} - "plainText": "A member {{titleVerb}} {{#if target.name}} {{{target.name}}} {{else}} {{{target._id}}}{{/if}}" + {{#if comment}} + "comment": "{{{comment}}}", + {{/if}} + "plainText": "A member {{{titleVerb}}} {{#if target.name}}{{{target.name}}}{{else}}{{{target._id}}}{{/if}}" } } diff --git a/integrations/cloudtrail/templates/member.json.hbs b/integrations/cloudtrail/templates/member.json.hbs index 8cfa69a6..4fca4e6a 100644 --- a/integrations/cloudtrail/templates/member.json.hbs +++ b/integrations/cloudtrail/templates/member.json.hbs @@ -22,13 +22,16 @@ "environmentKey": "{{project.environment.key}}", {{/if}} {{#if tags}} - "tags": {{tags}}, + "tags": [{{#each tags}}{{#if @index}}, {{/if}}"{{this}}"{{/each}}], {{/if}} {{#if details}} {{#if details.plainText}} - "details": "{{details.plainText}}", + "details": "{{{details.plainText}}}", {{/if}} {{/if}} + {{#if comment}} + "comment": "{{{comment}}}", + {{/if}} "plainText": "Member {{member._id}} {{{titleVerb}}} {{{target._id}}}" } } From 563b9781e603623b03722b211bfd2a77cf6a3032 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 15 Sep 2022 18:54:40 -0500 Subject: [PATCH 601/936] Updated cloudrail docs link --- integrations/cloudtrail/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index af803298..04898a86 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://aws.amazon.com/cloudtrail/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/more", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/cloudtrail", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "analytics"], From 620d7947c75929b0c0c52db1cf4ebed3606a4dfa Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 16 Sep 2022 13:18:54 -0500 Subject: [PATCH 602/936] Updated cloudtrail logos --- .../cloudtrail/assets/images/square.svg | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/integrations/cloudtrail/assets/images/square.svg b/integrations/cloudtrail/assets/images/square.svg index 8e762b90..cecb91cb 100644 --- a/integrations/cloudtrail/assets/images/square.svg +++ b/integrations/cloudtrail/assets/images/square.svg @@ -1,18 +1 @@ - - - - Icon-Architecture/64/Arch_AWS-Cloud-Trail_64 - Created with Sketch. - - - - - - - - - - - - - + From d00ecd58f94398651175a2e341fc8b548eb85a49 Mon Sep 17 00:00:00 2001 From: Kiara Correa Acosta Date: Fri, 23 Sep 2022 14:42:14 -0400 Subject: [PATCH 603/936] adding hideConfiguration capability --- integrations/zapier/manifest.json | 3 ++- manifest.schema.d.ts | 5 +++++ manifest.schema.json | 10 +++++++++- schemas/base.json | 6 +++++- schemas/capabilities/hideConfiguration.json | 10 ++++++++++ 5 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 schemas/capabilities/hideConfiguration.json diff --git a/integrations/zapier/manifest.json b/integrations/zapier/manifest.json index 57c07617..6bd55f2a 100644 --- a/integrations/zapier/manifest.json +++ b/integrations/zapier/manifest.json @@ -45,6 +45,7 @@ "templates": { "default": "templates/default.json.hbs" } - } + }, + "hideConfiguration": true } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index cf07e9ff..d9eb3f78 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -530,6 +530,10 @@ export type Description3 = string; * An array of elements to be combined to create a context block */ export type Elements1 = UIBlockElement[]; +/** + * This capability will disable in-app editing for the integration + */ +export type HideConfiguration = boolean; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -649,6 +653,7 @@ export interface Capabilities { approval?: Approval; featureStore?: FeatureStore; flagLink?: FlagLink; + hideConfiguration?: HideConfiguration; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index 9cb8c4ff..80c6beeb 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -656,7 +656,8 @@ "trigger", "approval", "featureStore", - "flagLink" + "flagLink", + "hideConfiguration" ] }, "properties": { @@ -3672,6 +3673,13 @@ } } } + }, + "hideConfiguration": { + "$id": "#/properties/capability/hide-configuration", + "title": "Hide Configuration", + "description": "This capability will disable in-app editing for the integration", + "type": "boolean", + "default": false } } }, diff --git a/schemas/base.json b/schemas/base.json index d8a4e42f..3138a44e 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -257,7 +257,8 @@ "trigger", "approval", "featureStore", - "flagLink" + "flagLink", + "hideConfiguration" ] }, "properties": { @@ -278,6 +279,9 @@ }, "flagLink": { "$ref": "schemas/capabilities/flagLink.json#/flagLink" + }, + "hideConfiguration": { + "$ref": "schemas/capabilities/hideConfiguration.json#/hideConfiguration" } } }, diff --git a/schemas/capabilities/hideConfiguration.json b/schemas/capabilities/hideConfiguration.json new file mode 100644 index 00000000..544821e6 --- /dev/null +++ b/schemas/capabilities/hideConfiguration.json @@ -0,0 +1,10 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "hideConfiguration": { + "$id": "#/properties/capability/hide-configuration", + "title": "Hide Configuration", + "description": "This capability will disable in-app editing for the integration", + "type": "boolean", + "default": false + } +} From c79acfde9ddd8b154ef68492cb5b607196db6191 Mon Sep 17 00:00:00 2001 From: Joanne Pham <63268853+anchovypasta@users.noreply.github.com> Date: Mon, 10 Oct 2022 21:20:47 -0700 Subject: [PATCH 604/936] Update AWS auth in CI jobs --- .circleci/config.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 64d67f37..4a2a78e7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,7 +2,7 @@ version: 2.1 orbs: node: circleci/node@4.7.0 - aws-cli: circleci/aws-cli@1.3.0 + aws-cli: circleci/aws-cli@3.1 linter: thekevjames/linter@1.0.49 jobs: @@ -28,9 +28,12 @@ jobs: path: ./reports/junit upload-to-s3: executor: aws-cli/default + environment: + AWS_DEFAULT_REGION: us-east-1 steps: - checkout - - aws-cli/install + - aws-cli/setup: + role-arn: arn:aws:iam::554582317989:role/circleci-integrations-framework - run: name: Upload artifacts to s3 command: | From 8353e9ec4eeee0eeb34e09087c639b3784887696 Mon Sep 17 00:00:00 2001 From: Joanne Pham <63268853+anchovypasta@users.noreply.github.com> Date: Tue, 11 Oct 2022 07:14:51 -0700 Subject: [PATCH 605/936] Fix role name --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 4a2a78e7..11657c71 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -33,7 +33,7 @@ jobs: steps: - checkout - aws-cli/setup: - role-arn: arn:aws:iam::554582317989:role/circleci-integrations-framework + role-arn: arn:aws:iam::554582317989:role/circleci-integration-framework - run: name: Upload artifacts to s3 command: | From 15ed98f6215cb78ccb159ca0c100d5b51ebf64f5 Mon Sep 17 00:00:00 2001 From: Joanne Pham <63268853+anchovypasta@users.noreply.github.com> Date: Tue, 11 Oct 2022 09:25:29 -0700 Subject: [PATCH 606/936] Fix role name --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 11657c71..32221879 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -33,7 +33,7 @@ jobs: steps: - checkout - aws-cli/setup: - role-arn: arn:aws:iam::554582317989:role/circleci-integration-framework + role-arn: arn:aws:iam::554582317989:role/circleci-integration-framework-private - run: name: Upload artifacts to s3 command: | From 223c2f46e0bf57078ce075c7e43601882f63c470 Mon Sep 17 00:00:00 2001 From: Kiara Correa Acosta Date: Thu, 20 Oct 2022 13:46:46 -0400 Subject: [PATCH 607/936] inital commit - feedback needed --- .../msteams-app/assets/images/horizontal.svg | 1 + .../msteams-app/assets/images/square.svg | 1 + integrations/msteams-app/manifest.json | 86 +++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 integrations/msteams-app/assets/images/horizontal.svg create mode 100644 integrations/msteams-app/assets/images/square.svg create mode 100644 integrations/msteams-app/manifest.json diff --git a/integrations/msteams-app/assets/images/horizontal.svg b/integrations/msteams-app/assets/images/horizontal.svg new file mode 100644 index 00000000..dc4ea78a --- /dev/null +++ b/integrations/msteams-app/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/msteams-app/assets/images/square.svg b/integrations/msteams-app/assets/images/square.svg new file mode 100644 index 00000000..1e75bf94 --- /dev/null +++ b/integrations/msteams-app/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/msteams-app/manifest.json b/integrations/msteams-app/manifest.json new file mode 100644 index 00000000..b1bfdb3d --- /dev/null +++ b/integrations/msteams-app/manifest.json @@ -0,0 +1,86 @@ +{ + "name": "Microsoft Teams App", + "version": "1.0.0", + "overview": "View, monitor, and control flags interactively from our official MSTeams app.", + "description": "With the LaunchDarkly Microsoft Teams app, you can view, monitor, and control feature flags directly from your Teams workspaces. Use the app to find feature flags, subscribe channels to notifications about flag changes, and toggle flags on or off.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.microsoft.com/en-us/microsoft-teams/group-chat-software", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["messaging"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "url", + "name": "Incoming webhook URL", + "type": "uri", + "description": "Enter your MSTeams webhook URL", + "isSecret": false + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{url}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ], + "templates": { + "default": "templates/default.json.hbs" + } + }, + "hideConfiguration": true, + "flagLink": { + "header": "Microsoft Teams conversation", + "emptyState": { + "title": "No MS Teams conversations link to this flag." + }, + "metadata": { + "avatarUrl": { + "type": "uri" + }, + "displayName": { + "type": "string" + }, + "channelName": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "uiBlocks": { + "image": { + "sourceUrl": "{{{metadata.avatarUrl}}}", + "isAvatar": true + }, + "name": "{{{metadata.displayName}}}", + "description": "{{{metadata.message}}}", + "context": { + "elements": [ + { "text": "Posted in" }, + { "text": "#{{{metadata.channelName}}}", "isBold": true }, + { "text": "View message", "url": "{{{deepLink}}}" } + ] + } + } + } + } +} From d06ecfebcb4db24cc1101d1fb9f19ac3adc9e67e Mon Sep 17 00:00:00 2001 From: Kiara Correa Acosta Date: Thu, 20 Oct 2022 14:04:11 -0400 Subject: [PATCH 608/936] PR review changes --- integrations/msteams-app/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/msteams-app/manifest.json b/integrations/msteams-app/manifest.json index b1bfdb3d..3790722c 100644 --- a/integrations/msteams-app/manifest.json +++ b/integrations/msteams-app/manifest.json @@ -19,7 +19,7 @@ "key": "url", "name": "Incoming webhook URL", "type": "uri", - "description": "Enter your MSTeams webhook URL", + "description": "Enter your Microsoft Teams webhook URL", "isSecret": false } ], @@ -50,7 +50,7 @@ "flagLink": { "header": "Microsoft Teams conversation", "emptyState": { - "title": "No MS Teams conversations link to this flag." + "title": "No Microsoft Teams conversations link to this flag." }, "metadata": { "avatarUrl": { From d6f60722abbc9537103c62b75b60949b314ead28 Mon Sep 17 00:00:00 2001 From: Kiara Correa Acosta Date: Thu, 20 Oct 2022 16:07:57 -0400 Subject: [PATCH 609/936] adding default template --- integrations/msteams-app/manifest.json | 2 +- .../msteams-app/templates/default.json.hbs | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 integrations/msteams-app/templates/default.json.hbs diff --git a/integrations/msteams-app/manifest.json b/integrations/msteams-app/manifest.json index 3790722c..b2d9c5e3 100644 --- a/integrations/msteams-app/manifest.json +++ b/integrations/msteams-app/manifest.json @@ -1,7 +1,7 @@ { "name": "Microsoft Teams App", "version": "1.0.0", - "overview": "View, monitor, and control flags interactively from our official MSTeams app.", + "overview": "View, monitor, and control flags interactively from our official Microsoft Teams app.", "description": "With the LaunchDarkly Microsoft Teams app, you can view, monitor, and control feature flags directly from your Teams workspaces. Use the app to find feature flags, subscribe channels to notifications about flag changes, and toggle flags on or off.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/msteams-app/templates/default.json.hbs b/integrations/msteams-app/templates/default.json.hbs new file mode 100644 index 00000000..74891314 --- /dev/null +++ b/integrations/msteams-app/templates/default.json.hbs @@ -0,0 +1,14 @@ +{ + "@type": "MessageCard", + "@context": "http://schema.org/extensions", + "themeColor": "0076D7", + "summary": "{{{title.plainText}}}", + "sections": [ + { + "activityTitle": "{{{title.html}}}{{#equal project.environment.key '~'}} in all environments{{/equal}}", + "activitySubtitle": "{{#if project.name}}{{project.name}}{{#if project.environment.name}} / {{project.environment.name}}{{/if}} / {{name}}{{/if}}", + "text": "{{#if details}}{{{details.html}}}{{/if}}{{#if comment}}\nComment: {{{comment}}}\n{{/if}}", + "xml": true + } + ] +} From 593f88330a1ebef99caa48f9fcc79ea07e45bfa8 Mon Sep 17 00:00:00 2001 From: Kiara Correa Acosta Date: Thu, 20 Oct 2022 16:10:26 -0400 Subject: [PATCH 610/936] fix end of file --- integrations/msteams-app/assets/images/square.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/msteams-app/assets/images/square.svg b/integrations/msteams-app/assets/images/square.svg index 1e75bf94..dc4ea78a 100644 --- a/integrations/msteams-app/assets/images/square.svg +++ b/integrations/msteams-app/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + From 2491dc980d9f12d1ea0891b178a960809481adfa Mon Sep 17 00:00:00 2001 From: Kiara Correa Acosta Date: Thu, 20 Oct 2022 16:40:48 -0400 Subject: [PATCH 611/936] adding key of secret to formVariables --- integrations/msteams-app/manifest.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/integrations/msteams-app/manifest.json b/integrations/msteams-app/manifest.json index b2d9c5e3..a2b487ca 100644 --- a/integrations/msteams-app/manifest.json +++ b/integrations/msteams-app/manifest.json @@ -21,6 +21,15 @@ "type": "uri", "description": "Enter your Microsoft Teams webhook URL", "isSecret": false + }, + { + "key": "secret", + "name": "Secret", + "description": "Enter the secret shared between Microsoft Teams and Slack-App", + "type": "string", + "isSecret": true, + "isOptional": true, + "defaultValue": "" } ], "capabilities": { From 126616a79ccd0fb0695f9944d1fe091affda8529 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 8 Nov 2022 08:11:20 -0500 Subject: [PATCH 612/936] Add new category for synced segments Add Amplitude Learn More card --- integrations/amplitude/assets/horizontal.svg | 0 integrations/amplitude/assets/square.svg | 3 +++ integrations/amplitude/manifest.json | 18 ++++++++++++++++++ manifest.schema.json | 3 ++- 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 integrations/amplitude/assets/horizontal.svg create mode 100644 integrations/amplitude/assets/square.svg create mode 100644 integrations/amplitude/manifest.json diff --git a/integrations/amplitude/assets/horizontal.svg b/integrations/amplitude/assets/horizontal.svg new file mode 100644 index 00000000..e69de29b diff --git a/integrations/amplitude/assets/square.svg b/integrations/amplitude/assets/square.svg new file mode 100644 index 00000000..a442b7d5 --- /dev/null +++ b/integrations/amplitude/assets/square.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/amplitude/manifest.json b/integrations/amplitude/manifest.json new file mode 100644 index 00000000..e5b08ed2 --- /dev/null +++ b/integrations/amplitude/manifest.json @@ -0,0 +1,18 @@ +{ + "name": "Amplitude", + "version": "1.0.0", + "overview": "Sync Amplitude cohorts to LaunchDarkly Big Segments", + "description": "Segment syncing lets you import audiences from Amplitude to LaunchDarkly to more efficiently target and deliver feature flags.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.amplitude.com", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/users/synced-segments", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["synced-segments"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + } +} diff --git a/manifest.schema.json b/manifest.schema.json index 80c6beeb..76303dfe 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -167,7 +167,8 @@ "log-management", "messaging", "monitoring", - "notifications" + "notifications", + "synced-segments" ] } }, From 62c61cd4eedbe45c82f938f988c693b33220533f Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 8 Nov 2022 08:17:39 -0500 Subject: [PATCH 613/936] schema fixes --- integrations/amplitude/manifest.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/integrations/amplitude/manifest.json b/integrations/amplitude/manifest.json index e5b08ed2..0ea38fd2 100644 --- a/integrations/amplitude/manifest.json +++ b/integrations/amplitude/manifest.json @@ -1,7 +1,7 @@ { "name": "Amplitude", "version": "1.0.0", - "overview": "Sync Amplitude cohorts to LaunchDarkly Big Segments", + "overview": "Sync Amplitude cohorts to LaunchDarkly Big Segments.", "description": "Segment syncing lets you import audiences from Amplitude to LaunchDarkly to more efficiently target and deliver feature flags.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -14,5 +14,6 @@ "icons": { "square": "assets/square.svg", "horizontal": "assets/horizontal.svg" - } + }, + "otherCapabilities": ["external"] } From b42071338abdea5522f67269369795be2da2caff Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 8 Nov 2022 09:18:09 -0500 Subject: [PATCH 614/936] update Datadog manifest to include Events in name Add a Datadog flag trigger card --- .../assets/horizontal.svg | 64 +++++++++++++++++++ .../datadog-flag-trigger/assets/square.svg | 41 ++++++++++++ .../datadog-flag-trigger/manifest.json | 19 ++++++ integrations/datadog/manifest.json | 2 +- 4 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 integrations/datadog-flag-trigger/assets/horizontal.svg create mode 100644 integrations/datadog-flag-trigger/assets/square.svg create mode 100644 integrations/datadog-flag-trigger/manifest.json diff --git a/integrations/datadog-flag-trigger/assets/horizontal.svg b/integrations/datadog-flag-trigger/assets/horizontal.svg new file mode 100644 index 00000000..de5ec9d6 --- /dev/null +++ b/integrations/datadog-flag-trigger/assets/horizontal.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/datadog-flag-trigger/assets/square.svg b/integrations/datadog-flag-trigger/assets/square.svg new file mode 100644 index 00000000..f39a6ac1 --- /dev/null +++ b/integrations/datadog-flag-trigger/assets/square.svg @@ -0,0 +1,41 @@ + + + + + + diff --git a/integrations/datadog-flag-trigger/manifest.json b/integrations/datadog-flag-trigger/manifest.json new file mode 100644 index 00000000..46d454b4 --- /dev/null +++ b/integrations/datadog-flag-trigger/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "Datadog Flag Trigger", + "version": "1.0.0", + "overview": "Allow a Datadog alert to initiate a flag change remotely when created.", + "description": "Flag triggers integrate with your existing tools to let you enable or disable flags when you hit specific operational health thresholds or receive certain alerts.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.datadoghq.com", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog/triggers", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["developer-tools", "monitoring"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "otherCapabilities": ["external"] +} diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index bd62792b..8b9beb03 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -1,5 +1,5 @@ { - "name": "Datadog", + "name": "Datadog Events", "version": "1.0.0", "overview": "Monitor LaunchDarkly changes in Datadog.", "description": "Monitor LaunchDarkly flag and other change events in DataDog. Correlate feature rollouts to changes in your system’s operational health.", From 272ef55feaa5682ec76f1c4066077857d5ebec83 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 8 Nov 2022 19:03:35 -0500 Subject: [PATCH 615/936] update amplitude horizontal logo --- integrations/amplitude/assets/horizontal.svg | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/integrations/amplitude/assets/horizontal.svg b/integrations/amplitude/assets/horizontal.svg index e69de29b..f08f394e 100644 --- a/integrations/amplitude/assets/horizontal.svg +++ b/integrations/amplitude/assets/horizontal.svg @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file From bb7ee3b897bca6da52284c727c89359ffb135da5 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 8 Nov 2022 19:07:21 -0500 Subject: [PATCH 616/936] amplitude horizontal logo fix --- integrations/amplitude/assets/horizontal.svg | 53 +++++++++++++++++--- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/integrations/amplitude/assets/horizontal.svg b/integrations/amplitude/assets/horizontal.svg index f08f394e..b311e9f3 100644 --- a/integrations/amplitude/assets/horizontal.svg +++ b/integrations/amplitude/assets/horizontal.svg @@ -1,8 +1,45 @@ - - - - - \ No newline at end of file + + + + + + + + From 45aeb81dfa7121b512ecf8f10ec2e65d6882de61 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 9 Nov 2022 12:53:54 -0500 Subject: [PATCH 617/936] Additional Amplitude SVG updates for learn more card --- integrations/amplitude/assets/horizontal.svg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/amplitude/assets/horizontal.svg b/integrations/amplitude/assets/horizontal.svg index b311e9f3..8d8618f0 100644 --- a/integrations/amplitude/assets/horizontal.svg +++ b/integrations/amplitude/assets/horizontal.svg @@ -1,7 +1,7 @@ - + From e845ed7c86a40a70e91bf5e6fde5efb375d7e3df Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 9 Nov 2022 12:58:46 -0500 Subject: [PATCH 618/936] change logo --- integrations/amplitude/assets/horizontal.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/amplitude/assets/horizontal.svg b/integrations/amplitude/assets/horizontal.svg index 8d8618f0..86965c71 100644 --- a/integrations/amplitude/assets/horizontal.svg +++ b/integrations/amplitude/assets/horizontal.svg @@ -1,7 +1,7 @@ + viewBox="100 350 1650 600"> From e4b0cf0b63c05c22f31cce5e1bb7b922ad8f38da Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 9 Nov 2022 13:01:13 -0500 Subject: [PATCH 619/936] additional tightening of viewbox --- integrations/amplitude/assets/horizontal.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/amplitude/assets/horizontal.svg b/integrations/amplitude/assets/horizontal.svg index 86965c71..699ed9ef 100644 --- a/integrations/amplitude/assets/horizontal.svg +++ b/integrations/amplitude/assets/horizontal.svg @@ -1,7 +1,7 @@ + viewBox="100 350 1650 375"> From f3fb1370c41fd223b6c953bb3d3e95e929ee529a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 05:26:09 +0000 Subject: [PATCH 620/936] Bump decode-uri-component from 0.2.0 to 0.2.2 Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b947c9a9..dc2b605a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1998,9 +1998,9 @@ "dev": true }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" @@ -9446,9 +9446,9 @@ "dev": true }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "deep-is": { From bb7366858645ac554d804d493804b6f5d031f1fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 13:09:00 +0000 Subject: [PATCH 621/936] Bump minimatch from 3.0.4 to 3.1.2 Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2. - [Release notes](https://github.com/isaacs/minimatch/releases) - [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index dc2b605a..699e4cce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4942,9 +4942,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -11717,9 +11717,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" From f08bf4158fc3b9165fc3ed4bc4e971c94f0757a6 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 5 Jan 2023 10:11:55 -0500 Subject: [PATCH 622/936] add Segment inbound events card --- integrations/segment-inbound/LICENSE.md | 13 ++++++++++ .../assets/images/horizontal.svg | 25 +++++++++++++++++++ .../segment-inbound/assets/images/square.svg | 1 + integrations/segment-inbound/manifest.json | 20 +++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 integrations/segment-inbound/LICENSE.md create mode 100644 integrations/segment-inbound/assets/images/horizontal.svg create mode 100644 integrations/segment-inbound/assets/images/square.svg create mode 100644 integrations/segment-inbound/manifest.json diff --git a/integrations/segment-inbound/LICENSE.md b/integrations/segment-inbound/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/segment-inbound/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/segment-inbound/assets/images/horizontal.svg b/integrations/segment-inbound/assets/images/horizontal.svg new file mode 100644 index 00000000..1949c758 --- /dev/null +++ b/integrations/segment-inbound/assets/images/horizontal.svg @@ -0,0 +1,25 @@ + + + + +2019_SegmentLogo_Horizontal + + + + + + + + + + + + + + + + + + diff --git a/integrations/segment-inbound/assets/images/square.svg b/integrations/segment-inbound/assets/images/square.svg new file mode 100644 index 00000000..7b54e7a2 --- /dev/null +++ b/integrations/segment-inbound/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/segment-inbound/manifest.json b/integrations/segment-inbound/manifest.json new file mode 100644 index 00000000..10229acd --- /dev/null +++ b/integrations/segment-inbound/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Segment Inbound Events", + "version": "1.0.0", + "overview": "Send Segment events to LaunchDarkly experiments as metrics.", + "description": "Use Segment events as custom metric events in LaunchDarkly experiments, so you can measure results immediately, without any instrumentation, code, or delays.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://segment.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/creating-experiments/segment/", + "supportWebsite": "https://segment.com/docs/connections/destinations/catalog/actions-launchdarkly/", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "otherCapabilities": ["external"] +} From 50a3bf7046f4a5c439b935d85687ebe5cbe2ea26 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 5 Jan 2023 10:12:23 -0500 Subject: [PATCH 623/936] update license year --- integrations/segment-inbound/LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/segment-inbound/LICENSE.md b/integrations/segment-inbound/LICENSE.md index 9dcbe896..04b7d222 100644 --- a/integrations/segment-inbound/LICENSE.md +++ b/integrations/segment-inbound/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020 Catamorphic Co. +Copyright 2023 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 40f1d18d72bd7f664e5b8f6547fe8c4004916d27 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 5 Jan 2023 14:56:59 -0500 Subject: [PATCH 624/936] add DD RUM integration --- .../datadog-rum/assets/horizontal.svg | 64 +++++++++++++++++++ integrations/datadog-rum/assets/square.svg | 41 ++++++++++++ integrations/datadog-rum/manifest.json | 19 ++++++ 3 files changed, 124 insertions(+) create mode 100644 integrations/datadog-rum/assets/horizontal.svg create mode 100644 integrations/datadog-rum/assets/square.svg create mode 100644 integrations/datadog-rum/manifest.json diff --git a/integrations/datadog-rum/assets/horizontal.svg b/integrations/datadog-rum/assets/horizontal.svg new file mode 100644 index 00000000..de5ec9d6 --- /dev/null +++ b/integrations/datadog-rum/assets/horizontal.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/datadog-rum/assets/square.svg b/integrations/datadog-rum/assets/square.svg new file mode 100644 index 00000000..f39a6ac1 --- /dev/null +++ b/integrations/datadog-rum/assets/square.svg @@ -0,0 +1,41 @@ + + + + + + diff --git a/integrations/datadog-rum/manifest.json b/integrations/datadog-rum/manifest.json new file mode 100644 index 00000000..e081e3c6 --- /dev/null +++ b/integrations/datadog-rum/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "Datadog RUM", + "version": "1.0.0", + "overview": "Send feature flag evaluation data from the LaunchDarkly JavaScript SDK to Datadog RUM as event properties.", + "description": "Send feature flag evaluation data from the LaunchDarkly JavaScript SDK to Datadog RUM as event properties.", + "author": "Datadog", + "supportEmail": "support@datadoghq.com", + "links": { + "site": "https://www.datadoghq.com", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog/rum", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["developer-tools", "monitoring"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "otherCapabilities": ["external"] +} From 326f7249f2192e0efe2ad61642ee5d99d6e26ff6 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 5 Jan 2023 15:02:15 -0500 Subject: [PATCH 625/936] shorten overview --- integrations/datadog-rum/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/datadog-rum/manifest.json b/integrations/datadog-rum/manifest.json index e081e3c6..6a7398ab 100644 --- a/integrations/datadog-rum/manifest.json +++ b/integrations/datadog-rum/manifest.json @@ -1,7 +1,7 @@ { "name": "Datadog RUM", "version": "1.0.0", - "overview": "Send feature flag evaluation data from the LaunchDarkly JavaScript SDK to Datadog RUM as event properties.", + "overview": "Send feature flag evaluation data from the LaunchDarkly JavaScript SDK to Datadog RUM.", "description": "Send feature flag evaluation data from the LaunchDarkly JavaScript SDK to Datadog RUM as event properties.", "author": "Datadog", "supportEmail": "support@datadoghq.com", From 675a4a61fa7abeb418a272f694459111aad32e79 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 9 Jan 2023 13:11:50 +0000 Subject: [PATCH 626/936] [sc-182815] Get Thumb Seeker token from org-global context and add `synced-segments` category (#419) * Get Thumb Seeker token from org-global context * Trigger build --- .circleci/config.yml | 1 + manifest.schema.d.ts | 6 ++++++ manifest.schema.json | 4 ++-- schemas/base.json | 1 + scripts/send_webhook.sh | 2 +- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 32221879..f9fba611 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -68,6 +68,7 @@ workflows: - send-webhook: requires: - upload-to-s3 + context: org-global filters: branches: only: main diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index d9eb3f78..7c5029c9 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -67,6 +67,7 @@ export type Categories = | "log-management" | "messaging" | "monitoring" + | "synced-segments" | "notifications" ] | [ @@ -84,6 +85,7 @@ export type Categories = | "log-management" | "messaging" | "monitoring" + | "synced-segments" | "notifications" ), ( @@ -100,6 +102,7 @@ export type Categories = | "log-management" | "messaging" | "monitoring" + | "synced-segments" | "notifications" ) ] @@ -118,6 +121,7 @@ export type Categories = | "log-management" | "messaging" | "monitoring" + | "synced-segments" | "notifications" ), ( @@ -134,6 +138,7 @@ export type Categories = | "log-management" | "messaging" | "monitoring" + | "synced-segments" | "notifications" ), ( @@ -150,6 +155,7 @@ export type Categories = | "log-management" | "messaging" | "monitoring" + | "synced-segments" | "notifications" ) ]; diff --git a/manifest.schema.json b/manifest.schema.json index 76303dfe..a9c7f4f9 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -167,8 +167,8 @@ "log-management", "messaging", "monitoring", - "notifications", - "synced-segments" + "synced-segments", + "notifications" ] } }, diff --git a/schemas/base.json b/schemas/base.json index 3138a44e..ed1a3ae2 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -155,6 +155,7 @@ "log-management", "messaging", "monitoring", + "synced-segments", "notifications" ] } diff --git a/scripts/send_webhook.sh b/scripts/send_webhook.sh index 8c50cdcf..3a745ab9 100755 --- a/scripts/send_webhook.sh +++ b/scripts/send_webhook.sh @@ -13,5 +13,5 @@ EOF ) curl --header "Content-Type: application/json" \ - --header "X-LaunchDarkly-Secret: ${WEBHOOK_SECRET}" \ + --header "X-LaunchDarkly-Secret: ${THUMB_SEEKER_TOKEN}" \ --data "$generate_post_data" "$WEBHOOK_URL" From 1f015654feebf6c70d6951c49b6b81d2801d7af4 Mon Sep 17 00:00:00 2001 From: Fabian Feldberg Date: Wed, 18 Jan 2023 14:58:47 +0000 Subject: [PATCH 627/936] add generated option to formvariable types --- manifest.schema.d.ts | 2 +- manifest.schema.json | 12 ++++++++---- schemas/definitions.json | 10 +++++++++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 7c5029c9..2fd19085 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -197,7 +197,7 @@ export type Name = string; /** * The type of the variable */ -export type Type = "string" | "boolean" | "uri" | "enum" | "oauth" | "dynamicEnum"; +export type Type = "string" | "boolean" | "uri" | "enum" | "oauth" | "dynamicEnum" | "generated"; /** * Describes the variable in the UI. Markdown links allowed. */ diff --git a/manifest.schema.json b/manifest.schema.json index a9c7f4f9..4c61551a 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -318,7 +318,8 @@ "uri", "enum", "oauth", - "dynamicEnum" + "dynamicEnum", + "generated" ] }, "description": { @@ -1330,7 +1331,8 @@ "uri", "enum", "oauth", - "dynamicEnum" + "dynamicEnum", + "generated" ] }, "description": { @@ -1710,7 +1712,8 @@ "uri", "enum", "oauth", - "dynamicEnum" + "dynamicEnum", + "generated" ] }, "description": { @@ -2808,7 +2811,8 @@ "uri", "enum", "oauth", - "dynamicEnum" + "dynamicEnum", + "generated" ] }, "description": { diff --git a/schemas/definitions.json b/schemas/definitions.json index ff344c5a..35ab9f68 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -142,7 +142,15 @@ "title": "Type", "type": "string", "description": "The type of the variable", - "enum": ["string", "boolean", "uri", "enum", "oauth", "dynamicEnum"] + "enum": [ + "string", + "boolean", + "uri", + "enum", + "oauth", + "dynamicEnum", + "generated" + ] }, "description": { "$id": "#/definitions/form-variable/description", From 288796714822f5ac25802ef37f124c671be51d9d Mon Sep 17 00:00:00 2001 From: Fabian Feldberg Date: Wed, 18 Jan 2023 15:06:58 +0000 Subject: [PATCH 628/936] tentative updates to cloudtrail manifest --- __tests__/validateIntegrationManifests.js | 3 +++ integrations/cloudtrail/manifest.json | 22 +++++-------------- .../cloudtrail/templates/default.json.hbs | 2 +- .../cloudtrail/templates/member.json.hbs | 2 +- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index cbaf1788..4e2d385a 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -36,6 +36,9 @@ const getFormVariableContext = formVariables => { case 'dynamicEnum': endpointContext[formVariable.key] = formVariable.key; break; + case 'generated': + endpointContext[formVariable.key] = formVariable.key; + break; } }); } diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 04898a86..b49e4952 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -17,28 +17,16 @@ }, "formVariables": [ { - "key": "accountId", - "name": "AWS account ID", - "description": "Enter your [AWS account ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html#FindingYourAWSId). The associated account must be configured to use CloudTrail Lake.", - "type": "string", - "placeholder": "123456", - "isHidden": true, - "isOptional": true, - "defaultValue": "" - }, - { - "key": "iamRoleArn", - "name": "Ingest IAM Role ARN", - "description": "Enter the ARN of the IAM Role for LaunchDarkly to assume to post to your AWS CloudTrail destination.", - "type": "string", - "isSecret": true + "key": "externalId", + "name": "External Id", + "description": "Provide this for your resource policy when setting up the integration in the AWS Console.", + "type": "generated" }, { "key": "ingestionChannelArn", "name": "Channel ARN", "description": "Enter the Channel ARN for LaunchDarkly to use.", - "type": "string", - "isSecret": true + "type": "string" } ], "capabilities": { diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index fb4474c8..3377e3a7 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -7,7 +7,7 @@ "eventTime": "{{timestamp.rfc3339}}", "eventSource": "launchdarkly", "eventName": "{{kind}}", - "recipientAccountId": "{{formVariables.accountId}}", + "externalId": "{{formVariables.externalId}}", "UID": "{{_id}}", "additionalEventData": { "type": "{{verbKind}}", diff --git a/integrations/cloudtrail/templates/member.json.hbs b/integrations/cloudtrail/templates/member.json.hbs index 4fca4e6a..2a1b0b87 100644 --- a/integrations/cloudtrail/templates/member.json.hbs +++ b/integrations/cloudtrail/templates/member.json.hbs @@ -7,7 +7,7 @@ "eventTime": "{{timestamp.rfc3339}}", "eventSource": "launchdarkly", "eventName": "{{kind}}", - "recipientAccountId": "{{formVariables.accountId}}", + "externalId": "{{formVariables.externalId}}", "UID": "{{_id}}", "additionalEventData": { "type": "{{verbKind}}", From cb6b8b7c1422ce3990ff3f8158e50d502be205f1 Mon Sep 17 00:00:00 2001 From: Fabian Feldberg Date: Wed, 18 Jan 2023 15:10:19 +0000 Subject: [PATCH 629/936] add accountId back in since we want to use the hidden field in the tempalte --- integrations/cloudtrail/manifest.json | 10 ++++++++++ integrations/cloudtrail/templates/default.json.hbs | 2 +- integrations/cloudtrail/templates/member.json.hbs | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index b49e4952..78ac96c7 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -16,6 +16,16 @@ "horizontal": "assets/images/square.svg" }, "formVariables": [ + { + "key": "accountId", + "name": "AWS account ID", + "description": "Enter your [AWS account ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html#FindingYourAWSId). The associated account must be configured to use CloudTrail Lake.", + "type": "string", + "placeholder": "123456", + "isHidden": true, + "isOptional": true, + "defaultValue": "" + }, { "key": "externalId", "name": "External Id", diff --git a/integrations/cloudtrail/templates/default.json.hbs b/integrations/cloudtrail/templates/default.json.hbs index 3377e3a7..fb4474c8 100644 --- a/integrations/cloudtrail/templates/default.json.hbs +++ b/integrations/cloudtrail/templates/default.json.hbs @@ -7,7 +7,7 @@ "eventTime": "{{timestamp.rfc3339}}", "eventSource": "launchdarkly", "eventName": "{{kind}}", - "externalId": "{{formVariables.externalId}}", + "recipientAccountId": "{{formVariables.accountId}}", "UID": "{{_id}}", "additionalEventData": { "type": "{{verbKind}}", diff --git a/integrations/cloudtrail/templates/member.json.hbs b/integrations/cloudtrail/templates/member.json.hbs index 2a1b0b87..4fca4e6a 100644 --- a/integrations/cloudtrail/templates/member.json.hbs +++ b/integrations/cloudtrail/templates/member.json.hbs @@ -7,7 +7,7 @@ "eventTime": "{{timestamp.rfc3339}}", "eventSource": "launchdarkly", "eventName": "{{kind}}", - "externalId": "{{formVariables.externalId}}", + "recipientAccountId": "{{formVariables.accountId}}", "UID": "{{_id}}", "additionalEventData": { "type": "{{verbKind}}", From e2f72b9cb171b06a37a93ff5bf14ad69d99da334 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 18 Jan 2023 20:18:01 -0500 Subject: [PATCH 630/936] Made a small tweak to the generated field description (external id) --- integrations/cloudtrail/manifest.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index 78ac96c7..a934864d 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -16,6 +16,12 @@ "horizontal": "assets/images/square.svg" }, "formVariables": [ + { + "key": "externalId", + "name": "External Id", + "description": "Use this [external id](https://docs.launchdarkly.com/integrations/cloudtrail) for your resource policy when setting up the integration in the AWS Console.", + "type": "generated" + }, { "key": "accountId", "name": "AWS account ID", @@ -26,12 +32,6 @@ "isOptional": true, "defaultValue": "" }, - { - "key": "externalId", - "name": "External Id", - "description": "Provide this for your resource policy when setting up the integration in the AWS Console.", - "type": "generated" - }, { "key": "ingestionChannelArn", "name": "Channel ARN", From 95eaec063c0bc38157cea434d3707f7e3b1b1668 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 19 Jan 2023 19:35:31 +0000 Subject: [PATCH 631/936] Update MS Teams docs links and incoming webhooks name --- integrations/msteams-app/manifest.json | 1 + integrations/msteams/manifest.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/msteams-app/manifest.json b/integrations/msteams-app/manifest.json index a2b487ca..20913d86 100644 --- a/integrations/msteams-app/manifest.json +++ b/integrations/msteams-app/manifest.json @@ -7,6 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.microsoft.com/en-us/microsoft-teams/group-chat-software", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/microsoft-teams", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["messaging"], diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index d3931f14..eaf03789 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -1,5 +1,5 @@ { - "name": "Microsoft Teams", + "name": "Microsoft Teams incoming webhooks", "version": "1.0.0", "overview": "Receive flag change notifications in your Teams workspaces.", "description": "Receive LaunchDarkly notifications in your Teams workspaces. Subscribe to changes in flags, projects, and other resources.", From 2f03c238c0eef0a8f2fa4bd9b19b0a22ae7fcdc8 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 19 Jan 2023 19:43:09 +0000 Subject: [PATCH 632/936] Update docs link --- integrations/msteams/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index eaf03789..e151f5d9 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.microsoft.com/microsoft-365/microsoft-teams/group-chat-software", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/microsoft-teams", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/microsoft-teams/webhooks", "privacyPolicy": "https://privacy.microsoft.com/en-us" }, "categories": ["messaging"], From f199bf9be514b9221e6d11b45d3ffa8392a0b4b3 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 26 Jan 2023 12:40:11 +0000 Subject: [PATCH 633/936] Create Datadog integration with private instance support (#423) * Create datadog integration with private instance support * Update README --- integrations/datadog-private/README.md | 9 +++ .../datadog-private/assets/horizontal.svg | 64 ++++++++++++++++ .../datadog-private/assets/square.svg | 41 ++++++++++ integrations/datadog-private/manifest.json | 75 +++++++++++++++++++ .../templates/default.json.hbs | 29 +++++++ .../templates/environment.json.hbs | 27 +++++++ .../datadog-private/templates/member.json.hbs | 23 ++++++ .../templates/project.json.hbs | 26 +++++++ 8 files changed, 294 insertions(+) create mode 100644 integrations/datadog-private/README.md create mode 100644 integrations/datadog-private/assets/horizontal.svg create mode 100644 integrations/datadog-private/assets/square.svg create mode 100644 integrations/datadog-private/manifest.json create mode 100644 integrations/datadog-private/templates/default.json.hbs create mode 100644 integrations/datadog-private/templates/environment.json.hbs create mode 100644 integrations/datadog-private/templates/member.json.hbs create mode 100644 integrations/datadog-private/templates/project.json.hbs diff --git a/integrations/datadog-private/README.md b/integrations/datadog-private/README.md new file mode 100644 index 00000000..aeafb4ce --- /dev/null +++ b/integrations/datadog-private/README.md @@ -0,0 +1,9 @@ +# Datadog + +[User documentation](https://docs.launchdarkly.com/integrations/datadog) + +[API documentation](https://docs.datadoghq.com/api/?lang=bash#events) + +Run `npm run curl datadog-private` in the root repository directory to generate a `curl` command to send data to Datadog. + +**Note:** This integration currently lives alongside our standard Datadog integration. This integration should only be enabled for customers who cannot use our standard integration because they have a private Datadog instance (unique host URL). diff --git a/integrations/datadog-private/assets/horizontal.svg b/integrations/datadog-private/assets/horizontal.svg new file mode 100644 index 00000000..de5ec9d6 --- /dev/null +++ b/integrations/datadog-private/assets/horizontal.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/datadog-private/assets/square.svg b/integrations/datadog-private/assets/square.svg new file mode 100644 index 00000000..f39a6ac1 --- /dev/null +++ b/integrations/datadog-private/assets/square.svg @@ -0,0 +1,41 @@ + + + + + + diff --git a/integrations/datadog-private/manifest.json b/integrations/datadog-private/manifest.json new file mode 100644 index 00000000..3b9d7641 --- /dev/null +++ b/integrations/datadog-private/manifest.json @@ -0,0 +1,75 @@ +{ + "name": "Datadog Events (private instance)", + "version": "1.0.0", + "overview": "Monitor LaunchDarkly changes in Datadog.", + "description": "Monitor LaunchDarkly flag and other change events in DataDog. Correlate feature rollouts to changes in your system’s operational health.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.datadoghq.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog", + "privacyPolicy": "https://www.datadoghq.com/legal/privacy" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + { + "key": "apiKey", + "name": "Datadog API key", + "type": "string", + "description": "Enter your Datadog [API key](https://app.datadoghq.com/organization-settings/api-keys).", + "isSecret": true + }, + { + "key": "hostURL", + "name": "Datadog host URL", + "description": "Your Datadog host URL. Read [How do I tell which Datadog site I am on?](https://docs.datadoghq.com/getting_started/site/#how-do-i-tell-which-datadog-site-i-am-on) if you are unsure which host URL to select.", + "type": "string", + "placeholder": "https://api.datadoghq.com" + }, + { + "key": "hideMemberDetails", + "name": "Hide member details", + "description": "Don't send related member email and names.", + "type": "boolean", + "defaultValue": false, + "isOptional": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "includeErrorResponseBody": false, + "endpoint": { + "url": "{{hostURL}}/api/v1/events", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "DD-API-KEY", + "value": "{{apiKey}}" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs", + "project": "templates/project.json.hbs", + "environment": "templates/environment.json.hbs", + "member": "templates/member.json.hbs", + "validation": "templates/default.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/datadog-private/templates/default.json.hbs b/integrations/datadog-private/templates/default.json.hbs new file mode 100644 index 00000000..dc90d87b --- /dev/null +++ b/integrations/datadog-private/templates/default.json.hbs @@ -0,0 +1,29 @@ +{ + "title": {{#if formVariables.hideMemberDetails}}"A member {{{titleVerb}}} {{{target.name}}}"{{else}}"{{{title.plainText}}}"{{/if}}, + "text": "%%% \n {{#if formVariables.hideMemberDetails}}A member {{{titleVerb}}} [{{{target.name}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", + "date_happened": {{timestamp.seconds}}, + "tags": [ + {{#if customProperties}} + {{#if customProperties.datadog}} + {{#if customProperties.datadog.values}} + {{#with customProperties}} + {{#each datadog.values}} + "{{{this}}}", + {{/each}} + {{/with}} + {{/if}}{{/if}}{{/if}} + {{#each tags}} + "{{{this}}}", + {{/each}} + {{#if project.key}}"project_key:{{project.key}}", + "project_name:{{project.name}}", + {{#if project.environment.key}}"environment_key:{{project.environment.key}}", + "environment_name:{{project.environment.name}}",{{/if}}{{/if}} + "{{kind}}_key:{{key}}", + "{{kind}}_name:{{name}}", + "action:{{verbKind}}", + {{#unless formVariables.hideMemberDetails }}"member:{{member.email}}",{{/unless}} + "kind:{{kind}}" + ], + "source_type_name": "launchdarkly" +} diff --git a/integrations/datadog-private/templates/environment.json.hbs b/integrations/datadog-private/templates/environment.json.hbs new file mode 100644 index 00000000..488b94d9 --- /dev/null +++ b/integrations/datadog-private/templates/environment.json.hbs @@ -0,0 +1,27 @@ +{ + "title": {{#if formVariables.hideMemberDetails}}"A member {{{titleVerb}}} {{{target.name}}}"{{else}}"{{{title.plainText}}}"{{/if}}, + "text": "%%% \n {{#if formVariables.hideMemberDetails}}A member {{{titleVerb}}} [{{{target.name}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", + "date_happened": {{timestamp.seconds}}, + "tags": [ + {{#if customProperties}} + {{#if customProperties.datadog}} + {{#if customProperties.datadog.values}} + {{#with customProperties}} + {{#each datadog.values}} + "{{{this}}}", + {{/each}} + {{/with}} + {{/if}}{{/if}}{{/if}} + {{#each tags}} + "{{{this}}}", + {{/each}} + "project_key:{{project.key}}", + "project_name:{{project.name}}", + "environment_key:{{key}}", + "environment_name:{{project.environment.name}}", + "action:{{verbKind}}", + {{#unless formVariables.hideMemberDetails }}"member:{{member.email}}",{{/unless}} + "kind:{{kind}}" + ], + "source_type_name": "launchdarkly" +} diff --git a/integrations/datadog-private/templates/member.json.hbs b/integrations/datadog-private/templates/member.json.hbs new file mode 100644 index 00000000..dfb8b124 --- /dev/null +++ b/integrations/datadog-private/templates/member.json.hbs @@ -0,0 +1,23 @@ +{ + "title": {{#if formVariables.hideMemberDetails}}"Member {{member._id}} {{{titleVerb}}} {{{target._id}}}"{{else}}"{{{title.plainText}}}"{{/if}}, + "text": "%%% \n {{#if formVariables.hideMemberDetails}}Member {{member._id}} {{{titleVerb}}} [{{{target._id}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", + "date_happened": {{timestamp.seconds}}, + "tags": [ + {{#if customProperties}} + {{#if customProperties.datadog}} + {{#if customProperties.datadog.values}} + {{#with customProperties}} + {{#each datadog.values}} + "{{{this}}}", + {{/each}} + {{/with}} + {{/if}}{{/if}}{{/if}} + {{#each tags}} + "{{{this}}}", + {{/each}} + "action:{{verbKind}}", + {{#unless formVariables.hideMemberDetails }}"member:{{member.email}}",{{/unless}} + "kind:{{kind}}" + ], + "source_type_name": "launchdarkly" +} diff --git a/integrations/datadog-private/templates/project.json.hbs b/integrations/datadog-private/templates/project.json.hbs new file mode 100644 index 00000000..a52b2e05 --- /dev/null +++ b/integrations/datadog-private/templates/project.json.hbs @@ -0,0 +1,26 @@ +{ + "title": {{#if formVariables.hideMemberDetails}}"A member {{{titleVerb}}} {{{target.name}}}"{{else}}"{{{title.plainText}}}"{{/if}}, + "text": "%%% \n {{#if formVariables.hideMemberDetails}}A member {{{titleVerb}}} [{{{target.name}}}]({{{target._links.site.href}}}){{else}}{{{title.markdown}}}{{/if}}{{#if details.markdown}}\n{{{details.markdown}}}{{/if}}{{#if comment}}\n**comment:** {{{comment}}}{{/if}} \n %%%", + "date_happened": {{timestamp.seconds}}, + "tags": [ + {{#if customProperties}} + {{#if customProperties.datadog}} + {{#if customProperties.datadog.values}} + {{#with customProperties}} + {{#each datadog.values}} + "{{{this}}}", + {{/each}} + {{/with}} + {{/if}}{{/if}}{{/if}} + {{#each tags}} + "{{{this}}}", + {{/each}} + "project_key:{{project.key}}", + "project_name:{{project.name}}", + "action:{{verbKind}}", + {{#unless formVariables.hideMemberDetails }}"member:{{member.email}}",{{/unless}} + "kind:{{kind}}" + + ], + "source_type_name": "launchdarkly" +} From cb4cebd31a241a6add4219b2284c4485e5cb6f8a Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 26 Jan 2023 16:02:02 +0000 Subject: [PATCH 634/936] [sc-185592] Add more detail to Grafana template and update docs link (#422) * Add more detail to grafana template and update docs link * Remove details and update URL --- integrations/grafana/manifest.json | 1 + integrations/grafana/templates/template.json.hbs | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 2a1eedc7..35634fb9 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -7,6 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://grafana.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/grafana", "privacyPolicy": "https://grafana.com/terms/" }, "categories": ["monitoring"], diff --git a/integrations/grafana/templates/template.json.hbs b/integrations/grafana/templates/template.json.hbs index 1cae8fb4..b9067a1c 100644 --- a/integrations/grafana/templates/template.json.hbs +++ b/integrations/grafana/templates/template.json.hbs @@ -1,5 +1,16 @@ { "time":{{ timestamp.milliseconds }}, - "tags":["launchdarkly","{{ kind }}","{{ name }}"], - "text":"{{ title.plainText }}" + "tags":[ + "kind:{{ kind }}", + {{#each tags}} + "ld_tag:{{{this}}}", + {{/each}} + {{#if project.key}}"project_key:{{project.key}}", + {{#if project.environment.key}}"environment_key:{{project.environment.key}}",{{/if}}{{/if}} + "{{kind}}_key:{{key}}", + "action:{{verbKind}}", + "launchdarkly" + ], + {{!-- ••••'s are used because grafana strips out additional whitespace and newlines in annotation descriptions --}} + "text":"{{{ title.plainText }}} {{#if comment}}•••• Comment: {{comment}} {{/if}}•••• {{{_links.details.href}}}" } From dcb3fccaa9a3d42504db5132111f17313d7bf3ef Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 8 Feb 2023 10:59:14 -0600 Subject: [PATCH 635/936] Created snowflake integration manifest for data export --- integrations/snowflake/LICENSE.md | 13 +++++++++++ .../snowflake/assets/images/horizontal.svg | 1 + .../snowflake/assets/images/square.svg | 1 + integrations/snowflake/manifest.json | 22 +++++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 integrations/snowflake/LICENSE.md create mode 100644 integrations/snowflake/assets/images/horizontal.svg create mode 100644 integrations/snowflake/assets/images/square.svg create mode 100644 integrations/snowflake/manifest.json diff --git a/integrations/snowflake/LICENSE.md b/integrations/snowflake/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/snowflake/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/snowflake/assets/images/horizontal.svg b/integrations/snowflake/assets/images/horizontal.svg new file mode 100644 index 00000000..5533ae5d --- /dev/null +++ b/integrations/snowflake/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/snowflake/assets/images/square.svg b/integrations/snowflake/assets/images/square.svg new file mode 100644 index 00000000..70bb8a73 --- /dev/null +++ b/integrations/snowflake/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/snowflake/manifest.json b/integrations/snowflake/manifest.json new file mode 100644 index 00000000..c6de5429 --- /dev/null +++ b/integrations/snowflake/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Snowflake", + "version": "1.0.0", + "overview": "Export experimentation metadata events.", + "description": "Export your experimentation metadata events to Snowflake.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.snowflake.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/snowflake", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "dataExport" + }, + "otherCapabilities": ["dataExport"] +} From ee98b2f9c8c8fb352b5e88953121b4ba5c476837 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 8 Feb 2023 12:28:16 -0600 Subject: [PATCH 636/936] Updated snowflake horinzontal logo --- integrations/snowflake/assets/images/horizontal.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake/assets/images/horizontal.svg b/integrations/snowflake/assets/images/horizontal.svg index 5533ae5d..dcf9e930 100644 --- a/integrations/snowflake/assets/images/horizontal.svg +++ b/integrations/snowflake/assets/images/horizontal.svg @@ -1 +1 @@ - + From 129d32cee208a57e2aa6f0220f9b4b520fc067bd Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 8 Feb 2023 15:30:32 -0600 Subject: [PATCH 637/936] Added horinzontal logo for snowflake --- .../snowflake/assets/images/horizontal.svg | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/integrations/snowflake/assets/images/horizontal.svg b/integrations/snowflake/assets/images/horizontal.svg index dcf9e930..5b792631 100644 --- a/integrations/snowflake/assets/images/horizontal.svg +++ b/integrations/snowflake/assets/images/horizontal.svg @@ -1 +1,27 @@ - + + logo-blue-svg + + + + + + + + + + + + + + + + + + + + + + From fb12c2111901088cdad92a458395641f66493219 Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Wed, 8 Feb 2023 15:11:52 -0800 Subject: [PATCH 638/936] Adds docs link --- integrations/dynatrace/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/dynatrace/README.md b/integrations/dynatrace/README.md index 84df4a58..09a8f6b1 100644 --- a/integrations/dynatrace/README.md +++ b/integrations/dynatrace/README.md @@ -1,6 +1,6 @@ # Dynatrace -[User documentation](https://example.com) +[User documentation](https://docs.launchdarkly.com/integrations/dynatrace) [API documentation](https://www.dynatrace.com/support/help/extend-dynatrace/dynatrace-api/environment-api/events/post-event/) From 1c61d581426e2f1318a09a27c7779d6a1fe01df5 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 9 Feb 2023 15:28:09 +0100 Subject: [PATCH 639/936] [sc-188305] Add Cloudquery learn more card (#426) * Releasing changes publicly * Bump path-parse from 1.0.6 to 1.0.7 Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump ws from 7.4.2 to 7.5.3 Bumps [ws](https://github.com/websockets/ws) from 7.4.2 to 7.5.3. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.2...7.5.3) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] * Releasing changes publicly * Releasing changes publically (#9) * Releasing changes publicly * Bump url-parse from 1.5.3 to 1.5.8 (#12) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.8. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.8) --- updated-dependencies: - dependency-name: url-parse dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Releasing changes publicly * Adding Atlassian Compass to LD integrations page (#16) * Adding Atlassian Compass to LD integrations page * Update integrations/compass/assets/images/horizontal.svg Co-authored-by: Henry Barrow * Update integrations/compass/assets/images/square.svg Co-authored-by: Henry Barrow Co-authored-by: Matt Dellandrea <9593724+mdellandrea@users.noreply.github.com> Co-authored-by: Henry Barrow * Fix schema from bad merge (#17) * Imiller/ch78837/update some categories (#130) * add missing categories messaging, code-references, log-management, issue-tracking, analytics * update msteams * update honeycomb, logdna, dynatrace * update appoptics, datadog, grafana * update new relic, signalfx, splunk * update appdynamics and jira * update circleci, heap, pendo * update gitlab and trello * update git and slack app * update bitbucket pipes (not pipelines/flags) and github * Imiller/ch78837/remove unused categories (#131) * remove unused from sample-integration * remove from base schema & manifest schema * Update s3 buckets in circle config (#132) * Add validation template (#135) * coderefs copy changes (#138) * coderefs copy changes * update icon * cleanup * Update manifest.json * Update git integration name to "Code references" (#139) * update coderefs integration title * remove yarn.lock * Imiller/ch69350/audit appdynamics template and manifest (#65) * Resolve merge conflict (#141) * Promoting from prod to catfood (#114) * Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru * Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Deploy to prod (#110) * Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Henry Barrow Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Promote staging to production (#119) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Isabelle Miller * Deploy Catfood from production (#121) * Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru * Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * Deploy to prod (#110) * better logdna link (#112) * Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates * Promote staging to production (#119) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Promoting from stg to prod (#127) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Henry Barrow Co-authored-by: Isabelle Miller * Deploy new relic to prod (#129) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add more detail to new relic template (#126) Co-authored-by: Henry Barrow Co-authored-by: Isabelle Miller * Promote staging -> prod (#133) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add more detail to new relic template (#126) * Imiller/ch74105/add member details to existing integrations (#89) * update msteams default template * add user data to dynatrace payload * add instructions for testing signalfx * add user data to signalfx template * remove entire comment field if no comment * make user link to mailto instead of user payload * fix trailing comma Co-Authored-By: Henry Barrow * remove superfluous space Co-Authored-By: Henry Barrow * move comma to inside if to fix invalid json * fix trailing whitespace * move trailing commas to inside handlebars ifs * add if around name for in case it's not set * add user data to splunk payload * only display comment field if there is a comment * revert msteams default template to original * signalfx - separate user and user email into two fields * splunk - separate user and user email into separate fields * update spacing Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * separate dynatrace user into name and email Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update spacing on splunk Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * remove lingering parentheses * don't display user name if both don't exist * fix capitalization * add missing space * add missing space Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * Imiller/ch78837/update some categories (#130) * add missing categories messaging, code-references, log-management, issue-tracking, analytics * update msteams * update honeycomb, logdna, dynatrace * update appoptics, datadog, grafana * update new relic, signalfx, splunk * update appdynamics and jira * update circleci, heap, pendo * update gitlab and trello * update git and slack app * update bitbucket pipes (not pipelines/flags) and github * Imiller/ch78837/remove unused categories (#131) * remove unused from sample-integration * remove from base schema & manifest schema * Update s3 buckets in circle config (#132) Co-authored-by: Isabelle Miller Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * Deploy prod (#136) Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Henry Barrow Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * renamed coderefs folder to git * delete coderefs folder * Add new capability to manifest schema (#146) * Added OAuth tidbit (#147) * Added OAuth tidbit * Added missing period. * Copy *.svgs to static.launchdarkly.com (#148) * Rename remote update to trigger (#149) * Rename remote update -> trigger * Update title * Update docs * Update docs/capabilities.md Co-authored-by: Isabelle Miller Co-authored-by: Isabelle Miller * Testing Azure Event Hub integration * Requested changes * Requested changes * Update heap url (#154) * Change New Relic integration to use their deployment api (#153) * adding code snippets and validation template info to docs (#155) * Bump lodash from 4.17.15 to 4.17.19 (#158) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fixed name of integration (from azure-event-hub to azure-event-hubs) * Added integration icon * Remove validation templates from integrations with configurable hosts (#160) * Remove MSteams validation (#163) * Re-enable validation template for configurable host integrations (#165) * Imiller/ch83288/add trigger to datadog manifest (#168) * add trigger capability to datadog manifest * add parser * add note to docs about payload * Imiller/ch83287/add trigger to honeycomb manifest (#169) * add trigger to honeycomb + update readme * add sample payload * add some more detail to datadog readme * add parser * remove value from parser * switch out launchdarkly for team name var * Revert "switch out launchdarkly for team name var" This reverts commit 91cdffd4cd10f84876fdebd1388e033a5dde642f. * Revert "remove value from parser" This reverts commit 002deab54ed53d416c5379da916de07a4d0c6f67. * update link to integrations center and remove value from parser (#170) * Update event-hub integration link * Fix broken trigger doc link (#172) * Minor trigger doc update (#173) * Imiller/ch84138/use goaltender parsers when handling inbound (#174) * rename parser paths * rename external condition parser * split trigger parser out into separate parser schema file * remove redundant id paths * Revert "remove redundant id paths" This reverts commit c8c0e7c6a7653c06a03315836f807a5a1fed0cdd. * Revert "split trigger parser out into separate parser schema file" This reverts commit bc3adb0c1a1f0c4e278b9e7a11c21ae38868eb9b. * Revert "rename external condition parser" This reverts commit 7a5dcdbd876c2fbba14f4bd66d7777b6deb1c55d. * Revert "rename parser paths" This reverts commit c131dca2fb0760a1bf32205377a1d749597a896a. * rename trigger parser from 'parser' to 'trigger-parser' * oops make it trigger parser, not trigger body parser * Use the COMMIT_MSG var (#175) * Add support for generic trigger (#176) * Add generic trigger * Update description and logo * Remove templates * Add readme * Change name to Generic (#178) * Update README to call out "trigger" auto-append (#179) * Update README * grammar * Require isOptional = true when defaultValue is used (#181) * Make datadog host optional * Use isOptional wherever defaultValue is used and add test lock this change in * update docs * use org-global for deploy-to-s3 jobs (#182) * Update bucket names in circle config (#184) * clean up circle config * Update datadog trigger parser and readme (#183) * [ch87329] Add automatic clubhouse ticketeting for private repo (#185) * Add generic trigger icon (#186) * [ch87329] Fix clubhouse link (#187) * [ch87972] updated trigger urls and descriptions (#188) * [ch87971] Add new eventName field and default value (#190) * Add new eventName field and default value * Add deprecation warning * Add eventName to all triggers * Fix generic template parser paths (#191) * readme update for generic triggers (#189) * adding some periods (#194) * Bump yargs-parser from 18.1.1 to 18.1.3 (#197) Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 18.1.1 to 18.1.3. - [Release notes](https://github.com/yargs/yargs-parser/releases) - [Changelog](https://github.com/yargs/yargs-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/yargs-parser/compare/v18.1.1...v18.1.3) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [ch83496] Upload archive of manifests to artifacts bucket instead of directy copying to deploy buckets (#198) * Send webhook to spinnaker when build is done (#199) * [ch83496] auto deploy staging pt 2 (#200) * Add Azure Active Directory docs link (#201) * [ch90065] add trigger capability to signalfx (#203) * add trigger capability * add signalfx webhook doc link to readme * [ch91335] remove deprecated alertName trigger parser field (#205) * add triggers capability * eventName and alertName should be the same * chagne event_type to condition_name * remove alertName * update doc link * update capabilities.md to use eventName instead of alertName * remove alertName from all integration manifests * remove alertName from schemas * remove trigger capability from new relic manifest since it should be on a different pr * [ch90570] add testEventNameRegexp field to schema (#206) * add testEventNameRegexp field to schema * add note to doc * add testEventNameRegexp to propertyNames list * [ch90823] add triggers capability (#204) * add triggers capability * eventName and alertName should be the same * chagne event_type to condition_name * remove alertName * update doc link * update name and description" * update overview as well * make exact match Co-authored-by: Henry Barrow * remove triggers from overview and description Co-authored-by: Henry Barrow * [ch90064] add trigger capability to dynatrace manifest (#202) * add trigger * add dynatrace doc link to readme * change parser fields to match datadog * add testEventNameRegexp * [ch92301] add test event to datadog trigger (#207) * add test event regex for datadog * update honeycomb manifest for tests * remove test events & change eventName back * Default is not an accepted value (#208) * [ch78771] update templates to use new displayName field (#209) * add displayName to sample context * update dynatrace flag template * add displayName to all flag sample contexts * add displayName to env sample contexts * add displayName to other sample xontexts * add displayName to project sample contexts * update elastic template * update logdna template * update new relic template (including deprecated just for kicks) * update signalfx template * update splunk template * [ch94760] Save junit tests on Circle (#210) * Use pinned node orb * use junit and save results * [ch95983] add dynamicEnum formVariable type field (#212) * add displayName to sample context * update dynatrace flag template * add displayName to all flag sample contexts * add displayName to env sample contexts * add displayName to other sample xontexts * add displayName to project sample contexts * update elastic template * update logdna template * update new relic template (including deprecated just for kicks) * update signalfx template * update splunk template * add dynamicEnum to formVariables type definition * add sample dropdownOptions field of dynamicEnum type * refactor endpoint out of auditLogEventsHook for general use across capabilities * add parser to dynamicOptions schema * refactor endpoints * add test to check dynamicEnum has dynamicOptions and vice versa * [ch95983] Add reqres API endpoint to sample-integration manifest (#213) * Add reqres API endpoint to sample-integration manifest * make sure dynamic enum is passed to context in preview and tests * Add color as query param * [ch95892] Goaltender info for Tray (tray.io) (#211) * [ch95983] refactor reusable components out of schema (#214) * refactor documentation url out of trigger * replace external condition endpoint with generic * factor out the subparts of the reusable endpoint to allow for description flexibility * replace external condition endpoint properties * refactor endpointProperties * refactor out capability parsers into parser file * Add string type to endpoint method and make it required (#215) * Remove oauth from sample-integration (#216) * Move formVariable items to definitions.json (#217) * [ch95986] Add approval capability schema (#218) * Move formVariable items to definitions.json * Add approval capability * Remove periods in description * generate typescript type definitions from schema JSON * fix indentation * [ch97425] Add first draft of ServiceNow manifest (#220) * Add first draft of servicenow manifest * Bump jest version to remove vulnerability warning * Ensure defualt values are provided when formVariable is optional (#221) * Imiller/ch98557/update approvalParser schema to have approvalId (#222) * add approvalId to approval parser * add approvalId to propertyNames * best guess at servicenow approvalId path * pull package-lock.json over from master * Add short description query param to creation template to verify everything is working (#223) * add urlTemplate to approvalparser (#224) * add deletionRequest * update servicenow status endpoint (#225) * Use Implementing state as Servicenow approval condition (#226) * [ch98744] Add justification to servicenow manifest (#227) * Add justification * Add url template * Add Servicenow svgs (#228) * [ch100894] add new memberListRequest to approvals schema (#229) * add member list request and new member list parser to approvals schema * forgot to add memberListRequest to property list * actually probably want this to be required * add servicenow memberListRequest * make not required for now so it doesn't break all the goaltender tests * oops forgot leading slash * change user to member * update snow manifest * well that was a bug * missed some members * missed some more * update descriptions * how many typos can i make in a day * fix typo (#230) * Imiller/ch97553/make MemberListRequest required (#231) * fix typo * make required * Make deletion request required (#232) * [ch101451] Add postApplyRequest and add parser to deletionRequest (#233) * Add postApplyRequest to schema and add parser to deletionRequest * Make parsers required and move memberListRequest up * [ch101677] add requested_by to SNow creation requests (#234) * it turns out it's user_name, not sys_id, that we wanted * add requested_by to creation request * pass member id from context Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow * Add link to LD approval request to ServiceNow change request (#235) * Minor vscode card updates (#237) * Fix externalMemberId bug (#239) * Reject approval requests when change request is in state 4 (#238) * Improve servicenow description and sentance case environment form variable name (#240) * [ch102661] Improve serveral horizontal icons (#241) * Route staging deploys through Thumb Seeker (#242) * add IntelliJ card (#236) * [ch103605] remove external condition (#243) * remove external condition * remove tests * [ch103708] add otherCapabilities array to phase out legacy kind (#244) * replace legacy with externalCapabilities * everything at once for pre commits * add sso and ide capabilities * categorize sso and ide integrations * add legacy back in + external and externalEnterprise capabilities * remove slackWebhooks from externalCapabilities * add legacy back in to manifests * add test to enforce at least one capability * remove externalEnterprise * change external to other * add minItems to enforce * Adding a better link for the pendo integration (#245) * Add basicAuthHeaderValue helper documentation and example (#246) * Add JSON body template string to all approval requests (#247) * Add horizontal appoptics logo (#248) * Update sample context to include 'simple' timestamp format (#249) * [ch105018] Use JSON body for ServiceNow creation request and set start and end dates (#250) * Use jsonBody for request * Include start and end date in creation request * bump handlebars package due to vulnerability (#253) * Bump hosted-git-info from 2.8.8 to 2.8.9 (#254) * bump lodash (#256) * [ch105018] Add ServiceNow C0 manifest (#251) * Use jsonBody for request * Update servicenow-c0 manifest * Bump ws from 7.4.2 to 7.4.6 (#257) Bumps [ws](https://github.com/websockets/ws) from 7.4.2 to 7.4.6. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.2...7.4.6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Henry Barrow * [ch105018] Update servicenow-c0 creation request path (#258) * Update servicenow-c0 creation request path * fix creation request url * Temporarily use plaintext password for servicenow-c0 manifest (#259) * Update servicenow-c0 urlTemplate based on provided information (#260) * [ch105018] Update servicenow-c0 creation request based on feedback (#262) * Update servicenow-c0 to use isSecret for password * Update servicenow-c0 creation request based on feedback * Add formatWithOffset helper (#263) * Include timestamp offset in servicenow-c0 and add additional required field (#264) * [ch111110] Use nvmrc file and node v14 (#266) * Use nvmrc file and node v14 * Update docs * [ch111068] fake akamai integration (#265) * Added zendesk goaltender card * Removed unused license file for zendesk * Update integrations/zendesk/manifest.json nice, looks good to me Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * [ch110701] Utilize reserved custom properties for servicenow-c0 manifest" (#268) * start using custom properties in servicenow-c0 manifest * remove environment form variables * servicenow-c0 ensure end_date is after start_date (#269) * fake fastly integration (#270) * Update servicenow-c0 to use custom properties in postApply and deletion requests (#271) * Descrease timestamp offset (#272) * Added description to reserved custom properties and updated datadog reserved custom property to have description * Updated sample reserved custom property in docs * [ch113600] Update servicenow-c0 description, short_desription, start_date, and end_date (#274) * Update servicenow-c0 description, short_desription, start_date, and end_date * Use double brackets when possible * Add leading \n to serivenow-c0 justification (#275) * [ch110172] Add flag form variables to manifest schema (#276) * Add flag form variables to manifest schema * Fix grammar * Bump path-parse from 1.0.6 to 1.0.7 (#277) Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [ch109967] Add flagFormVariables to servicenow-c0 manifest (#279) * Add flagFormVariables to servicenow-c0 manifest * Add userID to postApply and deletion requests * Add emailLocalPart to all sample context (#280) * Updating heap and pendo doc URLs (#278) * Update servicenow-c0 manifest to use emailLocalPart as serviceNow username (#281) * Reduce start and end date offest for servicenow-c0 (#283) * Use git gatsby tray docs link (#282) * Remove state parameter form servicenow-c0 creation request (#285) * Updating ansible docs link (#284) * [ch120153] Add support for new feature store capability (#286) * add new manifest for featureStore and cloudflare * fixing typo * update svg, update description * run prettier * removing period * fix newline * fixing whitespace, removing placeholders * Added includeErrorResponseBody property in autiLogEventHook capability * Fixed typo * [ch122281] Only include error response body for integrations that do not have customizable domains (#288) * Whitelist including error response body for integrations that do not have customizable domains * Remove feature from signalFX * Bump tmpl from 1.0.4 to 1.0.5 (#289) Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5. - [Release notes](https://github.com/daaku/nodejs-tmpl/releases) - [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5) --- updated-dependencies: - dependency-name: tmpl dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add cache control headers to integrations svgs (#290) * Remove unused copy_to_s3.sh (#291) * [sc-123860] Clubouse GH action -> Shortcut (#292) * Clubouse GH action -> Shortcut * Update name of action * [sc-122283] add test to check domain is static when includeErrorResponseBody is set to true (#293) * this should work * account for dynamic subdomains * check for multiple substrings in hostname * [sc-124497] add connector ui blocks to prelim capability schema (#294) * add connector ui blocks to prelim capability schema * forgot to commit parser * update description * forgot to actually add to base.json (#295) * a few small edits (#296) * forgot brace * some updates * naming updates and add new types (#297) * small updates for cloudflare * updating doc links (#299) * [sc-128309] Update labels for Clouflare KV ID form field (#300) Also adds missing periods to description text. * [sc-126368] add external references to slack-app (#301) * remove lingering redundant parser property from externalReferences * update metadata block paths and add hyperlink type * Added definitions and schema for UI block and elements for external flag refs capability * Updated with PR feedback and replaced timestamp type with isTimestamp boolean boolean * Made ui block text required and updated jira ui block template string * [sc-130013] add placeholders to cloudflare manifest (#303) Uses example values which are straight out of Cloudflare's own API docs See: https://api.cloudflare.com/ * Added UI blocks for slack app * Fixing slack context block timestamp defaulting to the 70s * [sc-129873] add eu data center option for new relic one integration (#308) * feat: add and use new formVariable * feat: integration working with new EU endpoint * docs: fix typo in readme * fix: fix existing US url * fix: fix existing US url * chore: Apply suggestions from code review Co-authored-by: Henry Barrow * fix: escape quotes in description * fix: remove includeErrorResponseBody as domain is not static anymore * feedback: account for existing integrations not having domain field Co-authored-by: Henry Barrow * chore: make things pretty Co-authored-by: Henry Barrow * [sc-132618] Upgrade node to v16 and resolve secuirty vulnerabilities (#309) * Upgrade node to v16 * Resolve security vulnerabilities * Add the option to change where default information is populated in ServiceNow (#310) * Renaming external refs to flag links * More renaming * Renamed link context -> flag link context * Update Cloudflare manifest * Update feature store capability schema * Initial integration for ld2git. * add template for webhook event. * Review comments. * adding general integration docs. * scoping out secret/token based on value set. * expose ld api token. * cleanup. * Fix description. Co-authored-by: Isabelle Miller * Fix secret description. Co-authored-by: Isabelle Miller * Update integrations/ld-to-git/manifest.json * Update integrations/ld-to-git/manifest.json * Escaping some flag link templates * Fix Cloudflare manifest JSON pointers * [sc-129419] First draft documentation for feature store capability (#313) * first draft feature store capability * removing ... * Update docs/capabilities.md Co-authored-by: Jaz White * swap sections * Apply suggestions from code review Co-authored-by: Molly * PR feedback * sample to example * Apply suggestions from code review Co-authored-by: Molly * Apply suggestions from code review Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Jaz White Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> * Add 5 minute offset to end date in servicenow creation request (#317) * Updated empty state text * Add all 6 Datadog sites to Datadog manifest (#319) * Updated flag link metadata schema to be an object instead of an array * Removed unused flag link metadata property for slack app * Replace slack manifest's flag link permalink metadata attribute with deeplink since they are both the same * Updated URLs for flag links docs * Updated Jira header text match Atlassian's branding * [sc-137630] remove parser for delivery request (#323) * [sc-137630] remove parser for delivery request * [sc-138928] add generic feature store integration manifest for testing (#324) Co-authored-by: Henry Barrow Co-authored-by: Carmen Quan Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> * Increase servicenow-c0 end_date offset to 5 mins (#325) * Increase servicenow-c0 start_date from 1s to 5s (#326) * Renaming references to master to be main * Rename master to main in bash script * Added Dynatrace cloud automation manifest for trigerring flag change events in LaunchDarkly from their cloud sequence * Updated the flag links capaibility verbiage to match the new design verbiage * Small text change * Bump url-parse from 1.5.3 to 1.5.9 (#332) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.9. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.9) --- updated-dependencies: - dependency-name: url-parse dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Removing date/time elements from the flag links ui blocks since these are no longer needed in the new design * request issue if user is not service owner * Updated context text for jira * Remove unnecessary line breaks (#336) * Remove unnecessary line breaks * Trim trailing whitespace * Remove flag link stub * [sc-143291] Add a hide member details checkbox to datadog integration (#333) * add hideMemberDetails formVariable * dont send memberName tag if hideMemberDetails is true * build title from titleVerb and targetName for project and env templates * default template sends nothing for member events with hideMemberDetails, and filters memberDetails for other events if required * fix tag generation in project and env templates * update logic in default template, add equalWithElse helper * [sc-145741] docs: copyedits and minor cleanup (#338) * docs: copyedits and minor cleanup * Apply suggestions from code review Co-authored-by: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> * Update docs/capabilities.md * Apply suggestions from code review: integrations team, not integration team Co-authored-by: Henry Barrow * remove mention of auth per discussion here: https://github.com/launchdarkly/integration-framework-private/pull/338/files#r828030266 * one more integration -> integrations team correction Co-authored-by: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Henry Barrow * Back merge public to pick up Compass tile (#342) Co-authored-by: Isabelle Miller Co-authored-by: Arnold Trakhtenberg Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich Co-authored-by: Rich Manalang Co-authored-by: Wei We Lu Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Blake Wilson Co-authored-by: Dan O'Brien Co-authored-by: Kevin Brackbill Co-authored-by: Ben Woskow Co-authored-by: Clifford Tawiah Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Co-authored-by: carmenquan Co-authored-by: Dan O'Brien Co-authored-by: Jaz White Co-authored-by: Fabian Co-authored-by: Christie Williams Co-authored-by: Mahek Chheda Co-authored-by: Mahek Chheda <86633378+mchheda-ld@users.noreply.github.com> Co-authored-by: Christie Williams Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Fabian * Releasing changes publicly * Releasing changes publicly * Releasing changes publicly (#18) * Releasing changes publicly (#19) * Bump minimatch from 3.0.4 to 3.1.2 (#20) Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2. - [Release notes](https://github.com/isaacs/minimatch/releases) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump decode-uri-component from 0.2.0 to 0.2.2 (#21) Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump json5 from 2.1.3 to 2.2.3 (#22) Bumps [json5](https://github.com/json5/json5) from 2.1.3 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.1.3...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: Add CloudQuery integration (#23) * feat: Add CloudQuery integration * Remove 'data' as per CR * Update integrations/cloudquery/manifest.json Co-authored-by: Dan O'Brien --------- Co-authored-by: Kemal Hadimli Co-authored-by: Dan O'Brien * Update package-lock * fix linter error * Revert zapier logo change * Revert Datadog manifest change --------- Signed-off-by: dependabot[bot] Co-authored-by: Ben Woskow Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: parrishioner Co-authored-by: Matt Dellandrea <9593724+mdellandrea@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Arnold Trakhtenberg Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich Co-authored-by: Rich Manalang Co-authored-by: Wei We Lu Co-authored-by: Blake Wilson Co-authored-by: Dan O'Brien Co-authored-by: Kevin Brackbill Co-authored-by: Clifford Tawiah Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Co-authored-by: carmenquan Co-authored-by: Dan O'Brien Co-authored-by: Jaz White Co-authored-by: Fabian Co-authored-by: Christie Williams Co-authored-by: Mahek Chheda Co-authored-by: Mahek Chheda <86633378+mchheda-ld@users.noreply.github.com> Co-authored-by: Christie Williams Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Fabian Co-authored-by: Kemal <223029+disq@users.noreply.github.com> Co-authored-by: Kemal Hadimli --- .../cloudquery/assets/cq-logo-mark.svg | 42 +++++++++++++++++++ integrations/cloudquery/manifest.json | 21 ++++++++++ package-lock.json | 20 ++++----- 3 files changed, 70 insertions(+), 13 deletions(-) create mode 100644 integrations/cloudquery/assets/cq-logo-mark.svg create mode 100644 integrations/cloudquery/manifest.json diff --git a/integrations/cloudquery/assets/cq-logo-mark.svg b/integrations/cloudquery/assets/cq-logo-mark.svg new file mode 100644 index 00000000..29f6dcfd --- /dev/null +++ b/integrations/cloudquery/assets/cq-logo-mark.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/cloudquery/manifest.json b/integrations/cloudquery/manifest.json new file mode 100644 index 00000000..42d12c95 --- /dev/null +++ b/integrations/cloudquery/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "CloudQuery", + "version": "1.0.1", + "overview": "Export LaunchDarkly data to any supported CloudQuery destination.", + "description": "The CloudQuery LaunchDarkly plugin pulls data from LaunchDarkly and loads it into any supported CloudQuery destination (e.g. PostgreSQL).", + "details": "CloudQuery is an open source high performance data integration platform built for developers.", + "author": "CloudQuery", + "supportEmail": "support@cloudquery.io", + "links": { + "site": "https://www.cloudquery.io/docs/plugins/sources/launchdarkly/overview", + "supportWebsite": "https://www.cloudquery.io/discord", + "privacyPolicy": "https://www.cloudquery.io/privacy" + }, + "categories": ["analytics", "developer-tools"], + "icons": { + "square": "assets/cq-logo-mark.svg", + "horizontal": "assets/cq-logo-mark.svg" + }, + "otherCapabilities": ["external"], + "requiresOAuth": false +} diff --git a/package-lock.json b/package-lock.json index 699e4cce..2b3922ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4622,13 +4622,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -11469,13 +11466,10 @@ "dev": true }, "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" - } + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true }, "jsonpointer": { "version": "5.0.0", From 1686d0a5952c179402a4c5976abedad76f10c7f0 Mon Sep 17 00:00:00 2001 From: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Date: Thu, 9 Feb 2023 08:50:51 -0600 Subject: [PATCH 640/936] Update integrations/snowflake/LICENSE.md Co-authored-by: Henry Barrow --- integrations/snowflake/LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake/LICENSE.md b/integrations/snowflake/LICENSE.md index 9dcbe896..04b7d222 100644 --- a/integrations/snowflake/LICENSE.md +++ b/integrations/snowflake/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020 Catamorphic Co. +Copyright 2023 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From f60ac423bf86993cd2664b88764a79762e38b46a Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Fri, 10 Feb 2023 10:37:41 -0800 Subject: [PATCH 641/936] Updates New Relic URL --- integrations/new-relic/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/new-relic/README.md b/integrations/new-relic/README.md index 09e40202..cd500da1 100644 --- a/integrations/new-relic/README.md +++ b/integrations/new-relic/README.md @@ -2,7 +2,7 @@ **Important:** This integration requires a New Relic Pro account, including a paid Insights subscription. -User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic](https://example.com) +User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic One](https://docs.launchdarkly.com/integrations/new-relic) API documentation for this integration is available at the New Relic documentation site: [New Relic](https://docs.newrelic.com/docs/insights/insights-data-sources/custom-data/introduction-event-api) From 36ebb54317448a2021001d0470d1c2bee6c906e9 Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Mon, 13 Feb 2023 12:19:35 -0800 Subject: [PATCH 642/936] Updates Grafana URL --- integrations/grafana/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/grafana/README.md b/integrations/grafana/README.md index 2b43043e..05afaeb7 100644 --- a/integrations/grafana/README.md +++ b/integrations/grafana/README.md @@ -1,6 +1,6 @@ # Grafana -[User documentation](https://example.com) +[User documentation](https://docs.launchdarkly.com/integrations/grafana) [API documentation](https://grafana.com/docs/grafana/latest/http_api/annotations/#create-annotation) From 5ac3417f699ac07899faf6b67a13d26fbfdf1554 Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Tue, 14 Feb 2023 09:13:55 -0800 Subject: [PATCH 643/936] Trigger build From eb0f962124097fd7fd7b6524b7200e78fed37b6c Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 15 Feb 2023 16:12:49 +0100 Subject: [PATCH 644/936] [sc-188862] add boolean useStandardWebhookPayload attribute to auditLogEventHook capability (#427) * add new useStandardWebhookPayload property to audit log capability * validate that templates do not exist when using default webhook payload * update msteams-app manifest to useStandardWebhookPayload=true and remove templates directory * typo in formVariables.secret description --- __tests__/validateIntegrationManifests.js | 19 +++++++++++++++++++ integrations/msteams-app/manifest.json | 7 +++---- .../msteams-app/templates/default.json.hbs | 14 -------------- manifest.schema.d.ts | 5 +++++ manifest.schema.json | 10 +++++++++- schemas/capabilities/auditLogEventsHook.json | 10 +++++++++- 6 files changed, 45 insertions(+), 20 deletions(-) delete mode 100644 integrations/msteams-app/templates/default.json.hbs diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 4e2d385a..29d25e90 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -304,6 +304,11 @@ describe('All integrations', () => { test.each(manifests)( 'Templates can be successfully rendered for %s', (key, manifest) => { + const useStandardWebhookPayload = _.get( + manifest, + 'capabilities.auditLogEventsHook.useStandardWebhookPayload', + false + ); const flagTemplatePath = _.get( manifest, 'capabilities.auditLogEventsHook.templates.flag', @@ -334,6 +339,20 @@ describe('All integrations', () => { 'capabilities.auditLogEventsHook.templates.member', null ); + if (useStandardWebhookPayload) { + const templatePaths = [ + flagTemplatePath, + projectTemplatePath, + environmentTemplatePath, + defaultTemplatePath, + validationTemplatePath, + memberTemplatePath, + ]; + for (const path of templatePaths) { + expect(path).toBe(null); + expect(existsSync(`./integrations/${key}/templates`)).toBe(false); + } + } if (flagTemplatePath) { const path = `./integrations/${key}/${flagTemplatePath}`; expect(existsSync(path)).toBe(true); diff --git a/integrations/msteams-app/manifest.json b/integrations/msteams-app/manifest.json index 20913d86..fd6d75a5 100644 --- a/integrations/msteams-app/manifest.json +++ b/integrations/msteams-app/manifest.json @@ -26,7 +26,7 @@ { "key": "secret", "name": "Secret", - "description": "Enter the secret shared between Microsoft Teams and Slack-App", + "description": "Enter the secret shared between Microsoft Teams and LaunchDarkly", "type": "string", "isSecret": true, "isOptional": true, @@ -52,9 +52,8 @@ "actions": ["*"] } ], - "templates": { - "default": "templates/default.json.hbs" - } + "templates": {}, + "useStandardWebhookPayload": true }, "hideConfiguration": true, "flagLink": { diff --git a/integrations/msteams-app/templates/default.json.hbs b/integrations/msteams-app/templates/default.json.hbs deleted file mode 100644 index 74891314..00000000 --- a/integrations/msteams-app/templates/default.json.hbs +++ /dev/null @@ -1,14 +0,0 @@ -{ - "@type": "MessageCard", - "@context": "http://schema.org/extensions", - "themeColor": "0076D7", - "summary": "{{{title.plainText}}}", - "sections": [ - { - "activityTitle": "{{{title.html}}}{{#equal project.environment.key '~'}} in all environments{{/equal}}", - "activitySubtitle": "{{#if project.name}}{{project.name}}{{#if project.environment.name}} / {{project.environment.name}}{{/if}} / {{name}}{{/if}}", - "text": "{{#if details}}{{{details.html}}}{{/if}}{{#if comment}}\nComment: {{{comment}}}\n{{/if}}", - "xml": true - } - ] -} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 2fd19085..01736e36 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -365,6 +365,10 @@ export type IncludeErrorResponseBody = boolean; * Describes how the audit log event will be delivered to the destination. Custom delivery method indicates a custom delivery implementation in LaunchDarkly will be used. */ export type DeliveryMethod = "custom"; +/** + * Whether to send the standard audit log webhook payload or to use defined JSON templates + */ +export type UseStandardWebhookPayload = boolean; /** * The reserved custom property's display name. */ @@ -671,6 +675,7 @@ export interface AuditLogEventsHook { defaultPolicy?: DefaultPolicy; includeErrorResponseBody?: IncludeErrorResponseBody; deliveryMethod?: DeliveryMethod; + useStandardWebhookPayload?: UseStandardWebhookPayload; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index 4c61551a..5e10aac6 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -674,7 +674,8 @@ "templates", "defaultPolicy", "includeErrorResponseBody", - "deliveryMethod" + "deliveryMethod", + "useStandardWebhookPayload" ] }, "properties": { @@ -940,6 +941,13 @@ "custom" ], "description": "Describes how the audit log event will be delivered to the destination. Custom delivery method indicates a custom delivery implementation in LaunchDarkly will be used." + }, + "useStandardWebhookPayload": { + "$id": "#/properties/use-standard-webhook-payload", + "title": "Use standard webhook payload", + "type": "boolean", + "description": "Whether to send the standard audit log webhook payload or to use defined JSON templates", + "default": false } }, "required": [ diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index ed521f97..d64381af 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -11,7 +11,8 @@ "templates", "defaultPolicy", "includeErrorResponseBody", - "deliveryMethod" + "deliveryMethod", + "useStandardWebhookPayload" ] }, "properties": { @@ -166,6 +167,13 @@ "type": "string", "enum": ["custom"], "description": "Describes how the audit log event will be delivered to the destination. Custom delivery method indicates a custom delivery implementation in LaunchDarkly will be used." + }, + "useStandardWebhookPayload": { + "$id": "#/properties/use-standard-webhook-payload", + "title": "Use standard webhook payload", + "type": "boolean", + "description": "Whether to send the standard audit log webhook payload or to use defined JSON templates", + "default": false } }, "required": ["templates"] From 231f789fc680ed98185aed70c4d29c93000736e1 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 24 Feb 2023 15:02:51 +0000 Subject: [PATCH 645/936] Update Splunk template to include URL and always send comment --- integrations/splunk/templates/template.json.hbs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/integrations/splunk/templates/template.json.hbs b/integrations/splunk/templates/template.json.hbs index 0039aab0..fedd2d4a 100644 --- a/integrations/splunk/templates/template.json.hbs +++ b/integrations/splunk/templates/template.json.hbs @@ -19,10 +19,9 @@ "environment_key": "{{project.environment.key}}", {{/if}} {{/if}} - {{#if comment}} - "comment": "{{{comment}}}", - {{/if}} + "comment": "{{#if comment}}{{{comment}}}{{/if}}", "user": "{{member.displayName}}", - "user_email": "{{member.email}}" + "user_email": "{{member.email}}", + "url": "{{_links.details.href}}" } } From 85fb0824cc419ee63c9bf9ce1fe35e2be1623426 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 28 Feb 2023 10:35:04 +0100 Subject: [PATCH 646/936] [sc-189796] add an hmacSignature config field to the manifest schema (#428) * update schema to add hmacSignature field to endpoint * add hmacSignature field to msteams-app * change name of secret key field * add test --- __tests__/validateIntegrationManifests.js | 18 ++ integrations/msteams-app/manifest.json | 6 +- manifest.schema.d.ts | 17 ++ manifest.schema.json | 348 +++++++++++++++++++++- schemas/definitions.json | 28 +- 5 files changed, 403 insertions(+), 14 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 29d25e90..40b1ce7f 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -137,6 +137,24 @@ describe('All integrations', () => { `${key}: request header (${header.name}) value template must render successfully` ).not.toThrow(); }); + const hmacSignatureConfig = _.get( + manifest, + 'capabilities.auditLogEventsHook.endpoint.hmacSignature', + null + ); + if (hmacSignatureConfig) { + let secretField; + for (const formVariable of formVariables) { + if ( + formVariable.key === hmacSignatureConfig.hmacSecretFormVariableKey + ) { + secretField = formVariable; + } + } + expect(secretField).not.toBe(undefined); + expect(secretField.type).toBe('string'); + expect(secretField.isSecret).toBe(true); + } } } ); diff --git a/integrations/msteams-app/manifest.json b/integrations/msteams-app/manifest.json index fd6d75a5..53f37750 100644 --- a/integrations/msteams-app/manifest.json +++ b/integrations/msteams-app/manifest.json @@ -43,7 +43,11 @@ "name": "Content-Type", "value": "application/json" } - ] + ], + "hmacSignature": { + "headerName": "X-LD-Signature", + "hmacSecretFormVariableKey": "secret" + } }, "defaultPolicy": [ { diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 01736e36..87eae146 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -246,6 +246,14 @@ export type Value = string; * Headers to send with the webhook request */ export type HTTPHeaders = HeaderItems[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey = string; /** * JSON path to the array containing options for parsing */ @@ -630,6 +638,7 @@ export interface Endpoint { url: URL; method: HTTPMethod; headers?: HTTPHeaders; + hmacSignature?: HMACSignature; [k: string]: unknown; } /** @@ -640,6 +649,14 @@ export interface HeaderItems { value: Value; [k: string]: unknown; } +/** + * Whether or not and how to configure HMAC validation on outgoing webhooks + */ +export interface HMACSignature { + headerName?: HMACSignatureHeaderName; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey; + [k: string]: unknown; +} /** * Mapping of property names to location in JSON response */ diff --git a/manifest.schema.json b/manifest.schema.json index 5e10aac6..81bdec92 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -399,7 +399,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -476,6 +477,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -688,7 +715,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -765,6 +793,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -1142,7 +1196,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -1219,6 +1274,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -1420,7 +1501,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -1497,6 +1579,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -1801,7 +1909,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -1878,6 +1987,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -2072,7 +2207,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -2149,6 +2285,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -2247,7 +2409,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -2324,6 +2487,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -2422,7 +2611,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -2499,6 +2689,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -2597,7 +2813,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -2674,6 +2891,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -2900,7 +3143,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -2977,6 +3221,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -3172,7 +3442,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -3249,6 +3520,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ @@ -3308,7 +3605,8 @@ "enum": [ "url", "method", - "headers" + "headers", + "hmacSignature" ] }, "properties": { @@ -3385,6 +3683,32 @@ } ], "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } } }, "required": [ diff --git a/schemas/definitions.json b/schemas/definitions.json index 35ab9f68..7234f695 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -70,6 +70,29 @@ ], "minProperties": 1 }, + "endpointHmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": ["headerName", "hmacSecretFormVariableKey"] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } + }, "endpointProperties": { "url": { "$ref": "#/endpointUrl" @@ -79,6 +102,9 @@ }, "headers": { "$ref": "#/endpointHeaders" + }, + "hmacSignature": { + "$ref": "#/endpointHmacSignature" } }, "endpoint": { @@ -87,7 +113,7 @@ "description": "Properties that describe an HTTP request to an external endpoint", "type": "object", "propertyNames": { - "enum": ["url", "method", "headers"] + "enum": ["url", "method", "headers", "hmacSignature"] }, "properties": { "$ref": "#/endpointProperties" From 572be2c981b7652c13ba9acc34651c2c7cff4415 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 3 Mar 2023 12:44:25 +0000 Subject: [PATCH 647/936] Update Dynatrace integration to support integration-wide tag (#430) * Update Dynatrace integration to support integration-wide tag * Improve manifest legibility * Update codeowners --- .gitignore | 1 + CODEOWNERS | 3 +- integrations/dynatrace/manifest.json | 8 +++ .../dynatrace/templates/flag.json.hbs | 51 +++++++++++++++++-- 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 579600e9..e5671446 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ pkg public .DS_Store latest +tmp/ diff --git a/CODEOWNERS b/CODEOWNERS index a34044fd..ac1f3570 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,2 +1,3 @@ # These owners will be the default owners for everything in the repo. -* @launchdarkly/squad-integrations + +- @launchdarkly/team-app-platform-product diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index e239b99a..5af61b9b 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -128,6 +128,14 @@ "VIRTUALMACHINE", "VMWARE_DATACENTER" ] + }, + { + "name": "Dynatrace tag", + "key": "tag", + "type": "string", + "isOptional": true, + "defaultValue": "", + "description": "If provided, all feature flag events matching the policy filter will be associated with Dynatrace entities with the same tag." } ], "capabilities": { diff --git a/integrations/dynatrace/templates/flag.json.hbs b/integrations/dynatrace/templates/flag.json.hbs index 8d5d9155..9d475dd2 100644 --- a/integrations/dynatrace/templates/flag.json.hbs +++ b/integrations/dynatrace/templates/flag.json.hbs @@ -1,6 +1,48 @@ -{{#if customProperties}} -{{#if customProperties.dynatrace}} -{{#if customProperties.dynatrace.values}} +{{#if formVariables.tag}} +{ + "eventType": "CUSTOM_CONFIGURATION", + "attachRules": { + "tagRule": [ + { + "meTypes": [{{#if formVariables.entity }}"{{formVariables.entity}}"{{else}}"APPLICATION"{{/if}}], + "tags": [ + {{#if customProperties}}{{#if customProperties.dynatrace}}{{#if customProperties.dynatrace.values}} + {{#with customProperties}} + {{#each dynatrace.values}} + { + "context": "CONTEXTLESS", + "key": "{{{this}}}" + }, + {{/each}} + {{/with}} + {{/if}}{{/if}}{{/if}} + { + "context": "CONTEXTLESS", + "key": "{{{formVariables.tag}}}" + } + ] + } + ] + }, + "configuration": "Feature flag \"{{name}}\"", + "customProperties": { + "Flag name": "{{name}}", + "Flag key": "{{key}}", + "Project name": "{{project.name}}", + "Project key": "{{project.key}}", + "Environment name": "{{project.environment.name}}", + "Environment key": "{{project.environment.key}}", + "Comment": "{{#if comment}}{{comment}}{{/if}}", + "User name": "{{member.displayName}}", + "User email": "{{ member.email }}", + "Action": "{{verbKind}}" + }, + "start": {{ timestamp.milliseconds }}, + "source": "LaunchDarkly", + "description": "{{{title.plainText}}}{{#if details.plainText}}{{{details.plainText}}}{{/if}}" +} +{{else}} +{{#if customProperties}}{{#if customProperties.dynatrace}}{{#if customProperties.dynatrace.values}} { "eventType": "CUSTOM_CONFIGURATION", "attachRules": { @@ -37,6 +79,5 @@ "source": "LaunchDarkly", "description": "{{{title.plainText}}}{{#if details.plainText}}{{{details.plainText}}}{{/if}}" } -{{/if}} -{{/if}} +{{/if}}{{/if}}{{/if}} {{/if}} From 97fac209c5d22614d2de7e9bd502869c9aa9fbe3 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 8 Mar 2023 16:26:39 +0000 Subject: [PATCH 648/936] [sc-191643] Backmerge public to pick up Roost card (#431) * Releasing changes publicly * Bump path-parse from 1.0.6 to 1.0.7 Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump ws from 7.4.2 to 7.5.3 Bumps [ws](https://github.com/websockets/ws) from 7.4.2 to 7.5.3. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.2...7.5.3) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] * Releasing changes publicly * Releasing changes publically (#9) * Releasing changes publicly * Bump url-parse from 1.5.3 to 1.5.8 (#12) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.8. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.8) --- updated-dependencies: - dependency-name: url-parse dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Releasing changes publicly * Adding Atlassian Compass to LD integrations page (#16) * Adding Atlassian Compass to LD integrations page * Update integrations/compass/assets/images/horizontal.svg Co-authored-by: Henry Barrow * Update integrations/compass/assets/images/square.svg Co-authored-by: Henry Barrow Co-authored-by: Matt Dellandrea <9593724+mdellandrea@users.noreply.github.com> Co-authored-by: Henry Barrow * Fix schema from bad merge (#17) * Imiller/ch78837/update some categories (#130) * add missing categories messaging, code-references, log-management, issue-tracking, analytics * update msteams * update honeycomb, logdna, dynatrace * update appoptics, datadog, grafana * update new relic, signalfx, splunk * update appdynamics and jira * update circleci, heap, pendo * update gitlab and trello * update git and slack app * update bitbucket pipes (not pipelines/flags) and github * Imiller/ch78837/remove unused categories (#131) * remove unused from sample-integration * remove from base schema & manifest schema * Update s3 buckets in circle config (#132) * Add validation template (#135) * coderefs copy changes (#138) * coderefs copy changes * update icon * cleanup * Update manifest.json * Update git integration name to "Code references" (#139) * update coderefs integration title * remove yarn.lock * Imiller/ch69350/audit appdynamics template and manifest (#65) * Resolve merge conflict (#141) * Promoting from prod to catfood (#114) * Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru * Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Deploy to prod (#110) * Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Henry Barrow Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Promote staging to production (#119) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Isabelle Miller * Deploy Catfood from production (#121) * Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru * Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * Deploy to prod (#110) * better logdna link (#112) * Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates * Promote staging to production (#119) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Promoting from stg to prod (#127) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Henry Barrow Co-authored-by: Isabelle Miller * Deploy new relic to prod (#129) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add more detail to new relic template (#126) Co-authored-by: Henry Barrow Co-authored-by: Isabelle Miller * Promote staging -> prod (#133) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add more detail to new relic template (#126) * Imiller/ch74105/add member details to existing integrations (#89) * update msteams default template * add user data to dynatrace payload * add instructions for testing signalfx * add user data to signalfx template * remove entire comment field if no comment * make user link to mailto instead of user payload * fix trailing comma Co-Authored-By: Henry Barrow * remove superfluous space Co-Authored-By: Henry Barrow * move comma to inside if to fix invalid json * fix trailing whitespace * move trailing commas to inside handlebars ifs * add if around name for in case it's not set * add user data to splunk payload * only display comment field if there is a comment * revert msteams default template to original * signalfx - separate user and user email into two fields * splunk - separate user and user email into separate fields * update spacing Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * separate dynatrace user into name and email Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update spacing on splunk Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * remove lingering parentheses * don't display user name if both don't exist * fix capitalization * add missing space * add missing space Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * Imiller/ch78837/update some categories (#130) * add missing categories messaging, code-references, log-management, issue-tracking, analytics * update msteams * update honeycomb, logdna, dynatrace * update appoptics, datadog, grafana * update new relic, signalfx, splunk * update appdynamics and jira * update circleci, heap, pendo * update gitlab and trello * update git and slack app * update bitbucket pipes (not pipelines/flags) and github * Imiller/ch78837/remove unused categories (#131) * remove unused from sample-integration * remove from base schema & manifest schema * Update s3 buckets in circle config (#132) Co-authored-by: Isabelle Miller Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * Deploy prod (#136) Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Henry Barrow Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * renamed coderefs folder to git * delete coderefs folder * Add new capability to manifest schema (#146) * Added OAuth tidbit (#147) * Added OAuth tidbit * Added missing period. * Copy *.svgs to static.launchdarkly.com (#148) * Rename remote update to trigger (#149) * Rename remote update -> trigger * Update title * Update docs * Update docs/capabilities.md Co-authored-by: Isabelle Miller Co-authored-by: Isabelle Miller * Testing Azure Event Hub integration * Requested changes * Requested changes * Update heap url (#154) * Change New Relic integration to use their deployment api (#153) * adding code snippets and validation template info to docs (#155) * Bump lodash from 4.17.15 to 4.17.19 (#158) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fixed name of integration (from azure-event-hub to azure-event-hubs) * Added integration icon * Remove validation templates from integrations with configurable hosts (#160) * Remove MSteams validation (#163) * Re-enable validation template for configurable host integrations (#165) * Imiller/ch83288/add trigger to datadog manifest (#168) * add trigger capability to datadog manifest * add parser * add note to docs about payload * Imiller/ch83287/add trigger to honeycomb manifest (#169) * add trigger to honeycomb + update readme * add sample payload * add some more detail to datadog readme * add parser * remove value from parser * switch out launchdarkly for team name var * Revert "switch out launchdarkly for team name var" This reverts commit 91cdffd4cd10f84876fdebd1388e033a5dde642f. * Revert "remove value from parser" This reverts commit 002deab54ed53d416c5379da916de07a4d0c6f67. * update link to integrations center and remove value from parser (#170) * Update event-hub integration link * Fix broken trigger doc link (#172) * Minor trigger doc update (#173) * Imiller/ch84138/use goaltender parsers when handling inbound (#174) * rename parser paths * rename external condition parser * split trigger parser out into separate parser schema file * remove redundant id paths * Revert "remove redundant id paths" This reverts commit c8c0e7c6a7653c06a03315836f807a5a1fed0cdd. * Revert "split trigger parser out into separate parser schema file" This reverts commit bc3adb0c1a1f0c4e278b9e7a11c21ae38868eb9b. * Revert "rename external condition parser" This reverts commit 7a5dcdbd876c2fbba14f4bd66d7777b6deb1c55d. * Revert "rename parser paths" This reverts commit c131dca2fb0760a1bf32205377a1d749597a896a. * rename trigger parser from 'parser' to 'trigger-parser' * oops make it trigger parser, not trigger body parser * Use the COMMIT_MSG var (#175) * Add support for generic trigger (#176) * Add generic trigger * Update description and logo * Remove templates * Add readme * Change name to Generic (#178) * Update README to call out "trigger" auto-append (#179) * Update README * grammar * Require isOptional = true when defaultValue is used (#181) * Make datadog host optional * Use isOptional wherever defaultValue is used and add test lock this change in * update docs * use org-global for deploy-to-s3 jobs (#182) * Update bucket names in circle config (#184) * clean up circle config * Update datadog trigger parser and readme (#183) * [ch87329] Add automatic clubhouse ticketeting for private repo (#185) * Add generic trigger icon (#186) * [ch87329] Fix clubhouse link (#187) * [ch87972] updated trigger urls and descriptions (#188) * [ch87971] Add new eventName field and default value (#190) * Add new eventName field and default value * Add deprecation warning * Add eventName to all triggers * Fix generic template parser paths (#191) * readme update for generic triggers (#189) * adding some periods (#194) * Bump yargs-parser from 18.1.1 to 18.1.3 (#197) Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 18.1.1 to 18.1.3. - [Release notes](https://github.com/yargs/yargs-parser/releases) - [Changelog](https://github.com/yargs/yargs-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/yargs-parser/compare/v18.1.1...v18.1.3) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [ch83496] Upload archive of manifests to artifacts bucket instead of directy copying to deploy buckets (#198) * Send webhook to spinnaker when build is done (#199) * [ch83496] auto deploy staging pt 2 (#200) * Add Azure Active Directory docs link (#201) * [ch90065] add trigger capability to signalfx (#203) * add trigger capability * add signalfx webhook doc link to readme * [ch91335] remove deprecated alertName trigger parser field (#205) * add triggers capability * eventName and alertName should be the same * chagne event_type to condition_name * remove alertName * update doc link * update capabilities.md to use eventName instead of alertName * remove alertName from all integration manifests * remove alertName from schemas * remove trigger capability from new relic manifest since it should be on a different pr * [ch90570] add testEventNameRegexp field to schema (#206) * add testEventNameRegexp field to schema * add note to doc * add testEventNameRegexp to propertyNames list * [ch90823] add triggers capability (#204) * add triggers capability * eventName and alertName should be the same * chagne event_type to condition_name * remove alertName * update doc link * update name and description" * update overview as well * make exact match Co-authored-by: Henry Barrow * remove triggers from overview and description Co-authored-by: Henry Barrow * [ch90064] add trigger capability to dynatrace manifest (#202) * add trigger * add dynatrace doc link to readme * change parser fields to match datadog * add testEventNameRegexp * [ch92301] add test event to datadog trigger (#207) * add test event regex for datadog * update honeycomb manifest for tests * remove test events & change eventName back * Default is not an accepted value (#208) * [ch78771] update templates to use new displayName field (#209) * add displayName to sample context * update dynatrace flag template * add displayName to all flag sample contexts * add displayName to env sample contexts * add displayName to other sample xontexts * add displayName to project sample contexts * update elastic template * update logdna template * update new relic template (including deprecated just for kicks) * update signalfx template * update splunk template * [ch94760] Save junit tests on Circle (#210) * Use pinned node orb * use junit and save results * [ch95983] add dynamicEnum formVariable type field (#212) * add displayName to sample context * update dynatrace flag template * add displayName to all flag sample contexts * add displayName to env sample contexts * add displayName to other sample xontexts * add displayName to project sample contexts * update elastic template * update logdna template * update new relic template (including deprecated just for kicks) * update signalfx template * update splunk template * add dynamicEnum to formVariables type definition * add sample dropdownOptions field of dynamicEnum type * refactor endpoint out of auditLogEventsHook for general use across capabilities * add parser to dynamicOptions schema * refactor endpoints * add test to check dynamicEnum has dynamicOptions and vice versa * [ch95983] Add reqres API endpoint to sample-integration manifest (#213) * Add reqres API endpoint to sample-integration manifest * make sure dynamic enum is passed to context in preview and tests * Add color as query param * [ch95892] Goaltender info for Tray (tray.io) (#211) * [ch95983] refactor reusable components out of schema (#214) * refactor documentation url out of trigger * replace external condition endpoint with generic * factor out the subparts of the reusable endpoint to allow for description flexibility * replace external condition endpoint properties * refactor endpointProperties * refactor out capability parsers into parser file * Add string type to endpoint method and make it required (#215) * Remove oauth from sample-integration (#216) * Move formVariable items to definitions.json (#217) * [ch95986] Add approval capability schema (#218) * Move formVariable items to definitions.json * Add approval capability * Remove periods in description * generate typescript type definitions from schema JSON * fix indentation * [ch97425] Add first draft of ServiceNow manifest (#220) * Add first draft of servicenow manifest * Bump jest version to remove vulnerability warning * Ensure defualt values are provided when formVariable is optional (#221) * Imiller/ch98557/update approvalParser schema to have approvalId (#222) * add approvalId to approval parser * add approvalId to propertyNames * best guess at servicenow approvalId path * pull package-lock.json over from master * Add short description query param to creation template to verify everything is working (#223) * add urlTemplate to approvalparser (#224) * add deletionRequest * update servicenow status endpoint (#225) * Use Implementing state as Servicenow approval condition (#226) * [ch98744] Add justification to servicenow manifest (#227) * Add justification * Add url template * Add Servicenow svgs (#228) * [ch100894] add new memberListRequest to approvals schema (#229) * add member list request and new member list parser to approvals schema * forgot to add memberListRequest to property list * actually probably want this to be required * add servicenow memberListRequest * make not required for now so it doesn't break all the goaltender tests * oops forgot leading slash * change user to member * update snow manifest * well that was a bug * missed some members * missed some more * update descriptions * how many typos can i make in a day * fix typo (#230) * Imiller/ch97553/make MemberListRequest required (#231) * fix typo * make required * Make deletion request required (#232) * [ch101451] Add postApplyRequest and add parser to deletionRequest (#233) * Add postApplyRequest to schema and add parser to deletionRequest * Make parsers required and move memberListRequest up * [ch101677] add requested_by to SNow creation requests (#234) * it turns out it's user_name, not sys_id, that we wanted * add requested_by to creation request * pass member id from context Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow * Add link to LD approval request to ServiceNow change request (#235) * Minor vscode card updates (#237) * Fix externalMemberId bug (#239) * Reject approval requests when change request is in state 4 (#238) * Improve servicenow description and sentance case environment form variable name (#240) * [ch102661] Improve serveral horizontal icons (#241) * Route staging deploys through Thumb Seeker (#242) * add IntelliJ card (#236) * [ch103605] remove external condition (#243) * remove external condition * remove tests * [ch103708] add otherCapabilities array to phase out legacy kind (#244) * replace legacy with externalCapabilities * everything at once for pre commits * add sso and ide capabilities * categorize sso and ide integrations * add legacy back in + external and externalEnterprise capabilities * remove slackWebhooks from externalCapabilities * add legacy back in to manifests * add test to enforce at least one capability * remove externalEnterprise * change external to other * add minItems to enforce * Adding a better link for the pendo integration (#245) * Add basicAuthHeaderValue helper documentation and example (#246) * Add JSON body template string to all approval requests (#247) * Add horizontal appoptics logo (#248) * Update sample context to include 'simple' timestamp format (#249) * [ch105018] Use JSON body for ServiceNow creation request and set start and end dates (#250) * Use jsonBody for request * Include start and end date in creation request * bump handlebars package due to vulnerability (#253) * Bump hosted-git-info from 2.8.8 to 2.8.9 (#254) * bump lodash (#256) * [ch105018] Add ServiceNow C0 manifest (#251) * Use jsonBody for request * Update servicenow-c0 manifest * Bump ws from 7.4.2 to 7.4.6 (#257) Bumps [ws](https://github.com/websockets/ws) from 7.4.2 to 7.4.6. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.2...7.4.6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Henry Barrow * [ch105018] Update servicenow-c0 creation request path (#258) * Update servicenow-c0 creation request path * fix creation request url * Temporarily use plaintext password for servicenow-c0 manifest (#259) * Update servicenow-c0 urlTemplate based on provided information (#260) * [ch105018] Update servicenow-c0 creation request based on feedback (#262) * Update servicenow-c0 to use isSecret for password * Update servicenow-c0 creation request based on feedback * Add formatWithOffset helper (#263) * Include timestamp offset in servicenow-c0 and add additional required field (#264) * [ch111110] Use nvmrc file and node v14 (#266) * Use nvmrc file and node v14 * Update docs * [ch111068] fake akamai integration (#265) * Added zendesk goaltender card * Removed unused license file for zendesk * Update integrations/zendesk/manifest.json nice, looks good to me Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * [ch110701] Utilize reserved custom properties for servicenow-c0 manifest" (#268) * start using custom properties in servicenow-c0 manifest * remove environment form variables * servicenow-c0 ensure end_date is after start_date (#269) * fake fastly integration (#270) * Update servicenow-c0 to use custom properties in postApply and deletion requests (#271) * Descrease timestamp offset (#272) * Added description to reserved custom properties and updated datadog reserved custom property to have description * Updated sample reserved custom property in docs * [ch113600] Update servicenow-c0 description, short_desription, start_date, and end_date (#274) * Update servicenow-c0 description, short_desription, start_date, and end_date * Use double brackets when possible * Add leading \n to serivenow-c0 justification (#275) * [ch110172] Add flag form variables to manifest schema (#276) * Add flag form variables to manifest schema * Fix grammar * Bump path-parse from 1.0.6 to 1.0.7 (#277) Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [ch109967] Add flagFormVariables to servicenow-c0 manifest (#279) * Add flagFormVariables to servicenow-c0 manifest * Add userID to postApply and deletion requests * Add emailLocalPart to all sample context (#280) * Updating heap and pendo doc URLs (#278) * Update servicenow-c0 manifest to use emailLocalPart as serviceNow username (#281) * Reduce start and end date offest for servicenow-c0 (#283) * Use git gatsby tray docs link (#282) * Remove state parameter form servicenow-c0 creation request (#285) * Updating ansible docs link (#284) * [ch120153] Add support for new feature store capability (#286) * add new manifest for featureStore and cloudflare * fixing typo * update svg, update description * run prettier * removing period * fix newline * fixing whitespace, removing placeholders * Added includeErrorResponseBody property in autiLogEventHook capability * Fixed typo * [ch122281] Only include error response body for integrations that do not have customizable domains (#288) * Whitelist including error response body for integrations that do not have customizable domains * Remove feature from signalFX * Bump tmpl from 1.0.4 to 1.0.5 (#289) Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5. - [Release notes](https://github.com/daaku/nodejs-tmpl/releases) - [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5) --- updated-dependencies: - dependency-name: tmpl dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add cache control headers to integrations svgs (#290) * Remove unused copy_to_s3.sh (#291) * [sc-123860] Clubouse GH action -> Shortcut (#292) * Clubouse GH action -> Shortcut * Update name of action * [sc-122283] add test to check domain is static when includeErrorResponseBody is set to true (#293) * this should work * account for dynamic subdomains * check for multiple substrings in hostname * [sc-124497] add connector ui blocks to prelim capability schema (#294) * add connector ui blocks to prelim capability schema * forgot to commit parser * update description * forgot to actually add to base.json (#295) * a few small edits (#296) * forgot brace * some updates * naming updates and add new types (#297) * small updates for cloudflare * updating doc links (#299) * [sc-128309] Update labels for Clouflare KV ID form field (#300) Also adds missing periods to description text. * [sc-126368] add external references to slack-app (#301) * remove lingering redundant parser property from externalReferences * update metadata block paths and add hyperlink type * Added definitions and schema for UI block and elements for external flag refs capability * Updated with PR feedback and replaced timestamp type with isTimestamp boolean boolean * Made ui block text required and updated jira ui block template string * [sc-130013] add placeholders to cloudflare manifest (#303) Uses example values which are straight out of Cloudflare's own API docs See: https://api.cloudflare.com/ * Added UI blocks for slack app * Fixing slack context block timestamp defaulting to the 70s * [sc-129873] add eu data center option for new relic one integration (#308) * feat: add and use new formVariable * feat: integration working with new EU endpoint * docs: fix typo in readme * fix: fix existing US url * fix: fix existing US url * chore: Apply suggestions from code review Co-authored-by: Henry Barrow * fix: escape quotes in description * fix: remove includeErrorResponseBody as domain is not static anymore * feedback: account for existing integrations not having domain field Co-authored-by: Henry Barrow * chore: make things pretty Co-authored-by: Henry Barrow * [sc-132618] Upgrade node to v16 and resolve secuirty vulnerabilities (#309) * Upgrade node to v16 * Resolve security vulnerabilities * Add the option to change where default information is populated in ServiceNow (#310) * Renaming external refs to flag links * More renaming * Renamed link context -> flag link context * Update Cloudflare manifest * Update feature store capability schema * Initial integration for ld2git. * add template for webhook event. * Review comments. * adding general integration docs. * scoping out secret/token based on value set. * expose ld api token. * cleanup. * Fix description. Co-authored-by: Isabelle Miller * Fix secret description. Co-authored-by: Isabelle Miller * Update integrations/ld-to-git/manifest.json * Update integrations/ld-to-git/manifest.json * Escaping some flag link templates * Fix Cloudflare manifest JSON pointers * [sc-129419] First draft documentation for feature store capability (#313) * first draft feature store capability * removing ... * Update docs/capabilities.md Co-authored-by: Jaz White * swap sections * Apply suggestions from code review Co-authored-by: Molly * PR feedback * sample to example * Apply suggestions from code review Co-authored-by: Molly * Apply suggestions from code review Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Jaz White Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> * Add 5 minute offset to end date in servicenow creation request (#317) * Updated empty state text * Add all 6 Datadog sites to Datadog manifest (#319) * Updated flag link metadata schema to be an object instead of an array * Removed unused flag link metadata property for slack app * Replace slack manifest's flag link permalink metadata attribute with deeplink since they are both the same * Updated URLs for flag links docs * Updated Jira header text match Atlassian's branding * [sc-137630] remove parser for delivery request (#323) * [sc-137630] remove parser for delivery request * [sc-138928] add generic feature store integration manifest for testing (#324) Co-authored-by: Henry Barrow Co-authored-by: Carmen Quan Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> * Increase servicenow-c0 end_date offset to 5 mins (#325) * Increase servicenow-c0 start_date from 1s to 5s (#326) * Renaming references to master to be main * Rename master to main in bash script * Added Dynatrace cloud automation manifest for trigerring flag change events in LaunchDarkly from their cloud sequence * Updated the flag links capaibility verbiage to match the new design verbiage * Small text change * Bump url-parse from 1.5.3 to 1.5.9 (#332) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.9. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.9) --- updated-dependencies: - dependency-name: url-parse dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Removing date/time elements from the flag links ui blocks since these are no longer needed in the new design * request issue if user is not service owner * Updated context text for jira * Remove unnecessary line breaks (#336) * Remove unnecessary line breaks * Trim trailing whitespace * Remove flag link stub * [sc-143291] Add a hide member details checkbox to datadog integration (#333) * add hideMemberDetails formVariable * dont send memberName tag if hideMemberDetails is true * build title from titleVerb and targetName for project and env templates * default template sends nothing for member events with hideMemberDetails, and filters memberDetails for other events if required * fix tag generation in project and env templates * update logic in default template, add equalWithElse helper * [sc-145741] docs: copyedits and minor cleanup (#338) * docs: copyedits and minor cleanup * Apply suggestions from code review Co-authored-by: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> * Update docs/capabilities.md * Apply suggestions from code review: integrations team, not integration team Co-authored-by: Henry Barrow * remove mention of auth per discussion here: https://github.com/launchdarkly/integration-framework-private/pull/338/files#r828030266 * one more integration -> integrations team correction Co-authored-by: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Henry Barrow * Back merge public to pick up Compass tile (#342) Co-authored-by: Isabelle Miller Co-authored-by: Arnold Trakhtenberg Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich Co-authored-by: Rich Manalang Co-authored-by: Wei We Lu Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Blake Wilson Co-authored-by: Dan O'Brien Co-authored-by: Kevin Brackbill Co-authored-by: Ben Woskow Co-authored-by: Clifford Tawiah Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Co-authored-by: carmenquan Co-authored-by: Dan O'Brien Co-authored-by: Jaz White Co-authored-by: Fabian Co-authored-by: Christie Williams Co-authored-by: Mahek Chheda Co-authored-by: Mahek Chheda <86633378+mchheda-ld@users.noreply.github.com> Co-authored-by: Christie Williams Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Fabian * Releasing changes publicly * Releasing changes publicly * Releasing changes publicly (#18) * Releasing changes publicly (#19) * Bump minimatch from 3.0.4 to 3.1.2 (#20) Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2. - [Release notes](https://github.com/isaacs/minimatch/releases) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump decode-uri-component from 0.2.0 to 0.2.2 (#21) Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump json5 from 2.1.3 to 2.2.3 (#22) Bumps [json5](https://github.com/json5/json5) from 2.1.3 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.1.3...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: Add CloudQuery integration (#23) * feat: Add CloudQuery integration * Remove 'data' as per CR * Update integrations/cloudquery/manifest.json Co-authored-by: Dan O'Brien --------- Co-authored-by: Kemal Hadimli Co-authored-by: Dan O'Brien * Update CODEOWNERS with new PD org changes (#25) * Dob/roost (#26) * Releasing Roost.ai LaunchDarkly Integration * Changing support mail * Changing the square image * Preetier changes * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update manifest.json * Roost Commit * Deleting roost config files * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Added otherCapabilities in roost.ai manifest * lint fixes * lint fixes * lint fixes * lint fixes --------- Co-authored-by: Divyeshzb <60085094+Divyeshzb@users.noreply.github.com> Co-authored-by: roost-io * pull in roost card --------- Signed-off-by: dependabot[bot] Co-authored-by: Ben Woskow Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: parrishioner Co-authored-by: Matt Dellandrea <9593724+mdellandrea@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Arnold Trakhtenberg Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich Co-authored-by: Rich Manalang Co-authored-by: Wei We Lu Co-authored-by: Blake Wilson Co-authored-by: Dan O'Brien Co-authored-by: Kevin Brackbill Co-authored-by: Clifford Tawiah Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Co-authored-by: carmenquan Co-authored-by: Dan O'Brien Co-authored-by: Jaz White Co-authored-by: Fabian Co-authored-by: Christie Williams Co-authored-by: Mahek Chheda Co-authored-by: Mahek Chheda <86633378+mchheda-ld@users.noreply.github.com> Co-authored-by: Christie Williams Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Fabian Co-authored-by: Kemal <223029+disq@users.noreply.github.com> Co-authored-by: Kemal Hadimli Co-authored-by: Alex Smolen Co-authored-by: Divyeshzb <60085094+Divyeshzb@users.noreply.github.com> Co-authored-by: roost-io --- integrations/roost.ai/assets/horizontal.svg | 1 + integrations/roost.ai/assets/square.svg | 1 + integrations/roost.ai/manifest.json | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 integrations/roost.ai/assets/horizontal.svg create mode 100644 integrations/roost.ai/assets/square.svg create mode 100644 integrations/roost.ai/manifest.json diff --git a/integrations/roost.ai/assets/horizontal.svg b/integrations/roost.ai/assets/horizontal.svg new file mode 100644 index 00000000..5718b850 --- /dev/null +++ b/integrations/roost.ai/assets/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/roost.ai/assets/square.svg b/integrations/roost.ai/assets/square.svg new file mode 100644 index 00000000..221d4563 --- /dev/null +++ b/integrations/roost.ai/assets/square.svg @@ -0,0 +1 @@ +Roost-V3-Logo diff --git a/integrations/roost.ai/manifest.json b/integrations/roost.ai/manifest.json new file mode 100644 index 00000000..896fec63 --- /dev/null +++ b/integrations/roost.ai/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Roost.ai", + "version": "1.0.0", + "overview": "Create a LaunchDarkly environment when an ephemeral environment is launched using Roost.ai.", + "description": "Create a LaunchDarkly environment to be used in an ephemeral environment created by Roost.", + "author": "Roost AI", + "supportEmail": "support@zb.io", + "links": { + "site": "https://roost.ai/", + "privacyPolicy": "https://roost.ai/privacy-policy", + "supportWebsite": "https://zbio.atlassian.net/wiki/spaces/RFD/pages/1748500481/Roost+LaunchDarkly+Integration" + }, + "categories": ["developer-tools", "automation"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "requiresOAuth": false, + "otherCapabilities": ["external"] +} From 20371cef91c211306c505d7f46fd25fc4ad4eeb4 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 9 Mar 2023 16:21:50 -0500 Subject: [PATCH 649/936] Fixed dynatrace cloud automation doc link --- integrations/dynatrace-cloud-automation/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/dynatrace-cloud-automation/manifest.json b/integrations/dynatrace-cloud-automation/manifest.json index 4c062ad9..a64d9739 100644 --- a/integrations/dynatrace-cloud-automation/manifest.json +++ b/integrations/dynatrace-cloud-automation/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.dynatrace.com/platform/cloud-automation/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/dynatrace-cloud-automation", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/dynatrace#cloud-automation", "privacyPolicy": "https://www.dynatrace.com/company/trust-center/privacy/" }, "categories": ["automation", "developer-tools"], From 4b062b3a958878ddb934bba5cda913f2b1816413 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Fri, 10 Mar 2023 08:46:48 -0500 Subject: [PATCH 650/936] add gafe integration card, update code refs --- .../LICENSE.md | 13 ++++++++++++ .../assets/images/horizontal.svg | 1 + .../assets/images/square.svg | 10 ++++++++++ .../manifest.json | 20 +++++++++++++++++++ integrations/github/manifest.json | 2 +- 5 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 integrations/github-actions-flag-evaluations/LICENSE.md create mode 100644 integrations/github-actions-flag-evaluations/assets/images/horizontal.svg create mode 100644 integrations/github-actions-flag-evaluations/assets/images/square.svg create mode 100644 integrations/github-actions-flag-evaluations/manifest.json diff --git a/integrations/github-actions-flag-evaluations/LICENSE.md b/integrations/github-actions-flag-evaluations/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/github-actions-flag-evaluations/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/github-actions-flag-evaluations/assets/images/horizontal.svg b/integrations/github-actions-flag-evaluations/assets/images/horizontal.svg new file mode 100644 index 00000000..d49ba3b2 --- /dev/null +++ b/integrations/github-actions-flag-evaluations/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/github-actions-flag-evaluations/assets/images/square.svg b/integrations/github-actions-flag-evaluations/assets/images/square.svg new file mode 100644 index 00000000..7e2772a7 --- /dev/null +++ b/integrations/github-actions-flag-evaluations/assets/images/square.svg @@ -0,0 +1,10 @@ + + + GitHub Actions + + + + + + + diff --git a/integrations/github-actions-flag-evaluations/manifest.json b/integrations/github-actions-flag-evaluations/manifest.json new file mode 100644 index 00000000..f001f2e6 --- /dev/null +++ b/integrations/github-actions-flag-evaluations/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "GitHub Actions Flag Evaluations", + "version": "1.0.0", + "overview": "Use LaunchDarkly feature flags to conditionally control workflows in GitHub Actions.", + "description": "Use LaunchDarkly feature flags to conditionally control workflows in GitHub Actions.", + "details": "Gain runtime control over your GitHub Actions. Feature flags can be used to conditionally control steps and pass values into a step.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://github.com/features/actions", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/github-actions-flag-evaluations", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["automation"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "otherCapabilities": ["external"] +} diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index 3fc69cea..c98fae3b 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -3,7 +3,7 @@ "version": "1.0.0", "overview": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", "description": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", - "details": "GitHub is a development platform inspired by the way you work. From open-source to business, you can host and review code, manage projects, and build software alongside 40 million developers. Use our open-source utility to track references to flags in your code, using GitHub Actions.", + "details": "GitHub is a service for software development and version control using Git. Use our open-source utility to track references to flags in your code to power in-app functionality. Search for feature flags that have no existing code references. Add additional safety checks when you're ready to archive a flag that it does not exist in any codebase running the utility.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 88c5b5ddc90528d46af85df31e39d7fee1302b1d Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Fri, 10 Mar 2023 08:49:35 -0500 Subject: [PATCH 651/936] Update integrations/github-actions-flag-evaluations/LICENSE.md Co-authored-by: Henry Barrow --- integrations/github-actions-flag-evaluations/LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/github-actions-flag-evaluations/LICENSE.md b/integrations/github-actions-flag-evaluations/LICENSE.md index 9dcbe896..04b7d222 100644 --- a/integrations/github-actions-flag-evaluations/LICENSE.md +++ b/integrations/github-actions-flag-evaluations/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020 Catamorphic Co. +Copyright 2023 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 0b5733f188bffd82a2e709b108c315420ae4ae64 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 15 Mar 2023 11:20:54 -0400 Subject: [PATCH 652/936] add Census card, pick up additional changes --- .../census/assets/images/horizontal.svg | 1 + integrations/census/assets/images/square.svg | 1 + integrations/census/manifest.json | 20 +++++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 integrations/census/assets/images/horizontal.svg create mode 100644 integrations/census/assets/images/square.svg create mode 100644 integrations/census/manifest.json diff --git a/integrations/census/assets/images/horizontal.svg b/integrations/census/assets/images/horizontal.svg new file mode 100644 index 00000000..2f9832b4 --- /dev/null +++ b/integrations/census/assets/images/horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/census/assets/images/square.svg b/integrations/census/assets/images/square.svg new file mode 100644 index 00000000..e2415f46 --- /dev/null +++ b/integrations/census/assets/images/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/integrations/census/manifest.json b/integrations/census/manifest.json new file mode 100644 index 00000000..2a541090 --- /dev/null +++ b/integrations/census/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Census", + "version": "1.0.0", + "overview": "Use Census to sync metrics and metric events from your data warehouse into LaunchDarkly.", + "description": "Your data warehouse is the source of truth for how users interact with your product. Now you can use it to supercharge your LaunchDarkly experiments by syncing metrics and metric events.", + "author": "Census", + "supportEmail": "support@getcensus.com", + "links": { + "site": "https://www.getcensus.com", + "launchdarklyDocs": "https://docs.getcensus.com/destinations/launchdarkly", + "privacyPolicy": "https://www.getcensus.com/legal/privacy-policy" + }, + "categories": ["data", "infrastructure", "automation"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "requiresOAuth": false, + "otherCapabilities": ["external"] +} From dac4a0691504a65e3f13b8f8d9c13285d0af9c0b Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 15 Mar 2023 12:07:15 -0400 Subject: [PATCH 653/936] fix lint issues --- integrations/census/assets/images/horizontal.svg | 2 +- integrations/census/assets/images/square.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/census/assets/images/horizontal.svg b/integrations/census/assets/images/horizontal.svg index 2f9832b4..d4c19d9c 100644 --- a/integrations/census/assets/images/horizontal.svg +++ b/integrations/census/assets/images/horizontal.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/integrations/census/assets/images/square.svg b/integrations/census/assets/images/square.svg index e2415f46..73e9a6ae 100644 --- a/integrations/census/assets/images/square.svg +++ b/integrations/census/assets/images/square.svg @@ -1 +1 @@ - \ No newline at end of file + From 4b5cb8428d5f3f9a87bf070c34cb922335969cc9 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 4 Apr 2023 16:55:12 +0100 Subject: [PATCH 654/936] [sc 194413] Add vercel manifest, add prefix/suffix featureStore options (#436) * add basic vercel manifest, update schema defs * update svgs --- integrations/vercel/assets/horizontal.svg | 1 + integrations/vercel/assets/square.svg | 6 ++ integrations/vercel/manifest.json | 82 +++++++++++++++++++++++ manifest.schema.d.ts | 10 +++ manifest.schema.json | 16 ++++- schemas/capabilities/featureStore.json | 8 ++- schemas/definitions.json | 12 ++++ 7 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 integrations/vercel/assets/horizontal.svg create mode 100644 integrations/vercel/assets/square.svg create mode 100644 integrations/vercel/manifest.json diff --git a/integrations/vercel/assets/horizontal.svg b/integrations/vercel/assets/horizontal.svg new file mode 100644 index 00000000..005232b8 --- /dev/null +++ b/integrations/vercel/assets/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/vercel/assets/square.svg b/integrations/vercel/assets/square.svg new file mode 100644 index 00000000..bf9110fd --- /dev/null +++ b/integrations/vercel/assets/square.svg @@ -0,0 +1,6 @@ + diff --git a/integrations/vercel/manifest.json b/integrations/vercel/manifest.json new file mode 100644 index 00000000..59bc2b88 --- /dev/null +++ b/integrations/vercel/manifest.json @@ -0,0 +1,82 @@ +{ + "name": "Vercel", + "version": "1.0.0", + "overview": "Evaluate feature flags and bootstrap the LaunchDarkly Javascript SDK from the Vercel Edge.", + "description": "Evaluate feature flags and bootstrap the LaunchDarkly Javascript SDK from Vercel Edge by storing flag data in Vercel's Edge Config offering.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.vercel.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/vercel", + "privacyPolicy": "https://vercel.com/legal/privacy-policy" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "featureStore": { + "formVariables": [ + { + "key": "edgeConfigId", + "name": "Edge Config ID", + "description": "Enter your Edge Config ID.", + "type": "string", + "placeholder": "e.g. 01a7362d577a6c3019a474fd6f485823", + "isSecret": false + }, + { + "key": "teamId", + "name": "Team ID", + "description": "You must have a Team ID available for flag updates. Enter the Team ID associated with your Vercel team.", + "type": "string", + "placeholder": "e.g. 0f2ac74b498b48028cb68387c421e279", + "isOptional": true, + "isSecret": false + }, + { + "key": "apiToken", + "name": "API Token", + "description": "Enter the API token generated from Vercel.", + "placeholder": "e.g. 8M7wS6hCpXVc-DoRnPPY_UCWPgy8aea4Wy6kCe5T", + "type": "string", + "isSecret": true + } + ], + "validationRequest": { + "endpoint": { + "url": "https://api.vercel.com/v1/edge-config/{edgeConfigId}/items?teamId={{teamId}}", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, + "parser": { + "success": "/success" + } + }, + "featureStoreRequest": { + "endpoint": { + "url": "https://api.vercel.com/v1/edge-config/{{edgeConfigId}}/items", + "method": "PATCH", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "payloadPrefix": "\"items\": [{\"operation\": \"upsert\", \"key\": \"ld-flags-FILLINENVID\", \"value\": ", + "payloadSuffix": "}]" + } + } + } +} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 87eae146..cfd9f8c2 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -484,6 +484,14 @@ export type URLTemplate = string; export type ProviderFormVariables = FormVariable[]; export type SuccessPointer = string; export type ErrorsPointer = string; +/** + * Optional prefix to wrap payload data with (used for some integrations) + */ +export type Prefix = string; +/** + * Optional suffix to wrap payload data with (used for some integrations) + */ +export type Suffix = string; /** * Sentence-cased title to show for all links for this integration */ @@ -852,6 +860,8 @@ export interface FeatureStoreValidationParser { */ export interface FeatureStoreRequest { endpoint: Endpoint; + payloadPrefix?: Prefix; + payloadSuffix?: Suffix; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index 81bdec92..dc8d60d9 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -3589,7 +3589,9 @@ "type": "object", "propertyNames": { "enum": [ - "endpoint" + "endpoint", + "payloadPrefix", + "payloadSuffix" ] }, "required": [ @@ -3715,6 +3717,18 @@ "url", "method" ] + }, + "payloadPrefix": { + "$id": "#/definitions/payloadPrefix", + "title": "Prefix", + "type": "string", + "description": "Optional prefix to wrap payload data with (used for some integrations)" + }, + "payloadSuffix": { + "$id": "#/definitions/payloadSuffix", + "title": "Suffix", + "type": "string", + "description": "Optional suffix to wrap payload data with (used for some integrations)" } } } diff --git a/schemas/capabilities/featureStore.json b/schemas/capabilities/featureStore.json index f0b18dfa..a4817589 100644 --- a/schemas/capabilities/featureStore.json +++ b/schemas/capabilities/featureStore.json @@ -44,12 +44,18 @@ "description": "Details needed to make a request to deliver the flag payload to the feature store", "type": "object", "propertyNames": { - "enum": ["endpoint"] + "enum": ["endpoint", "payloadPrefix", "payloadSuffix"] }, "required": ["endpoint"], "properties": { "endpoint": { "$ref": "../definitions.json#/endpoint" + }, + "payloadPrefix": { + "$ref": "../definitions.json#/payloadPrefix" + }, + "payloadSuffix": { + "$ref": "../definitions.json#/payloadSuffix" } } } diff --git a/schemas/definitions.json b/schemas/definitions.json index 7234f695..3d8718de 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -407,5 +407,17 @@ "type": "string" } } + }, + "payloadPrefix": { + "$id": "#/definitions/payloadPrefix", + "title": "Prefix", + "type": "string", + "description": "Optional prefix to wrap payload data with (used for some integrations)" + }, + "payloadSuffix": { + "$id": "#/definitions/payloadSuffix", + "title": "Suffix", + "type": "string", + "description": "Optional suffix to wrap payload data with (used for some integrations)" } } From e610b79051b5e18b21136a299a6774dc1290758d Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 4 Apr 2023 15:29:18 -0400 Subject: [PATCH 655/936] merging public integrations --- .editorconfig | 2 ++ .../liquibase/assets/images/square.svg | 1 + .../liquibase/assets/images/vertical.svg | 1 + integrations/liquibase/manifest.json | 20 +++++++++++++++++++ .../ngrok/assets/images/ngrok-horizontal.svg | 7 +++++++ .../ngrok/assets/images/ngrok-square.svg | 4 ++++ integrations/ngrok/manifest.json | 20 +++++++++++++++++++ package-lock.json | 6 ------ 8 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 .editorconfig create mode 100644 integrations/liquibase/assets/images/square.svg create mode 100644 integrations/liquibase/assets/images/vertical.svg create mode 100644 integrations/liquibase/manifest.json create mode 100644 integrations/ngrok/assets/images/ngrok-horizontal.svg create mode 100644 integrations/ngrok/assets/images/ngrok-square.svg create mode 100644 integrations/ngrok/manifest.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..1f808de5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,2 @@ +[*] +insert_final_newline = true diff --git a/integrations/liquibase/assets/images/square.svg b/integrations/liquibase/assets/images/square.svg new file mode 100644 index 00000000..b1a5a2e9 --- /dev/null +++ b/integrations/liquibase/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/liquibase/assets/images/vertical.svg b/integrations/liquibase/assets/images/vertical.svg new file mode 100644 index 00000000..1bc73852 --- /dev/null +++ b/integrations/liquibase/assets/images/vertical.svg @@ -0,0 +1 @@ + diff --git a/integrations/liquibase/manifest.json b/integrations/liquibase/manifest.json new file mode 100644 index 00000000..2b2dc767 --- /dev/null +++ b/integrations/liquibase/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Liquibase", + "version": "1.0.0", + "overview": "Liquibase helps developers bring progressive delivery and DevOps to the database.", + "description": "This extension uses LaunchDarkly to define and control when database changes are applied. Utilize feature flags as preconditions in changelogs and changesets within Liquibase.", + "author": "Liquibase", + "supportEmail": "support@liquibase.com", + "links": { + "site": "https://liquibase.com", + "launchdarklyDocs": "https://docs.liquibase.com/feature-flags/readmes/launchdarkly%20feature%20flags.html", + "privacyPolicy": "https://www.liquibase.com/privacy-policy" + }, + "categories": ["developer-tools", "automation"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/vertical.svg" + }, + "otherCapabilities": ["external"], + "requiresOAuth": false +} diff --git a/integrations/ngrok/assets/images/ngrok-horizontal.svg b/integrations/ngrok/assets/images/ngrok-horizontal.svg new file mode 100644 index 00000000..573fcb2c --- /dev/null +++ b/integrations/ngrok/assets/images/ngrok-horizontal.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/integrations/ngrok/assets/images/ngrok-square.svg b/integrations/ngrok/assets/images/ngrok-square.svg new file mode 100644 index 00000000..96341653 --- /dev/null +++ b/integrations/ngrok/assets/images/ngrok-square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/ngrok/manifest.json b/integrations/ngrok/manifest.json new file mode 100644 index 00000000..deecd7d6 --- /dev/null +++ b/integrations/ngrok/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "ngrok", + "version": "1.0.0", + "overview": "Verify LaunchDarkly webhooks with ngrok.", + "description": "Get notified whenever a feature flag is updated or when an account member is invited to LaunchDarkly without changing code or poking your firewall.", + "author": "ngrok", + "supportEmail": "support@ngrok.com", + "links": { + "site": "https://ngrok.com", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/ngrok", + "supportWebsite": "https://ngrok.com/docs/integrations/launchdarkly", + "privacyPolicy": "https://ngrok.com/privacy" + }, + "categories": ["notifications"], + "icons": { + "square": "assets/images/ngrok-square.svg", + "horizontal": "assets/images/ngrok-horizontal.svg" + }, + "otherCapabilities": ["external"] +} diff --git a/package-lock.json b/package-lock.json index 2b3922ba..4696785f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9874,12 +9874,6 @@ } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", From cb35643f04bc1f037969ef8d73ab48b070dce31e Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 5 Apr 2023 14:58:17 +0100 Subject: [PATCH 656/936] [sc-195916] Add audit log events hook capability to Compass integration (#438) * Add audit log events hook capability to Compass integration * Fix descriptions * Fix GH action --- .github/workflows/pull_request.yml | 2 +- integrations/compass/manifest.json | 44 ++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index bac1bb31..8c1c59a8 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -8,7 +8,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: Set Shortcut Link in PR - uses: launchdarkly-labs/ld-gh-actions-shortcut/set-link@master + uses: launchdarkly-labs/ld-gh-actions-shortcut/set-link@main env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} AUTOLINK_PREFIX: 'SC-' diff --git a/integrations/compass/manifest.json b/integrations/compass/manifest.json index abede717..f7c5fbb9 100644 --- a/integrations/compass/manifest.json +++ b/integrations/compass/manifest.json @@ -16,6 +16,50 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, + "formVariables": [ + { + "key": "url", + "name": "Compass web trigger URL", + "type": "uri", + "description": "Enter your Compass web trigger URL", + "isSecret": false + }, + { + "key": "secret", + "name": "Secret", + "description": "Enter the secret shared between Compass and LaunchDarkly", + "type": "string", + "isSecret": true + } + ], "requiresOAuth": false, + "capabilities": { + "hideConfiguration": true, + "auditLogEventsHook": { + "endpoint": { + "url": "{{url}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "hmacSignature": { + "headerName": "X-LD-Signature", + "hmacSecretFormVariableKey": "secret" + } + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/*:flag/*"], + "actions": ["*"] + } + ], + "templates": {}, + "useStandardWebhookPayload": true + } + }, "otherCapabilities": ["external"] } From 5fde0bb75c69e3e1d44e86618b295ce91423b291 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 5 Apr 2023 18:35:35 +0100 Subject: [PATCH 657/936] use shared secret header instead of HMAC signature (#439) --- integrations/msteams-app/manifest.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/msteams-app/manifest.json b/integrations/msteams-app/manifest.json index 53f37750..a7f4e5ef 100644 --- a/integrations/msteams-app/manifest.json +++ b/integrations/msteams-app/manifest.json @@ -42,12 +42,12 @@ { "name": "Content-Type", "value": "application/json" + }, + { + "name": "X-LD-Compass-Secret", + "value": "{{secret}}" } - ], - "hmacSignature": { - "headerName": "X-LD-Signature", - "hmacSecretFormVariableKey": "secret" - } + ] }, "defaultPolicy": [ { From a602370754fdd5837efc6a2406f21a2c2c8ba522 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 5 Apr 2023 19:23:13 +0100 Subject: [PATCH 658/936] Revert "use shared secret header instead of HMAC signature (#439)" (#441) This reverts commit 5fde0bb75c69e3e1d44e86618b295ce91423b291. --- integrations/msteams-app/manifest.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/msteams-app/manifest.json b/integrations/msteams-app/manifest.json index a7f4e5ef..53f37750 100644 --- a/integrations/msteams-app/manifest.json +++ b/integrations/msteams-app/manifest.json @@ -42,12 +42,12 @@ { "name": "Content-Type", "value": "application/json" - }, - { - "name": "X-LD-Compass-Secret", - "value": "{{secret}}" } - ] + ], + "hmacSignature": { + "headerName": "X-LD-Signature", + "hmacSecretFormVariableKey": "secret" + } }, "defaultPolicy": [ { From 3b96d8c2e5817e87590c7d8da3c76236683f22c5 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 6 Apr 2023 08:55:45 -0400 Subject: [PATCH 659/936] fix ngrok link --- integrations/ngrok/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/ngrok/manifest.json b/integrations/ngrok/manifest.json index deecd7d6..003f06d7 100644 --- a/integrations/ngrok/manifest.json +++ b/integrations/ngrok/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@ngrok.com", "links": { "site": "https://ngrok.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/ngrok", + "launchdarklyDocs": "https://ngrok.com/docs/integrations/launchdarkly", "supportWebsite": "https://ngrok.com/docs/integrations/launchdarkly", "privacyPolicy": "https://ngrok.com/privacy" }, From 5e91ad0be8c9c6ec4794fab1a0ea57fc06cc401c Mon Sep 17 00:00:00 2001 From: Jon Mooring Date: Thu, 6 Apr 2023 10:53:57 -0700 Subject: [PATCH 660/936] [sc-195259] Add manifest for Sentry --- __tests__/validateIntegrationManifests.js | 7 ++++++- .../assets/images/sentry_horizontal.svg | 1 + .../sentry/assets/images/sentry_square.svg | 1 + integrations/sentry/manifest.json | 21 +++++++++++++++++++ package-lock.json | 6 ++++++ 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 integrations/sentry/assets/images/sentry_horizontal.svg create mode 100644 integrations/sentry/assets/images/sentry_square.svg create mode 100644 integrations/sentry/manifest.json diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 40b1ce7f..a0f8f197 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -11,7 +11,12 @@ const projectContext = require('../sample-context/project/update'); const environmentContext = require('../sample-context/environment/update'); const memberContext = require('../sample-context/member/update'); -const OAUTH_INTEGRATIONS = ['appdynamics', 'servicenow', 'servicenow-normal']; // add oauth integrations here +const OAUTH_INTEGRATIONS = [ + 'appdynamics', + 'sentry', + 'servicenow', + 'servicenow-normal', +]; // add oauth integrations here const INTEGRATIONS_WITH_DUP_OAUTH_KEYS = ['servicenow', 'servicenow-normal']; // these are integrations we expect to have duplicate oauth integration keys for various reasons var parse = require('url-parse'); diff --git a/integrations/sentry/assets/images/sentry_horizontal.svg b/integrations/sentry/assets/images/sentry_horizontal.svg new file mode 100644 index 00000000..c372f774 --- /dev/null +++ b/integrations/sentry/assets/images/sentry_horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/sentry/assets/images/sentry_square.svg b/integrations/sentry/assets/images/sentry_square.svg new file mode 100644 index 00000000..08bce5fb --- /dev/null +++ b/integrations/sentry/assets/images/sentry_square.svg @@ -0,0 +1 @@ + diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json new file mode 100644 index 00000000..691a8a2f --- /dev/null +++ b/integrations/sentry/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Sentry", + "version": "1.0.0", + "overview": "Send Sentry error events to LaunchDarkly experiments as metrics.", + "description": "Use Sentry error events as custom metric events in LaunchDarkly experiments, so you can measure results immediately, with minimal code instrumentation.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.sentry.io/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/sentry", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/sentry_square.svg", + "horizontal": "assets/images/sentry_horizontal.svg" + }, + "requiresOAuth": true, + "oauthIntegrationKey": "sentry", + "otherCapabilities": ["external"] +} diff --git a/package-lock.json b/package-lock.json index 4696785f..2b3922ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9874,6 +9874,12 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", From dfddef9faadf76fcfff2f90761a171f4d973f692 Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Fri, 7 Apr 2023 11:20:27 -0700 Subject: [PATCH 661/936] Adds header and link descriptions --- integrations/grafana/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/integrations/grafana/README.md b/integrations/grafana/README.md index 05afaeb7..0503290d 100644 --- a/integrations/grafana/README.md +++ b/integrations/grafana/README.md @@ -1,7 +1,9 @@ # Grafana -[User documentation](https://docs.launchdarkly.com/integrations/grafana) +Documentation for this integration is available on the LaunchDarkly documentation site: [User documentation](https://docs.launchdarkly.com/integrations/grafana) -[API documentation](https://grafana.com/docs/grafana/latest/http_api/annotations/#create-annotation) +API documentation for this integration is available on the Grafana documentation site: [API documentation](https://grafana.com/docs/grafana/latest/http_api/annotations/#create-annotation) + +## Getting started with the Grafana integration Run `npm run curl grafana` in the root repository directory to generate a `curl` command to send data to Grafana. From 90b8b149218cde73b4193ce5081ff3f8b4f568b6 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 17 Apr 2023 15:28:56 +0100 Subject: [PATCH 662/936] Add markdown to sample integration description (#445) --- integrations/sample-integration/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/sample-integration/manifest.json b/integrations/sample-integration/manifest.json index a1b86d35..3e103095 100644 --- a/integrations/sample-integration/manifest.json +++ b/integrations/sample-integration/manifest.json @@ -2,7 +2,7 @@ "name": "Sample Integration", "version": "1.0.0", "overview": "Short one-liner describing your integration.", - "description": "Send flag data to space. This field supports Markdown.", + "description": "Send flag data to space. This field supports Markdown.
Here is [a link](https://launchdarkly.com).", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 106a07f38edbdaa4f417f25e99da029bed04a5b6 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 19 Apr 2023 09:18:41 +0200 Subject: [PATCH 663/936] add okteto integration --- .../okteto/assets/okteto-logo-circular.svg | 5 +++++ .../okteto/assets/okteto-logo-horizontal.svg | 6 ++++++ integrations/okteto/manifest.json | 21 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 integrations/okteto/assets/okteto-logo-circular.svg create mode 100644 integrations/okteto/assets/okteto-logo-horizontal.svg create mode 100644 integrations/okteto/manifest.json diff --git a/integrations/okteto/assets/okteto-logo-circular.svg b/integrations/okteto/assets/okteto-logo-circular.svg new file mode 100644 index 00000000..35cba756 --- /dev/null +++ b/integrations/okteto/assets/okteto-logo-circular.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/okteto/assets/okteto-logo-horizontal.svg b/integrations/okteto/assets/okteto-logo-horizontal.svg new file mode 100644 index 00000000..a42e1592 --- /dev/null +++ b/integrations/okteto/assets/okteto-logo-horizontal.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/integrations/okteto/manifest.json b/integrations/okteto/manifest.json new file mode 100644 index 00000000..222f649b --- /dev/null +++ b/integrations/okteto/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Okteto", + "version": "1.0.0", + "overview": "Automatically create a LaunchDarkly environment for every development or preview environment.", + "description": "Automatically create a LaunchDarkly environment every time your team creates a development or preview environment in Okteto. This integration ensures your new LaunchDarkly environment always has the most up-to-date flag targeting. Okteto will automatically manage the lifecycle of the LaunchDarkly environment for you.", + "author": "Okteto Inc.", + "supportEmail": "support@okteto.com", + "links": { + "site": "https://okteto.com/", + "privacyPolicy": "https://okteto.com/legal", + "supportWebsite": "https://okteto.com/support", + "launchdarklyDocs": "https://github.com/okteto/launchdarkly" + }, + "categories": ["developer-tools", "automation"], + "icons": { + "square": "assets/okteto-logo-circular.svg", + "horizontal": "assets/okteto-logo-horizontal.svg" + }, + "requiresOAuth": false, + "otherCapabilities": ["external"] +} From d7025d98afccc9e2723389a0beb9ddca5332a366 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 19 Apr 2023 17:44:17 +0100 Subject: [PATCH 664/936] [sc-197729] Add learn more card for Confluence embedded pages integration (#447) * Add Confluence embedded pages learn more card * remove . --- .../assets/horizontal.svg | 32 +++++++++++++++++++ .../assets/square.svg | 22 +++++++++++++ .../confluence-embedded-pages/manifest.json | 19 +++++++++++ 3 files changed, 73 insertions(+) create mode 100644 integrations/confluence-embedded-pages/assets/horizontal.svg create mode 100644 integrations/confluence-embedded-pages/assets/square.svg create mode 100644 integrations/confluence-embedded-pages/manifest.json diff --git a/integrations/confluence-embedded-pages/assets/horizontal.svg b/integrations/confluence-embedded-pages/assets/horizontal.svg new file mode 100644 index 00000000..8772683b --- /dev/null +++ b/integrations/confluence-embedded-pages/assets/horizontal.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/confluence-embedded-pages/assets/square.svg b/integrations/confluence-embedded-pages/assets/square.svg new file mode 100644 index 00000000..6bff8029 --- /dev/null +++ b/integrations/confluence-embedded-pages/assets/square.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/integrations/confluence-embedded-pages/manifest.json b/integrations/confluence-embedded-pages/manifest.json new file mode 100644 index 00000000..6a62dd1b --- /dev/null +++ b/integrations/confluence-embedded-pages/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "Confluence embedded pages", + "version": "1.0.0", + "overview": "Embed Confluence pages in feature flag descriptions.", + "description": "Use this integration to embed Confluence pages in feature flag descriptions. These embedded pages empower your LaunchDarkly team members to view, edit, and comment on Confluence pages without leaving LaunchDarkly. This is particularly useful if the feature flag is associated with a feature or service that is documented in Confluence.

To use the integration, simply include one or more Confluence URLs in a feature flag's description. No additional configuration is required.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.atlassian.com/software/confluence", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/confluence", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["developer-tools"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "otherCapabilities": ["external"] +} From 75d3baffd467aec61f1591452faec99355794712 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 20 Apr 2023 17:31:23 +0100 Subject: [PATCH 665/936] Update Confluence manifest to match our documentation. (#448) --- integrations/confluence-embedded-pages/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/confluence-embedded-pages/manifest.json b/integrations/confluence-embedded-pages/manifest.json index 6a62dd1b..6e736631 100644 --- a/integrations/confluence-embedded-pages/manifest.json +++ b/integrations/confluence-embedded-pages/manifest.json @@ -1,8 +1,8 @@ { - "name": "Confluence embedded pages", + "name": "Confluence", "version": "1.0.0", "overview": "Embed Confluence pages in feature flag descriptions.", - "description": "Use this integration to embed Confluence pages in feature flag descriptions. These embedded pages empower your LaunchDarkly team members to view, edit, and comment on Confluence pages without leaving LaunchDarkly. This is particularly useful if the feature flag is associated with a feature or service that is documented in Confluence.

To use the integration, simply include one or more Confluence URLs in a feature flag's description. No additional configuration is required.", + "description": "Use this integration to embed Confluence pages in feature flag descriptions. These embedded pages let your LaunchDarkly team members to view, edit, and comment on Confluence pages without leaving LaunchDarkly. This is particularly useful if the feature flag is associated with a feature or service that is documented in Confluence.

To use the integration, simply include one or more Confluence URLs in a feature flag's description. No additional configuration is required.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From da437555097d08065bd2dc56f52dc67a60e68e13 Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 24 Apr 2023 12:47:24 +0100 Subject: [PATCH 666/936] pull in edgeconfigId correctly (#450) --- integrations/vercel/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/vercel/manifest.json b/integrations/vercel/manifest.json index 59bc2b88..7fe7874f 100644 --- a/integrations/vercel/manifest.json +++ b/integrations/vercel/manifest.json @@ -29,7 +29,7 @@ { "key": "teamId", "name": "Team ID", - "description": "You must have a Team ID available for flag updates. Enter the Team ID associated with your Vercel team.", + "description": "Enter the Team ID associated with your Vercel team.", "type": "string", "placeholder": "e.g. 0f2ac74b498b48028cb68387c421e279", "isOptional": true, @@ -61,7 +61,7 @@ }, "featureStoreRequest": { "endpoint": { - "url": "https://api.vercel.com/v1/edge-config/{{edgeConfigId}}/items", + "url": "https://api.vercel.com/v1/edge-config/{{edgeConfigId}}/items?teamId={{teamId}}", "method": "PATCH", "headers": [ { @@ -74,7 +74,7 @@ } ] }, - "payloadPrefix": "\"items\": [{\"operation\": \"upsert\", \"key\": \"ld-flags-FILLINENVID\", \"value\": ", + "payloadPrefix": "\"items\": [{\"operation\": \"upsert\", \"key\": \"ld-flags-{{edgeConfigId}}\", \"value\": ", "payloadSuffix": "}]" } } From c9d20d4fc9fd72264bcb4e79996076ec7411cec2 Mon Sep 17 00:00:00 2001 From: Sheena Carswell Date: Thu, 20 Apr 2023 15:03:30 -0700 Subject: [PATCH 667/936] Add the shell of a sentry auditLogEventsHook capability, so we can see subscription on integrations page --- .gitignore | 1 + integrations/sentry/manifest.json | 30 ++++++++++++++++++- .../sentry/templates/default.json.hbs | 2 ++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 integrations/sentry/templates/default.json.hbs diff --git a/.gitignore b/.gitignore index e5671446..2ca3b024 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules/ .cache .env +.idea *.log *.pid *.seed diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index 691a8a2f..30f76506 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -17,5 +17,33 @@ }, "requiresOAuth": true, "oauthIntegrationKey": "sentry", - "otherCapabilities": ["external"] + "otherCapabilities": ["external"], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "http://example.com/only/adding/this/to/see/on/integrations/page", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "SENTRY-API-KEY", + "value": "api-key-would-go-here" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "deny", + "resources": ["proj/*:env/*:flag/*"], + "actions": ["*"] + } + ] + } + } } diff --git a/integrations/sentry/templates/default.json.hbs b/integrations/sentry/templates/default.json.hbs new file mode 100644 index 00000000..2c63c085 --- /dev/null +++ b/integrations/sentry/templates/default.json.hbs @@ -0,0 +1,2 @@ +{ +} From 38594cc56ab481b1c4bdf88580fa0ff3cc9e55cf Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 25 Apr 2023 11:45:43 +0100 Subject: [PATCH 668/936] update manifest, remove validation (#452) --- integrations/vercel/manifest.json | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/integrations/vercel/manifest.json b/integrations/vercel/manifest.json index 7fe7874f..a1a5ac35 100644 --- a/integrations/vercel/manifest.json +++ b/integrations/vercel/manifest.json @@ -44,21 +44,6 @@ "isSecret": true } ], - "validationRequest": { - "endpoint": { - "url": "https://api.vercel.com/v1/edge-config/{edgeConfigId}/items?teamId={{teamId}}", - "method": "POST", - "headers": [ - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, - "parser": { - "success": "/success" - } - }, "featureStoreRequest": { "endpoint": { "url": "https://api.vercel.com/v1/edge-config/{{edgeConfigId}}/items?teamId={{teamId}}", @@ -74,8 +59,8 @@ } ] }, - "payloadPrefix": "\"items\": [{\"operation\": \"upsert\", \"key\": \"ld-flags-{{edgeConfigId}}\", \"value\": ", - "payloadSuffix": "}]" + "payloadPrefix": "{\"items\": [{\"operation\": \"upsert\", \"key\": \"LD-Env-{{envId}}\", \"value\": ", + "payloadSuffix": "}]}" } } } From 233472536c62049005e6a95802b7e651ed98b780 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 26 Apr 2023 11:44:04 +0100 Subject: [PATCH 669/936] Add externalConfigurationURL capability and use it in vercel manifest (#453) --- integrations/vercel/manifest.json | 4 +++- manifest.schema.d.ts | 5 +++++ manifest.schema.json | 11 ++++++++++- schemas/base.json | 6 +++++- schemas/capabilities/hideConfiguration.json | 8 ++++++++ 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/integrations/vercel/manifest.json b/integrations/vercel/manifest.json index a1a5ac35..a1555613 100644 --- a/integrations/vercel/manifest.json +++ b/integrations/vercel/manifest.json @@ -62,6 +62,8 @@ "payloadPrefix": "{\"items\": [{\"operation\": \"upsert\", \"key\": \"LD-Env-{{envId}}\", \"value\": ", "payloadSuffix": "}]}" } - } + }, + "hideConfiguration": true, + "externalConfigurationURL": "https://vercel.com/integrations/launchdarkly" } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index cfd9f8c2..85ee4e35 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -560,6 +560,10 @@ export type Elements1 = UIBlockElement[]; * This capability will disable in-app editing for the integration */ export type HideConfiguration = boolean; +/** + * This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. + */ +export type ExternalConfigurationURL = string; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -689,6 +693,7 @@ export interface Capabilities { featureStore?: FeatureStore; flagLink?: FlagLink; hideConfiguration?: HideConfiguration; + externalConfigurationURL?: ExternalConfigurationURL; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index dc8d60d9..02039220 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -686,7 +686,8 @@ "approval", "featureStore", "flagLink", - "hideConfiguration" + "hideConfiguration", + "externalConfigurationURL" ] }, "properties": { @@ -4031,6 +4032,14 @@ "description": "This capability will disable in-app editing for the integration", "type": "boolean", "default": false + }, + "externalConfigurationURL": { + "$id": "#/properties/capability/external-configuration-url", + "title": "External Configuration URL", + "description": "This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly.", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" } } }, diff --git a/schemas/base.json b/schemas/base.json index ed1a3ae2..417c5f6f 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -259,7 +259,8 @@ "approval", "featureStore", "flagLink", - "hideConfiguration" + "hideConfiguration", + "externalConfigurationURL" ] }, "properties": { @@ -283,6 +284,9 @@ }, "hideConfiguration": { "$ref": "schemas/capabilities/hideConfiguration.json#/hideConfiguration" + }, + "externalConfigurationURL": { + "$ref": "schemas/capabilities/hideConfiguration.json#/externalConfigurationURL" } } }, diff --git a/schemas/capabilities/hideConfiguration.json b/schemas/capabilities/hideConfiguration.json index 544821e6..e87d4eb3 100644 --- a/schemas/capabilities/hideConfiguration.json +++ b/schemas/capabilities/hideConfiguration.json @@ -6,5 +6,13 @@ "description": "This capability will disable in-app editing for the integration", "type": "boolean", "default": false + }, + "externalConfigurationURL": { + "$id": "#/properties/capability/external-configuration-url", + "title": "External Configuration URL", + "description": "This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly.", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" } } From 912091ec31c808aa7e39575bc369a4b58b3e94f8 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 26 Apr 2023 12:32:50 +0100 Subject: [PATCH 670/936] Update Vercel's horizontal svg (#454) --- integrations/vercel/assets/horizontal.svg | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/integrations/vercel/assets/horizontal.svg b/integrations/vercel/assets/horizontal.svg index 005232b8..79ec32e1 100644 --- a/integrations/vercel/assets/horizontal.svg +++ b/integrations/vercel/assets/horizontal.svg @@ -1 +1,6 @@ - + + + From aa67e3802e13384a8d68937414028e6898629653 Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 28 Apr 2023 11:57:14 +0100 Subject: [PATCH 671/936] add configurationId to manifest (#455) --- integrations/vercel/manifest.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/integrations/vercel/manifest.json b/integrations/vercel/manifest.json index a1555613..dce81442 100644 --- a/integrations/vercel/manifest.json +++ b/integrations/vercel/manifest.json @@ -42,6 +42,13 @@ "placeholder": "e.g. 8M7wS6hCpXVc-DoRnPPY_UCWPgy8aea4Wy6kCe5T", "type": "string", "isSecret": true + }, + { + "key": "configurationId", + "name": "Configuration Id", + "description": "Enter the configuration ID generated from Vercel.", + "placeholder": "e.g. icfg_oBB870y55RruY7KryPQqYdk3", + "type": "string" } ], "featureStoreRequest": { From 3412ee30094a918b72c16dcfe26440add5e3e242 Mon Sep 17 00:00:00 2001 From: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> Date: Tue, 9 May 2023 03:55:51 -0700 Subject: [PATCH 672/936] Updates URLs (#456) --- integrations/amplitude/manifest.json | 2 +- integrations/dynatrace-cloud-automation/manifest.json | 2 +- integrations/msteams/manifest.json | 2 +- integrations/signalfx/manifest.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/amplitude/manifest.json b/integrations/amplitude/manifest.json index 0ea38fd2..76967a00 100644 --- a/integrations/amplitude/manifest.json +++ b/integrations/amplitude/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.amplitude.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/users/synced-segments", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/contexts/synced-segments", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, "categories": ["synced-segments"], diff --git a/integrations/dynatrace-cloud-automation/manifest.json b/integrations/dynatrace-cloud-automation/manifest.json index a64d9739..fa13e618 100644 --- a/integrations/dynatrace-cloud-automation/manifest.json +++ b/integrations/dynatrace-cloud-automation/manifest.json @@ -17,7 +17,7 @@ }, "capabilities": { "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/dynatrace/triggers#connecting-a-launchdarkly-trigger-to-dynatrace-cloud-automation", + "documentation": "https://docs.launchdarkly.com/integrations/dynatrace/triggers#connecting-a-launchdarkly-trigger-to-dynatrace", "defaultEventName": "An event", "parser": { "eventName": "/eventName", diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index e151f5d9..e943afc1 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -20,7 +20,7 @@ "key": "url", "name": "Incoming webhook URL", "type": "uri", - "description": "Enter your Microsoft Teams [incoming webhook URL](https://docs.launchdarkly.com/integrations/microsoft-teams#setting-up-a-connector-in-microsoft-teams).", + "description": "Enter your Microsoft Teams [incoming webhook URL](https://docs.launchdarkly.com/integrations/microsoft-teams/webhooks#setting-up-a-connector-in-microsoft-teams).", "isSecret": false } ], diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 1b3932fe..2ff2f891 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -60,7 +60,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/signalfx/triggers#connecting-a-launchdarkly-trigger-to-signalfx", + "documentation": "https://docs.launchdarkly.com/integrations/signalfx/triggers#connecting-a-flag-trigger-to-signalfx", "parser": { "eventName": "/eventType", "url": "/detectorUrl" From a7712f5eb267ad52e6ef008cad1751d04478969b Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 10 May 2023 16:47:32 +0100 Subject: [PATCH 673/936] [sc-199246] store configurationid against feature destinations (#458) * add configurationId to manifest * add new external configuration capability --- manifest.schema.d.ts | 17 ++++++++ manifest.schema.json | 37 +++++++++++++++++- schemas/base.json | 8 +++- .../capabilities/externalConfiguration.json | 39 +++++++++++++++++++ schemas/capabilities/hideConfiguration.json | 8 ---- 5 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 schemas/capabilities/externalConfiguration.json diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 85ee4e35..525e8d80 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -564,6 +564,14 @@ export type HideConfiguration = boolean; * This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. */ export type ExternalConfigurationURL = string; +/** + * URL to redirect to for external creation flow + */ +export type CreateURL = string; +/** + * URL to redirect to for external edit flow + */ +export type EditURL = string; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -694,6 +702,7 @@ export interface Capabilities { flagLink?: FlagLink; hideConfiguration?: HideConfiguration; externalConfigurationURL?: ExternalConfigurationURL; + externalConfigurationPages?: ExternalConfigurationPages; [k: string]: unknown; } /** @@ -941,3 +950,11 @@ export interface FlagLinkContext { elements: Elements1; [k: string]: unknown; } +/** + * This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. It supports different URLs for create and edit. + */ +export interface ExternalConfigurationPages { + createUrl: CreateURL; + editUrl: EditURL; + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index 02039220..c62f0ca9 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -687,7 +687,8 @@ "featureStore", "flagLink", "hideConfiguration", - "externalConfigurationURL" + "externalConfigurationURL", + "externalConfigurationPages" ] }, "properties": { @@ -4040,6 +4041,40 @@ "type": "string", "maxLength": 2048, "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "externalConfigurationPages": { + "$id": "#/properties/capability/external-configuration-pages", + "title": "External Configuration Pages", + "description": "This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. It supports different URLs for create and edit.", + "type": "object", + "propertyNames": { + "enum": [ + "createUrl", + "editUrl" + ] + }, + "required": [ + "createUrl", + "editUrl" + ], + "properties": { + "createUrl": { + "$id": "#/properties/capability/external-configuration-url/createUrl", + "title": "Create URL", + "description": "URL to redirect to for external creation flow", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "editUrl": { + "$id": "#/properties/capability/external-configuration-url/editUrl", + "title": "Edit URL", + "description": "URL to redirect to for external edit flow", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + } + } } } }, diff --git a/schemas/base.json b/schemas/base.json index 417c5f6f..9fe09131 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -260,7 +260,8 @@ "featureStore", "flagLink", "hideConfiguration", - "externalConfigurationURL" + "externalConfigurationURL", + "externalConfigurationPages" ] }, "properties": { @@ -286,7 +287,10 @@ "$ref": "schemas/capabilities/hideConfiguration.json#/hideConfiguration" }, "externalConfigurationURL": { - "$ref": "schemas/capabilities/hideConfiguration.json#/externalConfigurationURL" + "$ref": "schemas/capabilities/externalConfiguration.json#/externalConfigurationURL" + }, + "externalConfigurationPages": { + "$ref": "schemas/capabilities/externalConfiguration.json#/externalConfigurationPages" } } }, diff --git a/schemas/capabilities/externalConfiguration.json b/schemas/capabilities/externalConfiguration.json new file mode 100644 index 00000000..3176a36d --- /dev/null +++ b/schemas/capabilities/externalConfiguration.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "externalConfigurationURL": { + "$id": "#/properties/capability/external-configuration-url", + "title": "External Configuration URL", + "description": "This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly.", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "externalConfigurationPages": { + "$id": "#/properties/capability/external-configuration-pages", + "title": "External Configuration Pages", + "description": "This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. It supports different URLs for create and edit.", + "type": "object", + "propertyNames": { + "enum": ["createUrl", "editUrl"] + }, + "required": ["createUrl", "editUrl"], + "properties": { + "createUrl": { + "$id": "#/properties/capability/external-configuration-url/createUrl", + "title": "Create URL", + "description": "URL to redirect to for external creation flow", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + }, + "editUrl": { + "$id": "#/properties/capability/external-configuration-url/editUrl", + "title": "Edit URL", + "description": "URL to redirect to for external edit flow", + "type": "string", + "maxLength": 2048, + "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" + } + } + } +} diff --git a/schemas/capabilities/hideConfiguration.json b/schemas/capabilities/hideConfiguration.json index e87d4eb3..544821e6 100644 --- a/schemas/capabilities/hideConfiguration.json +++ b/schemas/capabilities/hideConfiguration.json @@ -6,13 +6,5 @@ "description": "This capability will disable in-app editing for the integration", "type": "boolean", "default": false - }, - "externalConfigurationURL": { - "$id": "#/properties/capability/external-configuration-url", - "title": "External Configuration URL", - "description": "This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly.", - "type": "string", - "maxLength": 2048, - "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" } } From a9d2593fbf8651e306e80d89deefdd0c5d54f21b Mon Sep 17 00:00:00 2001 From: Darius Harrison Date: Wed, 10 May 2023 23:35:25 -0500 Subject: [PATCH 674/936] remove external configurationURL, add externalConfigurationPages --- integrations/vercel/manifest.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/integrations/vercel/manifest.json b/integrations/vercel/manifest.json index dce81442..719753f9 100644 --- a/integrations/vercel/manifest.json +++ b/integrations/vercel/manifest.json @@ -71,6 +71,9 @@ } }, "hideConfiguration": true, - "externalConfigurationURL": "https://vercel.com/integrations/launchdarkly" + "externalConfigurationPages": { + "createUrl": "https://vercel.com/integrations/launchdarkly/new", + "editUrl": "https://integrations.launchdarkly.com/vercel/configure/" + } } } From fc7b5778f977325d3dadba45c3f0b306bceabd82 Mon Sep 17 00:00:00 2001 From: Jon Mooring Date: Tue, 9 May 2023 15:55:17 -0700 Subject: [PATCH 675/936] =?UTF-8?q?Revert=20"[sc-195250]=20[=20]=20Add=20t?= =?UTF-8?q?he=20shell=20of=20a=20sentry=20auditLogEventsHook=20capability,?= =?UTF-8?q?=20so=20we=20can=20se=E2=80=A6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - integrations/sentry/manifest.json | 30 +------------------ .../sentry/templates/default.json.hbs | 2 -- 3 files changed, 1 insertion(+), 32 deletions(-) delete mode 100644 integrations/sentry/templates/default.json.hbs diff --git a/.gitignore b/.gitignore index 2ca3b024..e5671446 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ node_modules/ .cache .env -.idea *.log *.pid *.seed diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index 30f76506..691a8a2f 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -17,33 +17,5 @@ }, "requiresOAuth": true, "oauthIntegrationKey": "sentry", - "otherCapabilities": ["external"], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "http://example.com/only/adding/this/to/see/on/integrations/page", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "SENTRY-API-KEY", - "value": "api-key-would-go-here" - } - ] - }, - "templates": { - "default": "templates/default.json.hbs" - }, - "defaultPolicy": [ - { - "effect": "deny", - "resources": ["proj/*:env/*:flag/*"], - "actions": ["*"] - } - ] - } - } + "otherCapabilities": ["external"] } diff --git a/integrations/sentry/templates/default.json.hbs b/integrations/sentry/templates/default.json.hbs deleted file mode 100644 index 2c63c085..00000000 --- a/integrations/sentry/templates/default.json.hbs +++ /dev/null @@ -1,2 +0,0 @@ -{ -} From 3c920b59d16597af75c6b81416531bef5e07789d Mon Sep 17 00:00:00 2001 From: Darius Harrison Date: Thu, 11 May 2023 12:52:55 -0500 Subject: [PATCH 676/936] Gonfalon The panel in LD refers to the JS [sc-202359] --- integrations/vercel/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/vercel/manifest.json b/integrations/vercel/manifest.json index 719753f9..fb07c4ee 100644 --- a/integrations/vercel/manifest.json +++ b/integrations/vercel/manifest.json @@ -1,8 +1,8 @@ { "name": "Vercel", "version": "1.0.0", - "overview": "Evaluate feature flags and bootstrap the LaunchDarkly Javascript SDK from the Vercel Edge.", - "description": "Evaluate feature flags and bootstrap the LaunchDarkly Javascript SDK from Vercel Edge by storing flag data in Vercel's Edge Config offering.", + "overview": "Evaluate feature flags and bootstrap the LaunchDarkly Vercel SDK from the Vercel Edge.", + "description": "Evaluate feature flags and bootstrap the LaunchDarkly Vercel SDK from Vercel Edge by storing flag data in Vercel's Edge Config offering.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From c8c687d396e84269fb400bbb9afdf095b518ee7a Mon Sep 17 00:00:00 2001 From: Darius Harrison Date: Mon, 15 May 2023 12:10:13 -0500 Subject: [PATCH 677/936] add externalConfigurationURL back to Vercel manifest --- integrations/vercel/manifest.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/integrations/vercel/manifest.json b/integrations/vercel/manifest.json index fb07c4ee..0509d360 100644 --- a/integrations/vercel/manifest.json +++ b/integrations/vercel/manifest.json @@ -71,9 +71,6 @@ } }, "hideConfiguration": true, - "externalConfigurationPages": { - "createUrl": "https://vercel.com/integrations/launchdarkly/new", - "editUrl": "https://integrations.launchdarkly.com/vercel/configure/" - } + "externalConfigurationURL": "https://vercel.com/integrations/launchdarkly" } } From 1fed92b16a7a51a8945d02e93ce29f3f3c0bef75 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 18 May 2023 13:58:16 -0500 Subject: [PATCH 678/936] Added Akamai EdgeWorker manifest --- .../akamai-edgeworkers/assets/horizontal.svg | 151 ++++++++++++++++++ .../akamai-edgeworkers/assets/square.svg | 151 ++++++++++++++++++ integrations/akamai-edgeworkers/manifest.json | 111 +++++++++++++ 3 files changed, 413 insertions(+) create mode 100644 integrations/akamai-edgeworkers/assets/horizontal.svg create mode 100644 integrations/akamai-edgeworkers/assets/square.svg create mode 100644 integrations/akamai-edgeworkers/manifest.json diff --git a/integrations/akamai-edgeworkers/assets/horizontal.svg b/integrations/akamai-edgeworkers/assets/horizontal.svg new file mode 100644 index 00000000..49633d3a --- /dev/null +++ b/integrations/akamai-edgeworkers/assets/horizontal.svg @@ -0,0 +1,151 @@ + + + +image/svg+xml diff --git a/integrations/akamai-edgeworkers/assets/square.svg b/integrations/akamai-edgeworkers/assets/square.svg new file mode 100644 index 00000000..2383d7fd --- /dev/null +++ b/integrations/akamai-edgeworkers/assets/square.svg @@ -0,0 +1,151 @@ + + + +image/svg+xml diff --git a/integrations/akamai-edgeworkers/manifest.json b/integrations/akamai-edgeworkers/manifest.json new file mode 100644 index 00000000..c59282a3 --- /dev/null +++ b/integrations/akamai-edgeworkers/manifest.json @@ -0,0 +1,111 @@ +{ + "name": "Akamai EdgeWorkers", + "version": "1.0.0", + "overview": "Evaluate feature flags with our LaunchDarkly Akamai Edge SDK from your Akamai EdgeWorker functions.", + "description": "Evaluate feature flags with our LaunchDarkly Akamai Edge SDK from your Akamai EdgeWorker functions by storing flag data in Akamai's EdgeKV store.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.akamai.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/akamai", + "privacyPolicy": "https://www.akamai.com/legal/compliance/privacy-trust-center/" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "featureStore": { + "formVariables": [ + { + "key": "hostname", + "name": "Host", + "description": "The unique host domain that will receive API requests. This can be found on your API client details page from your Akamai [Identity and Access Management](https://techdocs.akamai.com/developer/docs/create-a-client-with-custom-permissions) dashboard.", + "type": "string", + "placeholder": "e.g. abcd-xxxxxx-xxxx.luna-dev.akamaiapis.net", + "isSecret": false + }, + { + "key": "network", + "name": "Network", + "description": "Network environment to execute the API request on.", + "type": "enum", + "defaultValue": "production", + "allowedValues": ["production", "staging"] + }, + { + "key": "namespaceId", + "name": "EdgeKV Namespace", + "description": "EdgeKV Namespace identifier where data will be stored.", + "type": "string", + "placeholder": "e.g. default", + "isSecret": false + }, + { + "key": "groupId", + "name": "EdgeKV Group", + "description": "Unique identifier for the group within your EdgeKV namespace.", + "type": "string", + "placeholder": "e.g. 12345", + "isSecret": false + }, + { + "key": "clientSecret", + "name": "Client Secret", + "description": "Enter the API client secret generated from the Akamai Control Center. See instructions for generating [authentication credentials](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials).", + "type": "string", + "placeholder": "e.g. xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxx", + "isSecret": true + }, + { + "key": "clientToken", + "name": "Client Token", + "description": "Enter the API client token generated from the Akamai Control Center. See instructions for generating [authentication credentials](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials).", + "type": "string", + "placeholder": "e.g. akaa-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxx", + "isSecret": true + }, + { + "key": "accessToken", + "name": "Access Token", + "description": "Enter the API client access token generated from the Akamai Control Center. See instructions for generating [authentication credentials](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials).", + "type": "string", + "placeholder": "e.g. akaa-xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx", + "isSecret": true + } + ], + "validationRequest": { + "endpoint": { + "url": "https://{{hostname}}/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}/groups/{{groupId}}/items/{{_featureStoreKey}}", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{edgeGridAuth hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" + } + ] + }, + "parser": { + "success": "/success" + } + }, + "featureStoreRequest": { + "endpoint": { + "url": "https://{{hostname}}/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}/groups/{{groupId}}/items/{{_featureStoreKey}}", + "method": "PUT", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{edgeGridAuth hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" + }, + { + "name": "Content-Type", + "value": "text/plain" + } + ] + } + } + } + } +} From a6654706f5472a921e5624b3e668957c5394b5b1 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 18 May 2023 20:19:47 -0500 Subject: [PATCH 679/936] Updated edgeGrid helper func params and fixed auth header for validation req --- integrations/akamai-edgeworkers/manifest.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/akamai-edgeworkers/manifest.json b/integrations/akamai-edgeworkers/manifest.json index c59282a3..04daabe4 100644 --- a/integrations/akamai-edgeworkers/manifest.json +++ b/integrations/akamai-edgeworkers/manifest.json @@ -77,12 +77,12 @@ ], "validationRequest": { "endpoint": { - "url": "https://{{hostname}}/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}/groups/{{groupId}}/items/{{_featureStoreKey}}", + "url": "https://{{hostname}}/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}}/groups/{{groupId}}/items/{{_featureStoreKey}}", "method": "GET", "headers": [ { "name": "Authorization", - "value": "Bearer {{edgeGridAuth hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" + "value": "{{edgeGridAuth 'GET' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" } ] }, @@ -92,12 +92,12 @@ }, "featureStoreRequest": { "endpoint": { - "url": "https://{{hostname}}/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}/groups/{{groupId}}/items/{{_featureStoreKey}}", + "url": "https://{{hostname}}/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}}/groups/{{groupId}}/items/{{_featureStoreKey}}", "method": "PUT", "headers": [ { "name": "Authorization", - "value": "Bearer {{edgeGridAuth hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" + "value": "Bearer {{edgeGridAuth 'PUT' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" }, { "name": "Content-Type", From c2b6aa32d385cde89dd489b3d475057f37e7067d Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Sat, 20 May 2023 18:14:03 -0500 Subject: [PATCH 680/936] Updated Akamai manifest and added edgeGrid tests --- __tests__/validateAkamaiEdgeGridAuth.js | 69 +++++++++++++++++++ integrations/akamai-edgeworkers/manifest.json | 6 +- 2 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 __tests__/validateAkamaiEdgeGridAuth.js diff --git a/__tests__/validateAkamaiEdgeGridAuth.js b/__tests__/validateAkamaiEdgeGridAuth.js new file mode 100644 index 00000000..dcec2c8b --- /dev/null +++ b/__tests__/validateAkamaiEdgeGridAuth.js @@ -0,0 +1,69 @@ +const { getManifests } = require('./__utils__'); + +const manifests = getManifests(); + +const [_, akamaiEdgeWorkerManifest] = manifests.find( + ([dir, mfst]) => dir === 'akamai-edgeworkers' +); + +// We're validating Akamai specific manifest because it uses a custom handlebar helper +// called edgeGridAuth which expects certain arguments to generate a valid auth token +describe("Validate Akamai EdgeWorker's edgeGrid auth helper ", () => { + test('manifest exists', () => { + expect(akamaiEdgeWorkerManifest).toBeDefined(); + }); + + // currently the edgeGridAuth helper does not support http POST, this is because for POST requests + // the request body needs to be included in the header signature and we dont have the request body + // available when the template is being rendered. To support POST methods the edgeGridAuth helper needs to refactored. + test('validation and feature request endpoint method is not POST', () => { + const unsupportedMethod = ['POST']; + const validationHttpMethod = + akamaiEdgeWorkerManifest.capabilities.featureStore.validationRequest + .endpoint.method; + expect(unsupportedMethod.includes(validationHttpMethod.toUpperCase())).toBe( + false + ); + + const featureStoreHttpMethod = + akamaiEdgeWorkerManifest.capabilities.featureStore.featureStoreRequest + .endpoint.method; + expect( + unsupportedMethod.includes(featureStoreHttpMethod.toUpperCase()) + ).toBe(false); + }); + + test('validation endpoint path and http method matches edgegrid host', () => { + const httpMethod = + akamaiEdgeWorkerManifest.capabilities.featureStore.validationRequest + .endpoint.method; + const endpointUrl = + akamaiEdgeWorkerManifest.capabilities.featureStore.validationRequest + .endpoint.url; + const urlPath = endpointUrl.replace('https://{{hostname}}', ''); + + const authHeader = + akamaiEdgeWorkerManifest.capabilities.featureStore.validationRequest + .endpoint.headers[0].value; + expect(authHeader).toEqual( + `{{edgeGridAuth '${httpMethod}' '${urlPath}' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}` + ); + }); + + test('feature store endpoint path and http method matches edgegrid host', () => { + const httpMethod = + akamaiEdgeWorkerManifest.capabilities.featureStore.featureStoreRequest + .endpoint.method; + const endpointUrl = + akamaiEdgeWorkerManifest.capabilities.featureStore.featureStoreRequest + .endpoint.url; + const urlPath = endpointUrl.replace('https://{{hostname}}', ''); + + const authHeader = + akamaiEdgeWorkerManifest.capabilities.featureStore.featureStoreRequest + .endpoint.headers[0].value; + expect(authHeader).toEqual( + `Bearer {{edgeGridAuth '${httpMethod}' '${urlPath}' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}` + ); + }); +}); diff --git a/integrations/akamai-edgeworkers/manifest.json b/integrations/akamai-edgeworkers/manifest.json index 04daabe4..e8d188cf 100644 --- a/integrations/akamai-edgeworkers/manifest.json +++ b/integrations/akamai-edgeworkers/manifest.json @@ -77,12 +77,12 @@ ], "validationRequest": { "endpoint": { - "url": "https://{{hostname}}/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}}/groups/{{groupId}}/items/{{_featureStoreKey}}", + "url": "https://{{hostname}}/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}}", "method": "GET", "headers": [ { "name": "Authorization", - "value": "{{edgeGridAuth 'GET' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" + "value": "{{edgeGridAuth 'GET' '/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}}' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" } ] }, @@ -97,7 +97,7 @@ "headers": [ { "name": "Authorization", - "value": "Bearer {{edgeGridAuth 'PUT' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" + "value": "Bearer {{edgeGridAuth 'PUT' '/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}}/groups/{{groupId}}/items/{{_featureStoreKey}}' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" }, { "name": "Content-Type", From 7c9c15ec1c109a360dc41c37a4b7ca27859b729e Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 23 May 2023 10:05:50 -0500 Subject: [PATCH 681/936] Removed Bearer type from Akamai PUT feature store token --- __tests__/validateAkamaiEdgeGridAuth.js | 2 +- integrations/akamai-edgeworkers/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/__tests__/validateAkamaiEdgeGridAuth.js b/__tests__/validateAkamaiEdgeGridAuth.js index dcec2c8b..b71ca821 100644 --- a/__tests__/validateAkamaiEdgeGridAuth.js +++ b/__tests__/validateAkamaiEdgeGridAuth.js @@ -63,7 +63,7 @@ describe("Validate Akamai EdgeWorker's edgeGrid auth helper ", () => { akamaiEdgeWorkerManifest.capabilities.featureStore.featureStoreRequest .endpoint.headers[0].value; expect(authHeader).toEqual( - `Bearer {{edgeGridAuth '${httpMethod}' '${urlPath}' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}` + `{{edgeGridAuth '${httpMethod}' '${urlPath}' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}` ); }); }); diff --git a/integrations/akamai-edgeworkers/manifest.json b/integrations/akamai-edgeworkers/manifest.json index e8d188cf..7e1230e4 100644 --- a/integrations/akamai-edgeworkers/manifest.json +++ b/integrations/akamai-edgeworkers/manifest.json @@ -97,7 +97,7 @@ "headers": [ { "name": "Authorization", - "value": "Bearer {{edgeGridAuth 'PUT' '/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}}/groups/{{groupId}}/items/{{_featureStoreKey}}' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" + "value": "{{edgeGridAuth 'PUT' '/edgekv/v1/networks/{{network}}/namespaces/{{namespaceId}}/groups/{{groupId}}/items/{{_featureStoreKey}}' hostname network namespaceId groupId _featureStoreKey clientSecret clientToken accessToken}}" }, { "name": "Content-Type", From 4f417ab144cb607a356a7bcad515078476427028 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 31 May 2023 08:13:11 -0400 Subject: [PATCH 682/936] add sprig integration listing --- .../sprig/assets/images/horizontal.svg | 29 +++++++++++++++++++ integrations/sprig/assets/images/square.svg | 29 +++++++++++++++++++ integrations/sprig/manifest.json | 19 ++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 integrations/sprig/assets/images/horizontal.svg create mode 100644 integrations/sprig/assets/images/square.svg create mode 100644 integrations/sprig/manifest.json diff --git a/integrations/sprig/assets/images/horizontal.svg b/integrations/sprig/assets/images/horizontal.svg new file mode 100644 index 00000000..43e37f32 --- /dev/null +++ b/integrations/sprig/assets/images/horizontal.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/integrations/sprig/assets/images/square.svg b/integrations/sprig/assets/images/square.svg new file mode 100644 index 00000000..43e37f32 --- /dev/null +++ b/integrations/sprig/assets/images/square.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/integrations/sprig/manifest.json b/integrations/sprig/manifest.json new file mode 100644 index 00000000..57b5bda9 --- /dev/null +++ b/integrations/sprig/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "Sprig", + "version": "1.0.0", + "overview": "Target visitors to send Sprig surveys.", + "description": "Target visitors in LaunchDarkly experiments or feature flags to send Sprig surveys to gain user's insights.", + "author": "LaunchDarkly", + "supportEmail": "support@sprig.com", + "links": { + "site": "https://www.sprig.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/sprig", + "privacyPolicy": "https://sprig.com/privacy-policy" + }, + "categories": ["messaging", "developer-tools"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "otherCapabilities": ["external"] +} From 40c4e7a0bf582d1b7331bf5284f97ca8d586c521 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 7 Jun 2023 23:18:52 -0500 Subject: [PATCH 683/936] Update verbiage for Akamai integration --- integrations/akamai-edgeworkers/manifest.json | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/integrations/akamai-edgeworkers/manifest.json b/integrations/akamai-edgeworkers/manifest.json index 7e1230e4..6e88cbe9 100644 --- a/integrations/akamai-edgeworkers/manifest.json +++ b/integrations/akamai-edgeworkers/manifest.json @@ -21,7 +21,7 @@ { "key": "hostname", "name": "Host", - "description": "The unique host domain that will receive API requests. This can be found on your API client details page from your Akamai [Identity and Access Management](https://techdocs.akamai.com/developer/docs/create-a-client-with-custom-permissions) dashboard.", + "description": "The unique host domain that will receive API requests. You can find this on your API client details page from your Akamai [Identity and Access Management](https://techdocs.akamai.com/developer/docs/create-a-client-with-custom-permissions) dashboard.", "type": "string", "placeholder": "e.g. abcd-xxxxxx-xxxx.luna-dev.akamaiapis.net", "isSecret": false @@ -29,22 +29,22 @@ { "key": "network", "name": "Network", - "description": "Network environment to execute the API request on.", + "description": "Akamai network environment to execute the API request on.", "type": "enum", "defaultValue": "production", "allowedValues": ["production", "staging"] }, { "key": "namespaceId", - "name": "EdgeKV Namespace", - "description": "EdgeKV Namespace identifier where data will be stored.", + "name": "EdgeKV namespace", + "description": "EdgeKV namespace identifier where data will be stored.", "type": "string", "placeholder": "e.g. default", "isSecret": false }, { "key": "groupId", - "name": "EdgeKV Group", + "name": "EdgeKV group", "description": "Unique identifier for the group within your EdgeKV namespace.", "type": "string", "placeholder": "e.g. 12345", @@ -52,24 +52,24 @@ }, { "key": "clientSecret", - "name": "Client Secret", - "description": "Enter the API client secret generated from the Akamai Control Center. See instructions for generating [authentication credentials](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials).", + "name": "Client secret", + "description": "Enter the API client secret generated from the Akamai Control Center. To learn more, read the Akamai instructions for [authentication credentials](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials).", "type": "string", "placeholder": "e.g. xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxx", "isSecret": true }, { "key": "clientToken", - "name": "Client Token", - "description": "Enter the API client token generated from the Akamai Control Center. See instructions for generating [authentication credentials](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials).", + "name": "Client token", + "description": "Enter the API client token generated from the Akamai Control Center. To learn more, read the Akamai instructions for [authentication credentials](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials).", "type": "string", "placeholder": "e.g. akaa-xxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxx", "isSecret": true }, { "key": "accessToken", - "name": "Access Token", - "description": "Enter the API client access token generated from the Akamai Control Center. See instructions for generating [authentication credentials](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials).", + "name": "Access token", + "description": "Enter the API client access token generated from the Akamai Control Center. To learn more, read the Akamai instructions for [authentication credentials](https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials).", "type": "string", "placeholder": "e.g. akaa-xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx", "isSecret": true From 2bca604c27caaf0b3550047f300a45bc89e02d8d Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 8 Jun 2023 09:21:13 -0400 Subject: [PATCH 684/936] add Resmo from public --- .../resmo/assets/images/horizontal.svg | 8 ++++++++ integrations/resmo/assets/images/square.svg | 4 ++++ integrations/resmo/manifest.json | 20 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 integrations/resmo/assets/images/horizontal.svg create mode 100644 integrations/resmo/assets/images/square.svg create mode 100644 integrations/resmo/manifest.json diff --git a/integrations/resmo/assets/images/horizontal.svg b/integrations/resmo/assets/images/horizontal.svg new file mode 100644 index 00000000..a8348d6a --- /dev/null +++ b/integrations/resmo/assets/images/horizontal.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/integrations/resmo/assets/images/square.svg b/integrations/resmo/assets/images/square.svg new file mode 100644 index 00000000..d867299e --- /dev/null +++ b/integrations/resmo/assets/images/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/resmo/manifest.json b/integrations/resmo/manifest.json new file mode 100644 index 00000000..412eb0cd --- /dev/null +++ b/integrations/resmo/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Resmo", + "version": "1.0.0", + "overview": "Resmo enhances your LaunchDarkly resources' visibility, compliance, and security posture.", + "description": "Resmo is a powerful platform that seamlessly integrates with LaunchDarkly to enhance the visibility, security, and compliance of your LaunchDarkly resources.

Resmo provides valuable insights into your organization’s feature flag management, projects, environments, and team information.

Additionally, Resmo offers the ability to set up alerts for security violations and changes, ensuring timely notifications through popular communication channels such as Jira, Slack, email, and more.", + "author": "Resmo", + "supportEmail": "support@resmo.com", + "links": { + "site": "https://www.resmo.com", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/resmo", + "privacyPolicy": "https://www.resmo.com/legal/privacy" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "requiresOAuth": false, + "otherCapabilities": ["external"] +} From 5fa40d5802be9cc153ad2de2b25e148ad6004b65 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 12 Jun 2023 17:04:34 -0500 Subject: [PATCH 685/936] Removed unused fastly and Akamai integrations --- integrations/akamai/assets/horizontal.svg | 151 ------------------ integrations/akamai/assets/square.svg | 151 ------------------ integrations/akamai/manifest.json | 55 ------- .../akamai/templates/default.json.hbs | 2 - integrations/fastly/assets/horizontal.svg | 36 ----- integrations/fastly/assets/square.svg | 1 - integrations/fastly/manifest.json | 55 ------- .../fastly/templates/default.json.hbs | 2 - 8 files changed, 453 deletions(-) delete mode 100644 integrations/akamai/assets/horizontal.svg delete mode 100644 integrations/akamai/assets/square.svg delete mode 100644 integrations/akamai/manifest.json delete mode 100644 integrations/akamai/templates/default.json.hbs delete mode 100644 integrations/fastly/assets/horizontal.svg delete mode 100644 integrations/fastly/assets/square.svg delete mode 100644 integrations/fastly/manifest.json delete mode 100644 integrations/fastly/templates/default.json.hbs diff --git a/integrations/akamai/assets/horizontal.svg b/integrations/akamai/assets/horizontal.svg deleted file mode 100644 index 49633d3a..00000000 --- a/integrations/akamai/assets/horizontal.svg +++ /dev/null @@ -1,151 +0,0 @@ - - - -image/svg+xml diff --git a/integrations/akamai/assets/square.svg b/integrations/akamai/assets/square.svg deleted file mode 100644 index 2383d7fd..00000000 --- a/integrations/akamai/assets/square.svg +++ /dev/null @@ -1,151 +0,0 @@ - - - -image/svg+xml diff --git a/integrations/akamai/manifest.json b/integrations/akamai/manifest.json deleted file mode 100644 index 7cc95377..00000000 --- a/integrations/akamai/manifest.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "Akamai", - "version": "1.0.0", - "overview": "Evaluate LaunchDarkly feature flags in Akamai Edge Workers.", - "description": "Evaluate LaunchDarkly feature flags in Akamai Edge Workers for improved performance.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://www.akamai.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/akamai", - "privacyPolicy": "https://www.akamai.com/us/en/privacy-policies/" - }, - "categories": ["infrastructure"], - "icons": { - "square": "assets/square.svg", - "horizontal": "assets/horizontal.svg" - }, - "formVariables": [ - { - "key": "apiKey", - "name": "Akamai API key", - "type": "string", - "description": "Enter your Akamai API key.", - "isSecret": true - } - ], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "http://example.com/path/to/nowhere", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "AKAMAI-API-KEY", - "value": "api-key-would-go-here" - } - ] - }, - "templates": { - "default": "templates/default.json.hbs" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } -} diff --git a/integrations/akamai/templates/default.json.hbs b/integrations/akamai/templates/default.json.hbs deleted file mode 100644 index 2c63c085..00000000 --- a/integrations/akamai/templates/default.json.hbs +++ /dev/null @@ -1,2 +0,0 @@ -{ -} diff --git a/integrations/fastly/assets/horizontal.svg b/integrations/fastly/assets/horizontal.svg deleted file mode 100644 index ab886ee0..00000000 --- a/integrations/fastly/assets/horizontal.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - diff --git a/integrations/fastly/assets/square.svg b/integrations/fastly/assets/square.svg deleted file mode 100644 index ef542f9f..00000000 --- a/integrations/fastly/assets/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/fastly/manifest.json b/integrations/fastly/manifest.json deleted file mode 100644 index cbc61e23..00000000 --- a/integrations/fastly/manifest.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "Fastly", - "version": "1.0.0", - "overview": "Evaluate LaunchDarkly feature flags in Fastly's Compute@Edge offering.", - "description": "Evaluate LaunchDarkly feature flags in Fastly's Compute@Edge offering by storing flag rules in Fastly's edge dictionary.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://www.fastly.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/fastly", - "privacyPolicy": "https://www.fastly.com/privacy/" - }, - "categories": ["infrastructure"], - "icons": { - "square": "assets/square.svg", - "horizontal": "assets/horizontal.svg" - }, - "formVariables": [ - { - "key": "apiKey", - "name": "Fastly API key", - "type": "string", - "description": "Enter your Fastly API key.", - "isSecret": true - } - ], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "http://example.com/path/to/nowhere", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "FASTLY-API-KEY", - "value": "api-key-would-go-here" - } - ] - }, - "templates": { - "default": "templates/default.json.hbs" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } -} diff --git a/integrations/fastly/templates/default.json.hbs b/integrations/fastly/templates/default.json.hbs deleted file mode 100644 index 2c63c085..00000000 --- a/integrations/fastly/templates/default.json.hbs +++ /dev/null @@ -1,2 +0,0 @@ -{ -} From 67a89851f650c6af50b196f4fd78e8416f8b21af Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 12 Jun 2023 23:41:07 -0500 Subject: [PATCH 686/936] Added synced segment capability --- __tests__/validateSyncedSegmentCapability.js | 76 ++++++++++ manifest.schema.d.ts | 86 +++++++++++ manifest.schema.json | 144 ++++++++++++++++++- schemas/base.json | 6 +- schemas/capabilities/syncedSegment.json | 137 ++++++++++++++++++ 5 files changed, 447 insertions(+), 2 deletions(-) create mode 100644 __tests__/validateSyncedSegmentCapability.js create mode 100644 schemas/capabilities/syncedSegment.json diff --git a/__tests__/validateSyncedSegmentCapability.js b/__tests__/validateSyncedSegmentCapability.js new file mode 100644 index 00000000..a6b32aad --- /dev/null +++ b/__tests__/validateSyncedSegmentCapability.js @@ -0,0 +1,76 @@ +const { getManifests } = require('./__utils__'); + +const manifests = getManifests(); + +const manifestsWithCapability = manifests.filter( + ([dir, mfst]) => !!mfst.capabilities?.syncedSegment +); + +// test a happy path because jest test fails when there no manifest with the capability defined to run in the jest test suite +manifestsWithCapability.push([ + 'dummy_manifest', + { + capabilities: { + syncedSegment: { + requestParser: { + environmentIdPath: '/environmentId', + cohortIdPath: '/batch[0]/cohortId', + cohortNamePath: '/batch[0]/cohortName', + cohortUrlPath: '/batch[0]/cohortUrl', + memberArrayPath: '/batch', + arrayInclusionMatcher: 'a', + memberArrayParser: { + memberIdPath: '/userId', + booleanMembershipPath: '/value', + }, + }, + }, + }, + }, +]); + +describe('Validate Synced Segment Capability Dependencies', () => { + manifestsWithCapability.forEach(([_, manifest]) => { + test(`${manifest.name} syncedSegement capability: addMemberArrayPath is required when removeMemberArrayPath is specified`, () => { + const rp = manifest.capabilities.syncedSegment?.requestParser; + if (!!rp?.removeMemberArrayPath) { + expect(rp.addMemberArrayPath).toBeDefined(); + } + }); + + test(`${manifest.name} syncedSegement capability: removeMemberArrayPath is required when addMemberArrayPath is specified`, () => { + const rp = manifest.capabilities.syncedSegment?.requestParser; + if (!!rp?.addMemberArrayPath) { + expect(rp.removeMemberArrayPath).toBeDefined(); + } + }); + + test(`${manifest.name} syncedSegement capability: memberArrayPath should not be specified when addMemberArrayPath or removeMemberArrayPath are specified`, () => { + const rp = manifest.capabilities.syncedSegment?.requestParser; + if (!!rp?.addMemberArrayPath || !!rp.removeMemberArrayPath) { + expect(rp.memberArrayPath).toBeUndefined(); + } + }); + + test(`${manifest.name} syncedSegement capability: memberArrayPath should be specified when arrayInclusionMatcher is specified`, () => { + const rp = manifest.capabilities.syncedSegment?.requestParser; + if (!!rp?.arrayInclusionMatcher) { + expect(rp.memberArrayPath).toBeDefined(); + } + }); + + test(`${manifest.name} syncedSegement capability: arrayInclusionMatcher should not be specified when addMemberArrayPath or removeMemberArrayPath are specified`, () => { + const rp = manifest.capabilities.syncedSegment?.requestParser; + if (!!rp?.addMemberArrayPath || !!rp.removeMemberArrayPath) { + expect(rp.arrayInclusionMatcher).toBeUndefined(); + } + }); + + test(`${manifest.name} syncedSegement capability: memberArrayParser.booleanMembershipPath should be specified when memberArrayPath is specified`, () => { + const rp = manifest.capabilities.syncedSegment?.requestParser; + if (!!rp?.memberArrayParser?.booleanMembershipPath) { + expect(rp.memberArrayPath).toBeDefined(); + } + }); + }); +}); diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 525e8d80..570e4c9b 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -572,6 +572,58 @@ export type CreateURL = string; * URL to redirect to for external edit flow */ export type EditURL = string; +/** + * JSON string to be returned as a response + */ +export type ResponseBody = string; +/** + * JSON pointer to the LaunchDarkly environment id + */ +export type EnvironmentIdPath = string; +/** + * JSON pointer to the cohort id + */ +export type CohortIdPath = string; +/** + * JSON pointer to the cohort name + */ +export type CohortNamePath = string; +/** + * JSON pointer to the cohort URL path + */ +export type CohortUrlPath = string; +/** + * JSON pointer to the array containing members to be added or removed from the segment + */ +export type MemberArrayPath1 = string; +/** + * JSON pointer to the array containing members to be added to the segment. Required if removeMemberArrayPath is specified + */ +export type AddMemberArrayPath = string; +/** + * JSON pointer to the array containing members to be removed to the segment. Required if addMemberArrayPath is specified + */ +export type RemoveMemberArrayPath = string; +/** + * Regex indicating the action to be taken for the members in the segment. If it matches the value of the arrayInclusionFieldPath, the members of the incoming segment will be added otherwise they will be removed + */ +export type ArrayInclusionMatcher = string; +/** + * JSON pointer to the member id + */ +export type MemberIdPath = string; +/** + * JSON pointer to the property in member array payload indicating whether the member should be added or removed + */ +export type BooleanMembershipPath = string; +/** + * JSON pointer to the cohort name. Overrides the cohort name for a single member + */ +export type CohortNamePath1 = string; +/** + * JSON pointer to the cohort id. Overrides the cohort id for a single member + */ +export type CohortIdPath1 = string; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -703,6 +755,7 @@ export interface Capabilities { hideConfiguration?: HideConfiguration; externalConfigurationURL?: ExternalConfigurationURL; externalConfigurationPages?: ExternalConfigurationPages; + syncedSegment?: SyncedSegment; [k: string]: unknown; } /** @@ -958,3 +1011,36 @@ export interface ExternalConfigurationPages { editUrl: EditURL; [k: string]: unknown; } +/** + * This capability is used to manage the creation and synchronization of synced segments + */ +export interface SyncedSegment { + jsonBody?: ResponseBody; + requestParser: RequestParser; + [k: string]: unknown; +} +/** + * Describes a mapping of property name to a location in the JSON request payload specified by a JSON pointer + */ +export interface RequestParser { + environmentIdPath: EnvironmentIdPath; + cohortIdPath: CohortIdPath; + cohortNamePath: CohortNamePath; + cohortUrlPath?: CohortUrlPath; + memberArrayPath?: MemberArrayPath1; + addMemberArrayPath?: AddMemberArrayPath; + removeMemberArrayPath?: RemoveMemberArrayPath; + arrayInclusionMatcher?: ArrayInclusionMatcher; + memberArrayParser: MemberArrayParser; + [k: string]: unknown; +} +/** + * Describes a mapping of property name to a location in the member array JSON payload specified by a JSON pointer. All paths are relative to the member array path + */ +export interface MemberArrayParser { + memberIdPath: MemberIdPath; + booleanMembershipPath?: BooleanMembershipPath; + cohortNamePath?: CohortNamePath1; + cohortIdPath?: CohortIdPath1; + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index c62f0ca9..34b83880 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -688,7 +688,8 @@ "flagLink", "hideConfiguration", "externalConfigurationURL", - "externalConfigurationPages" + "externalConfigurationPages", + "syncedSegment" ] }, "properties": { @@ -4075,6 +4076,147 @@ "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://" } } + }, + "syncedSegment": { + "$id": "#/properties/capability/synced-segment", + "title": "syncedSegment", + "description": "This capability is used to manage the creation and synchronization of synced segments", + "type": "object", + "propertyNames": { + "enum": [ + "jsonBody", + "requestParser" + ] + }, + "required": [ + "requestParser" + ], + "properties": { + "jsonBody": { + "$id": "#/properties/capability/synced-segment/json-body", + "title": "Response body", + "description": "JSON string to be returned as a response", + "type": "string" + }, + "requestParser": { + "$id": "#/properties/capability/synced-segment/request-parser", + "title": "Request parser", + "description": "Describes a mapping of property name to a location in the JSON request payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": [ + "environmentIdPath", + "cohortIdPath", + "cohortNamePath", + "cohortUrlPath", + "memberArrayPath", + "addMemberArrayPath", + "removeMemberArrayPath", + "arrayInclusionMatcher", + "memberArrayParser" + ] + }, + "required": [ + "environmentIdPath", + "cohortIdPath", + "cohortNamePath", + "memberArrayParser" + ], + "properties": { + "environmentIdPath": { + "$id": "#/properties/capability/synced-segment/request-parser/environment-id-path", + "title": "Environment id path", + "type": "string", + "description": "JSON pointer to the LaunchDarkly environment id" + }, + "cohortIdPath": { + "$id": "#/properties/capability/synced-segment/request-parser/cohort-id-path", + "title": "Cohort id path", + "type": "string", + "description": "JSON pointer to the cohort id" + }, + "cohortNamePath": { + "$id": "#/properties/capability/synced-segment/request-parser/cohort-name-path", + "title": "Cohort name path", + "type": "string", + "description": "JSON pointer to the cohort name" + }, + "cohortUrlPath": { + "$id": "#/properties/capability/synced-segment/request-parser/cohort-url-path", + "title": "Cohort url path", + "type": "string", + "description": "JSON pointer to the cohort URL path" + }, + "memberArrayPath": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-path", + "title": "Member array path", + "type": "string", + "description": "JSON pointer to the array containing members to be added or removed from the segment" + }, + "addMemberArrayPath": { + "$id": "#/properties/capability/synced-segment/request-parser/add-member-array-path", + "title": "Add member array path", + "type": "string", + "description": "JSON pointer to the array containing members to be added to the segment. Required if removeMemberArrayPath is specified" + }, + "removeMemberArrayPath": { + "$id": "#/properties/capability/synced-segment/request-parser/remove-member-array-path", + "title": "Remove member array path", + "type": "string", + "description": "JSON pointer to the array containing members to be removed to the segment. Required if addMemberArrayPath is specified" + }, + "arrayInclusionMatcher": { + "$id": "#/properties/capability/synced-segment/request-parser/array-inclusion-matcher", + "title": "Array inclusion matcher", + "type": "string", + "description": "Regex indicating the action to be taken for the members in the segment. If it matches the value of the arrayInclusionFieldPath, the members of the incoming segment will be added otherwise they will be removed" + }, + "memberArrayParser": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser", + "title": "Member array parser", + "description": "Describes a mapping of property name to a location in the member array JSON payload specified by a JSON pointer. All paths are relative to the member array path", + "type": "object", + "propertyNames": { + "enum": [ + "memberIdPath", + "booleanMembershipPath", + "cohortNamePath", + "cohortIdPath" + ] + }, + "required": [ + "memberIdPath" + ], + "properties": { + "memberIdPath": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser/member-id-path", + "title": "Member id path", + "type": "string", + "description": "JSON pointer to the member id" + }, + "booleanMembershipPath": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser/boolean-membership-path", + "title": "Boolean membership path", + "type": "string", + "description": "JSON pointer to the property in member array payload indicating whether the member should be added or removed" + }, + "cohortNamePath": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser/cohort-name-path", + "title": "Cohort name path", + "type": "string", + "description": "JSON pointer to the cohort name. Overrides the cohort name for a single member" + }, + "cohortIdPath": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser/cohort-id-path", + "title": "Cohort id path", + "type": "string", + "description": "JSON pointer to the cohort id. Overrides the cohort id for a single member" + } + } + } + } + } + } } } }, diff --git a/schemas/base.json b/schemas/base.json index 9fe09131..56b83e1b 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -261,7 +261,8 @@ "flagLink", "hideConfiguration", "externalConfigurationURL", - "externalConfigurationPages" + "externalConfigurationPages", + "syncedSegment" ] }, "properties": { @@ -291,6 +292,9 @@ }, "externalConfigurationPages": { "$ref": "schemas/capabilities/externalConfiguration.json#/externalConfigurationPages" + }, + "syncedSegment": { + "$ref": "schemas/capabilities/syncedSegment.json#/syncedSegment" } } }, diff --git a/schemas/capabilities/syncedSegment.json b/schemas/capabilities/syncedSegment.json new file mode 100644 index 00000000..f8f0d4d2 --- /dev/null +++ b/schemas/capabilities/syncedSegment.json @@ -0,0 +1,137 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "syncedSegment": { + "$id": "#/properties/capability/synced-segment", + "title": "syncedSegment", + "description": "This capability is used to manage the creation and synchronization of synced segments", + "type": "object", + "propertyNames": { + "enum": ["jsonBody", "requestParser"] + }, + "required": ["requestParser"], + "properties": { + "jsonBody": { + "$id": "#/properties/capability/synced-segment/json-body", + "title": "Response body", + "description": "JSON string to be returned as a response", + "type": "string" + }, + "requestParser": { + "$id": "#/properties/capability/synced-segment/request-parser", + "title": "Request parser", + "description": "Describes a mapping of property name to a location in the JSON request payload specified by a JSON pointer", + "type": "object", + "propertyNames": { + "enum": [ + "environmentIdPath", + "cohortIdPath", + "cohortNamePath", + "cohortUrlPath", + "memberArrayPath", + "addMemberArrayPath", + "removeMemberArrayPath", + "arrayInclusionMatcher", + "memberArrayParser" + ] + }, + "required": [ + "environmentIdPath", + "cohortIdPath", + "cohortNamePath", + "memberArrayParser" + ], + "properties": { + "environmentIdPath": { + "$id": "#/properties/capability/synced-segment/request-parser/environment-id-path", + "title": "Environment id path", + "type": "string", + "description": "JSON pointer to the LaunchDarkly environment id" + }, + "cohortIdPath": { + "$id": "#/properties/capability/synced-segment/request-parser/cohort-id-path", + "title": "Cohort id path", + "type": "string", + "description": "JSON pointer to the cohort id" + }, + "cohortNamePath": { + "$id": "#/properties/capability/synced-segment/request-parser/cohort-name-path", + "title": "Cohort name path", + "type": "string", + "description": "JSON pointer to the cohort name" + }, + "cohortUrlPath": { + "$id": "#/properties/capability/synced-segment/request-parser/cohort-url-path", + "title": "Cohort url path", + "type": "string", + "description": "JSON pointer to the cohort URL path" + }, + "memberArrayPath": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-path", + "title": "Member array path", + "type": "string", + "description": "JSON pointer to the array containing members to be added or removed from the segment" + }, + "addMemberArrayPath": { + "$id": "#/properties/capability/synced-segment/request-parser/add-member-array-path", + "title": "Add member array path", + "type": "string", + "description": "JSON pointer to the array containing members to be added to the segment. Required if removeMemberArrayPath is specified" + }, + "removeMemberArrayPath": { + "$id": "#/properties/capability/synced-segment/request-parser/remove-member-array-path", + "title": "Remove member array path", + "type": "string", + "description": "JSON pointer to the array containing members to be removed to the segment. Required if addMemberArrayPath is specified" + }, + "arrayInclusionMatcher": { + "$id": "#/properties/capability/synced-segment/request-parser/array-inclusion-matcher", + "title": "Array inclusion matcher", + "type": "string", + "description": "Regex indicating the action to be taken for the members in the segment. If it matches the value of the arrayInclusionFieldPath, the members of the incoming segment will be added otherwise they will be removed" + }, + "memberArrayParser": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser", + "title": "Member array parser", + "description": "Describes a mapping of property name to a location in the member array JSON payload specified by a JSON pointer. All paths are relative to the member array path", + "type": "object", + "propertyNames": { + "enum": [ + "memberIdPath", + "booleanMembershipPath", + "cohortNamePath", + "cohortIdPath" + ] + }, + "required": ["memberIdPath"], + "properties": { + "memberIdPath": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser/member-id-path", + "title": "Member id path", + "type": "string", + "description": "JSON pointer to the member id" + }, + "booleanMembershipPath": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser/boolean-membership-path", + "title": "Boolean membership path", + "type": "string", + "description": "JSON pointer to the property in member array payload indicating whether the member should be added or removed" + }, + "cohortNamePath": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser/cohort-name-path", + "title": "Cohort name path", + "type": "string", + "description": "JSON pointer to the cohort name. Overrides the cohort name for a single member" + }, + "cohortIdPath": { + "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser/cohort-id-path", + "title": "Cohort id path", + "type": "string", + "description": "JSON pointer to the cohort id. Overrides the cohort id for a single member" + } + } + } + } + } + } + } +} From 50c02d4d19cc9a49c3dd6ffe699dae6f3120d09c Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Tue, 13 Jun 2023 13:40:29 -0500 Subject: [PATCH 687/936] Updated array inclusion prop for synced segment capability --- __tests__/validateSyncedSegmentCapability.js | 13 ++++--- manifest.schema.d.ts | 20 ++++++++--- manifest.schema.json | 38 ++++++++++++++++---- schemas/capabilities/syncedSegment.json | 32 +++++++++++++---- 4 files changed, 80 insertions(+), 23 deletions(-) diff --git a/__tests__/validateSyncedSegmentCapability.js b/__tests__/validateSyncedSegmentCapability.js index a6b32aad..f427c4ee 100644 --- a/__tests__/validateSyncedSegmentCapability.js +++ b/__tests__/validateSyncedSegmentCapability.js @@ -18,7 +18,10 @@ manifestsWithCapability.push([ cohortNamePath: '/batch[0]/cohortName', cohortUrlPath: '/batch[0]/cohortUrl', memberArrayPath: '/batch', - arrayInclusionMatcher: 'a', + arrayInclusion: { + path: '/action', + matcher: '^(members|add_members)$', + }, memberArrayParser: { memberIdPath: '/userId', booleanMembershipPath: '/value', @@ -52,17 +55,17 @@ describe('Validate Synced Segment Capability Dependencies', () => { } }); - test(`${manifest.name} syncedSegement capability: memberArrayPath should be specified when arrayInclusionMatcher is specified`, () => { + test(`${manifest.name} syncedSegement capability: memberArrayPath should be specified when arrayInclusion is specified`, () => { const rp = manifest.capabilities.syncedSegment?.requestParser; - if (!!rp?.arrayInclusionMatcher) { + if (!!rp?.arrayInclusion) { expect(rp.memberArrayPath).toBeDefined(); } }); - test(`${manifest.name} syncedSegement capability: arrayInclusionMatcher should not be specified when addMemberArrayPath or removeMemberArrayPath are specified`, () => { + test(`${manifest.name} syncedSegement capability: arrayInclusion should not be specified when addMemberArrayPath or removeMemberArrayPath are specified`, () => { const rp = manifest.capabilities.syncedSegment?.requestParser; if (!!rp?.addMemberArrayPath || !!rp.removeMemberArrayPath) { - expect(rp.arrayInclusionMatcher).toBeUndefined(); + expect(rp.arrayInclusion).toBeUndefined(); } }); diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 570e4c9b..78bb73cc 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -605,9 +605,13 @@ export type AddMemberArrayPath = string; */ export type RemoveMemberArrayPath = string; /** - * Regex indicating the action to be taken for the members in the segment. If it matches the value of the arrayInclusionFieldPath, the members of the incoming segment will be added otherwise they will be removed + * JSON pointer to the property that will be checked by the matcher property */ -export type ArrayInclusionMatcher = string; +export type Path = string; +/** + * Regex indicating the action to be taken for the members in the segment. If it matches the value of path property, the members of the incoming segment will be added otherwise they will be removed + */ +export type Matcher = string; /** * JSON pointer to the member id */ @@ -1015,7 +1019,7 @@ export interface ExternalConfigurationPages { * This capability is used to manage the creation and synchronization of synced segments */ export interface SyncedSegment { - jsonBody?: ResponseBody; + jsonResponseBody?: ResponseBody; requestParser: RequestParser; [k: string]: unknown; } @@ -1030,10 +1034,18 @@ export interface RequestParser { memberArrayPath?: MemberArrayPath1; addMemberArrayPath?: AddMemberArrayPath; removeMemberArrayPath?: RemoveMemberArrayPath; - arrayInclusionMatcher?: ArrayInclusionMatcher; + arrayInclusion?: ArrayInclusionMatcher; memberArrayParser: MemberArrayParser; [k: string]: unknown; } +/** + * Describes a mapping of property name to a location in the JSON request payload indicating the action to be taken for the members in the request payload + */ +export interface ArrayInclusionMatcher { + path: Path; + matcher: Matcher; + [k: string]: unknown; +} /** * Describes a mapping of property name to a location in the member array JSON payload specified by a JSON pointer. All paths are relative to the member array path */ diff --git a/manifest.schema.json b/manifest.schema.json index 34b83880..34a5d146 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -4084,7 +4084,7 @@ "type": "object", "propertyNames": { "enum": [ - "jsonBody", + "jsonResponseBody", "requestParser" ] }, @@ -4092,7 +4092,7 @@ "requestParser" ], "properties": { - "jsonBody": { + "jsonResponseBody": { "$id": "#/properties/capability/synced-segment/json-body", "title": "Response body", "description": "JSON string to be returned as a response", @@ -4112,7 +4112,7 @@ "memberArrayPath", "addMemberArrayPath", "removeMemberArrayPath", - "arrayInclusionMatcher", + "arrayInclusion", "memberArrayParser" ] }, @@ -4165,11 +4165,35 @@ "type": "string", "description": "JSON pointer to the array containing members to be removed to the segment. Required if addMemberArrayPath is specified" }, - "arrayInclusionMatcher": { - "$id": "#/properties/capability/synced-segment/request-parser/array-inclusion-matcher", + "arrayInclusion": { + "$id": "#/properties/capability/synced-segment/request-parser/array-inclusion", "title": "Array inclusion matcher", - "type": "string", - "description": "Regex indicating the action to be taken for the members in the segment. If it matches the value of the arrayInclusionFieldPath, the members of the incoming segment will be added otherwise they will be removed" + "description": "Describes a mapping of property name to a location in the JSON request payload indicating the action to be taken for the members in the request payload", + "type": "object", + "propertyNames": { + "enum": [ + "path", + "matcher" + ] + }, + "required": [ + "path", + "matcher" + ], + "properties": { + "path": { + "$id": "#/properties/capability/synced-segment/request-parser/array-inclusion/path", + "title": "Path", + "type": "string", + "description": "JSON pointer to the property that will be checked by the matcher property" + }, + "matcher": { + "$id": "#/properties/capability/synced-segment/request-parser/array-inclusion/matcher", + "title": "Matcher", + "type": "string", + "description": "Regex indicating the action to be taken for the members in the segment. If it matches the value of path property, the members of the incoming segment will be added otherwise they will be removed" + } + } }, "memberArrayParser": { "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser", diff --git a/schemas/capabilities/syncedSegment.json b/schemas/capabilities/syncedSegment.json index f8f0d4d2..a3a2b8d3 100644 --- a/schemas/capabilities/syncedSegment.json +++ b/schemas/capabilities/syncedSegment.json @@ -6,11 +6,11 @@ "description": "This capability is used to manage the creation and synchronization of synced segments", "type": "object", "propertyNames": { - "enum": ["jsonBody", "requestParser"] + "enum": ["jsonResponseBody", "requestParser"] }, "required": ["requestParser"], "properties": { - "jsonBody": { + "jsonResponseBody": { "$id": "#/properties/capability/synced-segment/json-body", "title": "Response body", "description": "JSON string to be returned as a response", @@ -30,7 +30,7 @@ "memberArrayPath", "addMemberArrayPath", "removeMemberArrayPath", - "arrayInclusionMatcher", + "arrayInclusion", "memberArrayParser" ] }, @@ -83,11 +83,29 @@ "type": "string", "description": "JSON pointer to the array containing members to be removed to the segment. Required if addMemberArrayPath is specified" }, - "arrayInclusionMatcher": { - "$id": "#/properties/capability/synced-segment/request-parser/array-inclusion-matcher", + "arrayInclusion": { + "$id": "#/properties/capability/synced-segment/request-parser/array-inclusion", "title": "Array inclusion matcher", - "type": "string", - "description": "Regex indicating the action to be taken for the members in the segment. If it matches the value of the arrayInclusionFieldPath, the members of the incoming segment will be added otherwise they will be removed" + "description": "Describes a mapping of property name to a location in the JSON request payload indicating the action to be taken for the members in the request payload", + "type": "object", + "propertyNames": { + "enum": ["path", "matcher"] + }, + "required": ["path", "matcher"], + "properties": { + "path": { + "$id": "#/properties/capability/synced-segment/request-parser/array-inclusion/path", + "title": "Path", + "type": "string", + "description": "JSON pointer to the property that will be checked by the matcher property" + }, + "matcher": { + "$id": "#/properties/capability/synced-segment/request-parser/array-inclusion/matcher", + "title": "Matcher", + "type": "string", + "description": "Regex indicating the action to be taken for the members in the segment. If it matches the value of path property, the members of the incoming segment will be added otherwise they will be removed" + } + } }, "memberArrayParser": { "$id": "#/properties/capability/synced-segment/request-parser/member-array-parser", From b95cb06d5d90f0f4433cc1a27f40211cfdb2cac6 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 21 Jun 2023 18:00:43 -0500 Subject: [PATCH 688/936] Added sync segment capability to amplitude --- integrations/amplitude/manifest.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/integrations/amplitude/manifest.json b/integrations/amplitude/manifest.json index 76967a00..734fb27e 100644 --- a/integrations/amplitude/manifest.json +++ b/integrations/amplitude/manifest.json @@ -15,5 +15,20 @@ "square": "assets/square.svg", "horizontal": "assets/horizontal.svg" }, - "otherCapabilities": ["external"] + "otherCapabilities": ["external"], + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/environmentId", + "cohortIdPath": "/batch/0/cohortId", + "cohortNamePath": "/batch/0/cohortName", + "cohortUrlPath": "/batch/0/cohortUrl", + "memberArrayPath": "/batch", + "memberArrayParser": { + "memberIdPath": "/userId", + "booleanMembershipPath": "/value" + } + } + } + } } From 472991833d207d6df60b10e49661ca58f535a56a Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 21 Jun 2023 21:58:15 -0500 Subject: [PATCH 689/936] Added validation server to integration for capability testing --- .prettierignore | 1 + nodemon.json | 6 + package-lock.json | 2523 +++++++++++++++++++++- package.json | 16 +- server/src/capabilities/syncedSegment.ts | 269 +++ server/src/index.ts | 55 + server/src/utils/errors.ts | 35 + server/src/utils/index.ts | 2 + server/src/utils/manifest.ts | 39 + tsconfig.json | 17 + 10 files changed, 2879 insertions(+), 84 deletions(-) create mode 100644 nodemon.json create mode 100644 server/src/capabilities/syncedSegment.ts create mode 100644 server/src/index.ts create mode 100644 server/src/utils/errors.ts create mode 100644 server/src/utils/index.ts create mode 100644 server/src/utils/manifest.ts create mode 100644 tsconfig.json diff --git a/.prettierignore b/.prettierignore index d4a73fe2..c1f44729 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,2 @@ manifest.schema.json +tsconfig.json diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 00000000..3d02a269 --- /dev/null +++ b/nodemon.json @@ -0,0 +1,6 @@ +{ + "watch": ["server"], + "ext": ".ts,.js", + "ignore": [], + "exec": "npx ts-node ./server/src/index.ts" +} diff --git a/package-lock.json b/package-lock.json index 2b3922ba..cc06686d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,20 +10,27 @@ "license": "ISC", "dependencies": { "dateformat": "^4.5.1", + "express": "^4.18.2", "url-parse": "^1.5.9" }, "devDependencies": { "@apidevtools/json-schema-ref-parser": "^8.0.0", + "@types/express": "^4.17.17", + "@types/node": "^20.3.1", "ajv": "^6.10.2", "handlebars": "^4.7.7", "jest": "^26.6.3", "jest-expect-message": "1.0.2", "jest-junit": "^13.0.0", "json-schema-to-typescript": "^10.0.0", - "jsonpointer": "^5.0.0", + "jsonpointer": "^5.0.1", "lodash": "^4.17.21", + "nodemon": "^2.0.22", "plop": "^3.1.1", - "prettier": "^2.0.1" + "prettier": "^2.0.1", + "rimraf": "^5.0.1", + "ts-node": "^10.9.1", + "typescript": "^5.1.3" } }, "node_modules/@apidevtools/json-schema-ref-parser": { @@ -521,6 +528,114 @@ "node": ">=0.1.95" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -602,6 +717,21 @@ "node": ">= 10.14.2" } }, + "node_modules/@jest/core/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@jest/environment": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", @@ -773,6 +903,31 @@ "node": ">= 10.14.2" } }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -814,6 +969,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", @@ -841,6 +1006,30 @@ "node": ">= 6" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.1.12", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", @@ -882,6 +1071,49 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/fined": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@types/fined/-/fined-1.1.3.tgz", @@ -957,6 +1189,12 @@ "@types/node": "*" } }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "node_modules/@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -964,9 +1202,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "14.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -981,6 +1219,38 @@ "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", "dev": true }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", @@ -1017,6 +1287,24 @@ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -1135,9 +1423,9 @@ "dev": true }, "node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -1147,6 +1435,12 @@ "node": ">= 8" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1192,6 +1486,11 @@ "node": ">=0.10.0" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "node_modules/array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", @@ -1394,6 +1693,15 @@ } ] }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/bl": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", @@ -1405,6 +1713,42 @@ "readable-stream": "^3.4.0" } }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1472,6 +1816,14 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -1492,6 +1844,18 @@ "node": ">=0.10.0" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -1600,6 +1964,33 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -1877,6 +2268,44 @@ "upper-case": "^2.0.2" } }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -1886,6 +2315,19 @@ "safe-buffer": "~5.1.1" } }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -1895,6 +2337,12 @@ "node": ">=0.10.0" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2082,7 +2530,22 @@ "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/delayed-stream": { @@ -2094,6 +2557,23 @@ "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -2112,6 +2592,15 @@ "node": ">=8" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", @@ -2164,6 +2653,17 @@ "tslib": "^2.0.3" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "node_modules/emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", @@ -2182,6 +2682,14 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -2244,6 +2752,11 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -2306,6 +2819,14 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -2520,6 +3041,79 @@ "node": ">= 10.14.2" } }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ext": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", @@ -2708,6 +3302,36 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2791,6 +3415,34 @@ "node": ">=0.10.0" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -2805,6 +3457,14 @@ "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -2817,6 +3477,14 @@ "node": ">=0.10.0" } }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2824,9 +3492,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.2.1.tgz", - "integrity": "sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, "optional": true, @@ -2840,8 +3508,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -2861,6 +3528,20 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -3061,7 +3742,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -3078,6 +3758,28 @@ "node": ">=8" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -3187,6 +3889,21 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -3227,7 +3944,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -3264,6 +3980,12 @@ "node": ">= 4" } }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, "node_modules/import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", @@ -3311,8 +4033,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -3483,6 +4204,14 @@ "node": ">= 0.10" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -3514,6 +4243,18 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -3880,6 +4621,24 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", @@ -4634,9 +5393,9 @@ } }, "node_modules/jsonpointer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", - "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4822,6 +5581,12 @@ "semver": "bin/semver.js" } }, + "node_modules/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 + }, "node_modules/make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -4864,6 +5629,14 @@ "node": ">=0.10.0" } }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/memoizee": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", @@ -4880,6 +5653,11 @@ "timers-ext": "^0.1.5" } }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4895,6 +5673,14 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -4908,11 +5694,21 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -4921,7 +5717,6 @@ "version": "2.1.34", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, "dependencies": { "mime-db": "1.51.0" }, @@ -4956,6 +5751,15 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "node_modules/minipass": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", + "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -5032,6 +5836,14 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -5095,39 +5907,112 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, - "optional": true, + "optional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-plop": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.31.0.tgz", + "integrity": "sha512-aKLPxiBoFTNUovvtK8j/Whc4PZREkYx6htw2HJPiU8wYquXmN8pkd9B3xlFo6AJ4ZlzFsQSf/NXR5xET8EqRYw==", + "dev": true, + "dependencies": { + "@types/inquirer": "^8.2.1", + "change-case": "^4.1.2", + "del": "^6.0.0", + "globby": "^13.1.1", + "handlebars": "^4.4.3", + "inquirer": "^8.2.2", + "isbinaryfile": "^4.0.8", + "lodash.get": "^4.4.2", + "lower-case": "^2.0.2", + "mkdirp": "^1.0.4", + "resolve": "^1.20.0", + "title-case": "^3.0.3", + "upper-case": "^2.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/node-plop": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.31.0.tgz", - "integrity": "sha512-aKLPxiBoFTNUovvtK8j/Whc4PZREkYx6htw2HJPiU8wYquXmN8pkd9B3xlFo6AJ4ZlzFsQSf/NXR5xET8EqRYw==", + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", "dev": true, "dependencies": { - "@types/inquirer": "^8.2.1", - "change-case": "^4.1.2", - "del": "^6.0.0", - "globby": "^13.1.1", - "handlebars": "^4.4.3", - "inquirer": "^8.2.2", - "isbinaryfile": "^4.0.8", - "lodash.get": "^4.4.2", - "lower-case": "^2.0.2", - "mkdirp": "^1.0.4", - "resolve": "^1.20.0", - "title-case": "^3.0.3", - "upper-case": "^2.0.2" + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "*" } }, "node_modules/normalize-package-data": { @@ -5263,6 +6148,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -5315,6 +6208,17 @@ "node": ">=0.10.0" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5587,6 +6491,14 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -5670,6 +6582,36 @@ "node": ">=0.10.0" } }, + "node_modules/path-scurry": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", + "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1", + "minipass": "^5.0.0 || ^6.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", + "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -5807,12 +6749,30 @@ "node": ">= 6" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -5832,6 +6792,20 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -5857,6 +6831,28 @@ } ] }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react-is": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", @@ -5927,6 +6923,18 @@ "node": ">= 6" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -6087,15 +7095,64 @@ } }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", + "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "glob": "^10.2.5" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.0.tgz", + "integrity": "sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2", + "path-scurry": "^1.7.0" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -6169,8 +7226,7 @@ "node_modules/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==" }, "node_modules/sane": { "version": "4.1.0", @@ -6478,6 +7534,47 @@ "semver": "bin/semver" } }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node_modules/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", @@ -6489,6 +7586,20 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -6531,6 +7642,11 @@ "node": ">=0.10.0" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6559,12 +7675,46 @@ "dev": true, "optional": true }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -6983,6 +8133,14 @@ "node": ">=0.10.0" } }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/stdin": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", @@ -7045,6 +8203,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7057,6 +8230,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -7287,6 +8473,26 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, "node_modules/tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", @@ -7313,6 +8519,70 @@ "node": ">=8" } }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", @@ -7358,6 +8628,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -7367,6 +8649,19 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/uglify-js": { "version": "3.13.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", @@ -7389,6 +8684,12 @@ "node": ">=0.10.0" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -7422,6 +8723,14 @@ "node": ">= 4.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -7528,6 +8837,14 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -7537,6 +8854,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/v8-to-istanbul": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", @@ -7579,6 +8902,14 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -7706,6 +9037,24 @@ "node": ">=8" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7809,6 +9158,15 @@ "engines": { "node": ">=6" } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } } }, "dependencies": { @@ -8237,6 +9595,80 @@ "minimist": "^1.2.0" } }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -8304,6 +9736,17 @@ "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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" + } + } } }, "@jest/environment": { @@ -8448,6 +9891,28 @@ "chalk": "^4.0.0" } }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -8480,6 +9945,13 @@ "fastq": "^1.6.0" } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@sinonjs/commons": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", @@ -8504,6 +9976,30 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "@types/babel__core": { "version": "7.1.12", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", @@ -8545,6 +10041,49 @@ "@babel/types": "^7.3.0" } }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "@types/fined": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@types/fined/-/fined-1.1.3.tgz", @@ -8620,6 +10159,12 @@ "@types/node": "*" } }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -8627,9 +10172,9 @@ "dev": true }, "@types/node": { - "version": "14.14.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz", - "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==", + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", "dev": true }, "@types/normalize-package-data": { @@ -8644,6 +10189,38 @@ "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", "dev": true }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, "@types/stack-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", @@ -8680,6 +10257,21 @@ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -8764,15 +10356,21 @@ "dev": true }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -8806,6 +10404,11 @@ "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", "dev": true }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", @@ -8951,6 +10554,12 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, "bl": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", @@ -8962,6 +10571,40 @@ "readable-stream": "^3.4.0" } }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -9012,6 +10655,11 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -9029,6 +10677,15 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -9119,6 +10776,22 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -9346,6 +11019,26 @@ "upper-case": "^2.0.2" } }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "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==" + } + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -9355,12 +11048,28 @@ "safe-buffer": "~5.1.1" } }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -9508,6 +11217,15 @@ "merge2": "^1.4.1", "slash": "^3.0.0" } + }, + "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" + } } } }, @@ -9517,6 +11235,16 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -9529,6 +11257,12 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, "diff-sequences": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", @@ -9571,6 +11305,17 @@ "tslib": "^2.0.3" } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", @@ -9583,6 +11328,11 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -9645,6 +11395,11 @@ "es6-symbol": "^3.1.1" } }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", @@ -9682,6 +11437,11 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", @@ -9857,6 +11617,64 @@ "jest-regex-util": "^26.0.0" } }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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==" + } + } + }, "ext": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", @@ -10018,6 +11836,35 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -10082,6 +11929,24 @@ "for-in": "^1.0.1" } }, + "foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true + } + } + }, "form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -10093,6 +11958,11 @@ "mime-types": "^2.1.12" } }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -10102,6 +11972,11 @@ "map-cache": "^0.2.2" } }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -10109,17 +11984,16 @@ "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==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "gensync": { "version": "1.0.0-beta.2", @@ -10133,6 +12007,17 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -10278,7 +12163,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -10289,6 +12173,16 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -10381,6 +12275,18 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, "http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -10412,7 +12318,6 @@ "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" } @@ -10429,6 +12334,12 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, "import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", @@ -10464,8 +12375,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -10585,6 +12495,11 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -10610,6 +12525,15 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -10876,6 +12800,16 @@ "istanbul-lib-report": "^3.0.0" } }, + "jackspeak": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", + "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jest": { "version": "26.6.3", "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", @@ -11472,9 +13406,9 @@ "dev": true }, "jsonpointer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.0.tgz", - "integrity": "sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true }, "kind-of": { @@ -11618,6 +13552,12 @@ } } }, + "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 + }, "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -11651,6 +13591,11 @@ "object-visit": "^1.0.0" } }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, "memoizee": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", @@ -11667,6 +13612,11 @@ "timers-ext": "^0.1.5" } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -11679,6 +13629,11 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -11689,17 +13644,20 @@ "picomatch": "^2.3.1" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "mime-db": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, "mime-types": { "version": "2.1.34", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, "requires": { "mime-db": "1.51.0" } @@ -11725,6 +13683,12 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "minipass": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", + "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "dev": true + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -11789,6 +13753,11 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -11877,6 +13846,59 @@ "upper-case": "^2.0.2" } }, + "nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -11984,6 +14006,11 @@ } } }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -12024,6 +14051,14 @@ "isobject": "^3.0.1" } }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -12211,6 +14246,11 @@ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, "pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", @@ -12276,6 +14316,29 @@ "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true }, + "path-scurry": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", + "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "dev": true, + "requires": { + "lru-cache": "^9.1.1", + "minipass": "^5.0.0 || ^6.0.2" + }, + "dependencies": { + "lru-cache": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", + "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", + "dev": true + } + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -12370,12 +14433,27 @@ "sisteransi": "^1.0.5" } }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -12392,6 +14470,14 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -12403,6 +14489,22 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "react-is": { "version": "17.0.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", @@ -12459,6 +14561,15 @@ "util-deprecate": "^1.0.1" } }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -12578,12 +14689,45 @@ "dev": true }, "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", + "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "^10.2.5" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.0.tgz", + "integrity": "sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2", + "path-scurry": "^1.7.0" + } + }, + "minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "rsvp": { @@ -12634,8 +14778,7 @@ "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==" }, "sane": { "version": "4.1.0", @@ -12881,6 +15024,48 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, "sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", @@ -12892,6 +15077,17 @@ "upper-case-first": "^2.0.2" } }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -12927,6 +15123,11 @@ } } }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -12949,12 +15150,39 @@ "dev": true, "optional": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -13308,6 +15536,11 @@ } } }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, "stdin": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", @@ -13352,6 +15585,17 @@ "strip-ansi": "^6.0.0" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -13361,6 +15605,15 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -13542,6 +15795,20 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, "tough-cookie": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", @@ -13562,6 +15829,41 @@ "punycode": "^2.1.1" } }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + } + } + }, "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", @@ -13595,6 +15897,15 @@ "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -13604,6 +15915,12 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "dev": true + }, "uglify-js": { "version": "3.13.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", @@ -13617,6 +15934,12 @@ "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "dev": true }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -13643,6 +15966,11 @@ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -13737,12 +16065,23 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "v8-to-istanbul": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", @@ -13778,6 +16117,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -13884,6 +16228,17 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -13967,6 +16322,12 @@ "camelcase": "^5.0.0", "decamelize": "^1.2.0" } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true } } } diff --git a/package.json b/package.json index a3f463fa..c8d10077 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,10 @@ "prettier:check": "prettier --list-different \"./**/*.{js,json}\"", "prettier:write": "prettier --write \"./**/*.{js,json}\"", "preview": "node preview.js", - "curl": "node preview.js --curl" + "curl": "node preview.js --curl", + "dev:server": "npx nodemon", + "build:server": "rimraf ./build && tsc", + "start:server": "npm run build:server && node dist/index.js" }, "repository": { "type": "git", @@ -24,19 +27,26 @@ "homepage": "https://github.com/launchdarkly/integration-framework#readme", "devDependencies": { "@apidevtools/json-schema-ref-parser": "^8.0.0", + "@types/express": "^4.17.17", + "@types/node": "^20.3.1", "ajv": "^6.10.2", "handlebars": "^4.7.7", "jest": "^26.6.3", "jest-expect-message": "1.0.2", "jest-junit": "^13.0.0", "json-schema-to-typescript": "^10.0.0", - "jsonpointer": "^5.0.0", + "jsonpointer": "^5.0.1", "lodash": "^4.17.21", + "nodemon": "^2.0.22", "plop": "^3.1.1", - "prettier": "^2.0.1" + "prettier": "^2.0.1", + "rimraf": "^5.0.1", + "ts-node": "^10.9.1", + "typescript": "^5.1.3" }, "dependencies": { "dateformat": "^4.5.1", + "express": "^4.18.2", "url-parse": "^1.5.9" } } diff --git a/server/src/capabilities/syncedSegment.ts b/server/src/capabilities/syncedSegment.ts new file mode 100644 index 00000000..47f37700 --- /dev/null +++ b/server/src/capabilities/syncedSegment.ts @@ -0,0 +1,269 @@ +import { + LaunchDarklyIntegrationsManifest, + RequestParser, +} from '../../../manifest.schema'; +import pointer from 'jsonpointer'; +import { AppError, HttpStatus } from '../utils'; + +enum MembershipStatus { + include = 'include', + exclude = 'exclude', + useBooleanFlag = 'useBooleanFlag', + useInclusionMatcher = 'userInclusionMatcher', +} + +export type SyncedSegmentBatch = { + userId: string; + cohortName: string; + cohortId: string; + cohortUrl?: string; + value: boolean; +}; + +export type SyncedSegment = { + environmentId: string; + batch: SyncedSegmentBatch[]; +}; + +export const handleSyncSegmentRequest = async ( + integrationKey: string, + manifest: LaunchDarklyIntegrationsManifest, + body: any +): Promise => { + const capability = manifest.capabilities?.syncedSegment; + if (!capability) { + throw new AppError( + HttpStatus.badRequest, + 'integration does not support synced segment capability' + ); + } + + if (!capability.requestParser) { + throw new AppError( + HttpStatus.badRequest, + 'integration is missing the required requestParser property' + ); + } + + const result: SyncedSegment = { + environmentId: '', + batch: [], + }; + + const parser = capability.requestParser; + + result.environmentId = getFieldValue( + body, + parser.environmentIdPath, + true + ); + + const cohortId = getFieldValue(body, parser.cohortIdPath, true); + const cohortName = getFieldValue(body, parser.cohortNamePath, true); + const cohortUrl = getFieldValue(body, parser.cohortUrlPath, false); + + const batchedRecords: SyncedSegmentBatch[] = []; + + if (parser.memberArrayPath && !parser.arrayInclusion) { + const memberArray = getFieldValue( + body, + parser.memberArrayPath, + true + ); + const memberArrayBatch = parseBatchArray({ + memberArray, + parser, + cohortId, + cohortName, + cohortUrl, + status: MembershipStatus.useBooleanFlag, + }); + batchedRecords.push(...memberArrayBatch); + } + + if (parser.arrayInclusion) { + const memberArray = getFieldValue( + body, + parser.memberArrayPath, + true + ); + const shouldInclude = getArrayMembershipStatus( + parser, + body, + MembershipStatus.useInclusionMatcher + ); + const memberArrayBatch = parseBatchArray({ + memberArray, + parser, + cohortId, + cohortName, + cohortUrl, + status: shouldInclude + ? MembershipStatus.include + : MembershipStatus.exclude, + }); + batchedRecords.push(...memberArrayBatch); + } + + if (parser.addMemberArrayPath) { + // this is only required if removeMemberArrayPath is specified + const memberArray = getFieldValue( + body, + parser.addMemberArrayPath, + !!parser.removeMemberArrayPath + ); + const memberArrayBatch = parseBatchArray({ + memberArray, + parser, + cohortId, + cohortName, + cohortUrl, + status: MembershipStatus.include, + }); + batchedRecords.push(...memberArrayBatch); + } + + if (parser.removeMemberArrayPath) { + // this is only required if addMemberArrayPath is specified + const memberArray = getFieldValue( + body, + parser.removeMemberArrayPath, + !!parser.addMemberArrayPath + ); + const memberArrayBatch = parseBatchArray({ + memberArray, + parser, + cohortId, + cohortName, + cohortUrl, + status: MembershipStatus.exclude, + }); + batchedRecords.push(...memberArrayBatch); + } + + result.batch = batchedRecords; + + return result; +}; + +type ParseArryParams = { + memberArray: any[]; + parser: RequestParser; + cohortId: string; + cohortName: string; + cohortUrl: string; + status: MembershipStatus; +}; +const parseBatchArray = (params: ParseArryParams): SyncedSegmentBatch[] => { + const batch: SyncedSegmentBatch[] = []; + + if (!params.parser.memberArrayParser) { + throw new AppError( + HttpStatus.badRequest, + `could not find memberArrayParser in the integration's synced segment manifest capability` + ); + } + + if (!Array.isArray(params.memberArray)) { + throw new AppError( + HttpStatus.badRequest, + `parsed value for member array is not an array` + ); + } + + const memberParser = params.parser.memberArrayParser; + for (const member of params.memberArray) { + const membershipStatus = getArrayMembershipStatus( + params.parser, + member, + params.status + ); + + const memberId = getFieldValue(member, memberParser.memberIdPath, true); + const cohortIdOverride = getFieldValue( + member, + memberParser.cohortIdPath, + false + ); + const cohortNameOverride = getFieldValue( + member, + memberParser.cohortNamePath, + false + ); + + const record: SyncedSegmentBatch = { + userId: memberId, + cohortId: cohortIdOverride ? cohortIdOverride : params.cohortId, + cohortName: cohortNameOverride ? cohortNameOverride : params.cohortName, + cohortUrl: params.cohortUrl, + value: membershipStatus, + }; + + batch.push(record); + } + + return batch; +}; + +const getArrayMembershipStatus = ( + rp: RequestParser, + payload: any, + status: MembershipStatus +): boolean => { + if (status === MembershipStatus.include) { + return true; + } + + if (status === MembershipStatus.exclude) { + return false; + } + + if (status === MembershipStatus.useBooleanFlag) { + return getFieldValue( + payload, + rp.memberArrayParser.booleanMembershipPath, + true + ); + } + + if (status === MembershipStatus.useInclusionMatcher) { + const inclusionValue = getFieldValue( + payload, + rp.arrayInclusion?.path, + true + ); + const inclusionPattern = getFieldValue( + payload, + rp.arrayInclusion?.matcher, + true + ); + + const regex = new RegExp(inclusionPattern); + return regex.test(inclusionValue); + } + + throw new AppError( + HttpStatus.internalError, + 'unknown segment membership status' + ); +}; + +const getFieldValue = ( + payload: any, + jsonPtr: string | undefined, + required?: boolean +): T => { + if (!jsonPtr) { + return undefined as T; + } + + const value = pointer.get(payload, jsonPtr); + if (!value && required) { + throw new AppError( + HttpStatus.badRequest, + `could not find path ${jsonPtr} in request payload` + ); + } + + return value; +}; diff --git a/server/src/index.ts b/server/src/index.ts new file mode 100644 index 00000000..caf97aa2 --- /dev/null +++ b/server/src/index.ts @@ -0,0 +1,55 @@ +import express from 'express'; +import { + AppError, + HttpStatus, + getManifest, + sendError as sendErrorResponse, +} from './utils'; +import { handleSyncSegmentRequest } from './capabilities/syncedSegment'; + +const app = express(); +const port = 3000; + +app.use(express.json()); + +app.post('/api/v2/segment-target/:integrationKey', async (req, res) => { + const key = req.params.integrationKey; + + const body = req.body; + if (!body) { + return sendErrorResponse( + res, + new AppError(HttpStatus.badRequest, `no json payload found in request`) + ); + } + + const integration = getManifest(key); + if (!integration) { + return sendErrorResponse( + res, + new AppError(HttpStatus.notFound, `integration with key ${key} not found`) + ); + } + + try { + const result = await handleSyncSegmentRequest(key, integration, body); + res.json(result); + } catch (err) { + return sendErrorResponse( + res, + new AppError( + (err as AppError).status ?? HttpStatus.internalError, + (err as AppError).message ?? `error occurred while processing request`, + err + ) + ); + } +}); + +app.all('*', (_, res) => { + return sendErrorResponse(res, new AppError(HttpStatus.notFound, `not found`)); +}); + +app.listen(port, () => { + console.log(`Validation app listening on port ${port}`); +}); diff --git a/server/src/utils/errors.ts b/server/src/utils/errors.ts new file mode 100644 index 00000000..f49c0a94 --- /dev/null +++ b/server/src/utils/errors.ts @@ -0,0 +1,35 @@ +import { Response } from 'express'; + +export enum HttpStatus { + internalError = 500, + badRequest = 400, + notFound = 404, +} + +export class AppError extends Error { + status: HttpStatus = 400; + message: string = ''; + + constructor(status: HttpStatus, message: string, err?: Error | unknown) { + super(message); + this.status = status; + this.message = message; + + if (err) { + console.log(err); + } + } +} + +export const sendError = (res: Response, err: AppError | Error) => { + if (err instanceof AppError) { + return res + .status(err.status) + .json({ status: err.status, message: err.message }); + } + + return res.status(HttpStatus.internalError).json({ + status: HttpStatus.internalError, + message: 'error occurred while processing request', + }); +}; diff --git a/server/src/utils/index.ts b/server/src/utils/index.ts new file mode 100644 index 00000000..edc18068 --- /dev/null +++ b/server/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './manifest'; +export * from './errors'; diff --git a/server/src/utils/manifest.ts b/server/src/utils/manifest.ts new file mode 100644 index 00000000..131cef5b --- /dev/null +++ b/server/src/utils/manifest.ts @@ -0,0 +1,39 @@ +import { readdirSync } from 'fs'; +import { LaunchDarklyIntegrationsManifest } from '../../../manifest.schema'; + +type ManifestDirectory = [string, LaunchDarklyIntegrationsManifest]; + +const getDirectories = (source: string) => + readdirSync(source, { withFileTypes: true }) + .filter(dir => dir.isDirectory()) + .map(dir => dir.name); + +export const getManifests = (): ManifestDirectory[] => { + const manifests: ManifestDirectory[] = []; + + const integrationDirs = getDirectories('./integrations'); + integrationDirs.forEach(dir => { + const manifest = require(`../../../integrations/${dir}/manifest.json`); + manifests.push([dir, manifest]); + }); + + return manifests; +}; + +export const getManifest = ( + integrationKey: string +): LaunchDarklyIntegrationsManifest | undefined => { + const manifests = getManifests(); + + const manifestAndDir = manifests.find(([key, mfst]) => { + return (key as string)?.toLowerCase() == integrationKey?.toLowerCase(); + }); + + if (!manifestAndDir) { + return undefined; + } + + const [_, manifest] = manifestAndDir; + + return manifest; +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..4550a337 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es2016", + "lib": ["es6"], + "module": "commonjs", + "outDir": "dist", + "rootDir": ".", + "resolveJsonModule": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "noImplicitAny": true, + }, + "include": ["server"], + "exclude": ["dist", "node_modules"] +} From 0c763f6169729e6dab06680137ae19420552d8a1 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 22 Jun 2023 09:59:11 -0400 Subject: [PATCH 690/936] add ctrlstack integration --- integrations/ctrlstack/assets/cs-icon.svg | 15 ++++++++++++ .../assets/orange-on-white-aligned.svg | 24 +++++++++++++++++++ integrations/ctrlstack/manifest.json | 21 ++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 integrations/ctrlstack/assets/cs-icon.svg create mode 100644 integrations/ctrlstack/assets/orange-on-white-aligned.svg create mode 100644 integrations/ctrlstack/manifest.json diff --git a/integrations/ctrlstack/assets/cs-icon.svg b/integrations/ctrlstack/assets/cs-icon.svg new file mode 100644 index 00000000..e20862d3 --- /dev/null +++ b/integrations/ctrlstack/assets/cs-icon.svg @@ -0,0 +1,15 @@ + + + + + + diff --git a/integrations/ctrlstack/assets/orange-on-white-aligned.svg b/integrations/ctrlstack/assets/orange-on-white-aligned.svg new file mode 100644 index 00000000..24fbbfff --- /dev/null +++ b/integrations/ctrlstack/assets/orange-on-white-aligned.svg @@ -0,0 +1,24 @@ + + + + + + +ctrlstack + diff --git a/integrations/ctrlstack/manifest.json b/integrations/ctrlstack/manifest.json new file mode 100644 index 00000000..2c7fe4cb --- /dev/null +++ b/integrations/ctrlstack/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "CtrlStack", + "version": "1.0.0", + "overview": "Add LaunchDarkly feature flag events to CtrlStack as change events on a timeline.", + "description": "To set this up, attach LaunchDarkly's API access token, and the project and environment IDs in CtrlStack integration settings.", + "details": "CtrlStack is a change intelligence platform for better observability. With its ability to observe system changes and data relationships across the stack, CtrlStack provides DevOps teams contextual understanding of system issues for faster incident investigation.

Add LaunchDarkly feature flag events to CtrlStack to know when an alert or change in data behavior is directly or indirectly caused by toggling of a feature flag.", + "author": "CtrlStack", + "supportEmail": "support@ctrlstack.com", + "links": { + "site": "https://ctrlstack.com", + "supportWebsite": "https://www.ctrlstack.com/contact/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/ctrlstack", + "privacyPolicy": "https://www.ctrlstack.com/terms-and-policy/" + }, + "categories": ["monitoring", "developer-tools"], + "icons": { + "horizontal": "assets/orange-on-white-aligned.svg", + "square": "assets/cs-icon.svg" + }, + "otherCapabilities": ["external"] +} From 281016a32b9ac2cd14abe1900157452a2bd4231b Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 23 Jun 2023 11:08:57 -0500 Subject: [PATCH 691/936] Added doc and code for parsing and building response body --- README.md | 4 + package.json | 4 +- server/README.md | 77 ++++++++++++++++ server/src/capabilities/syncedSegment.ts | 108 +++++++++++++++++++++++ server/src/index.ts | 6 +- server/src/utils/manifest.ts | 19 +++- 6 files changed, 211 insertions(+), 7 deletions(-) create mode 100644 server/README.md diff --git a/README.md b/README.md index c560dfe6..2760aebe 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,7 @@ If you want to reach out in private, email [integrations@launchdarkly.com](mailt We encourage pull requests and other contributions from the community. The LaunchDarkly integrations team responds to all new pull requests within two business days. Before you submit pull requests, make sure that all temporary or unintended code is removed. Don't worry about adding reviewers to the pull request. The LaunchDarkly integrations team will add themselves. + +## Validating your integration (beta) + +Validate your integrations using our built-in express server to verify your integration configurations. Visit the validation server's [docs](./server/README.md) to learn more. diff --git a/package.json b/package.json index c8d10077..4add8217 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "preview": "node preview.js", "curl": "node preview.js --curl", "dev:server": "npx nodemon", - "build:server": "rimraf ./build && tsc", - "start:server": "npm run build:server && node dist/index.js" + "build:server": "rimraf ./dist && tsc", + "start:server": "npm run build:server && node dist/server/src/index.js" }, "repository": { "type": "git", diff --git a/server/README.md b/server/README.md new file mode 100644 index 00000000..bd13db84 --- /dev/null +++ b/server/README.md @@ -0,0 +1,77 @@ +# LaunchDarkly Integration Validation Server (beta) + +The LaunchDarkly Integration Validation Server is a tool that allows users to test their integration capabilities with LaunchDarkly using an Express server. This server provides an environment where developers can validate their integrations with LaunchDarkly's feature flag management platform. + +## Getting Started + +To use the LaunchDarkly Integration Validation Server, follow the steps below: + +### Prerequisites + +- Node.js (version 16 or above) +- npm (Node Package Manager) + +### Installation + +1. Clone the repository to your local machine: + +```shell +git clone https://github.com/launchdarkly/integration-framework.git +``` + +2. Install the required dependencies: + +```shell +npm install +``` + +### Starting the Server + +To start the server, run the following command: + +```shell +npm run start +``` + +The server will start running and will be listening on port 3000 by default. + +## Usage + +Once the server is running, you can make HTTP requests to the server endpoints to test your integration. The server provides several routes that simulate LaunchDarkly's API behavior. No authentication token is required to make requests to the endpoints. + +### Endpoints + +The following endpoints are available: + +- POST /api/v2/segment-target/:integrationKey: Simulates processing a segment data from a Customer Data Provider (CDP). + +### Endpoints +The LaunchDarkly Integration Validation Server exposes the following endpoints: + +| Endpoint | Method | Description | +|--------------------|--------|-----------------------------------------------| +| `/api/v2/segment-target/:integrationKey` | POST | Simulates processing a synced segment data from a Customer Data Provider (CDP). | + +### Example Usage + +To validate segment from a Customer Data Platform (CDP) will be successfully parsed and processed, you can make a curl request as shown below + +```shell +curl --location 'http://localhost:3000/api/v2/segment-target/amplitude' \ +--header 'Content-Type: application/json' \ +--data '{ + "environmentId": "abcd123", + "batch": [ + { + "userId": "user-1234", + "cohortName": "Amplitude Segment 1235", + "cohortId": "segment-12345", + "cohortUrl": "https://example-cdp.com", + "value": true + } + ] +}' +``` + +## Contributing +Contributions are welcome! If you find any issues or have suggestions for improvements, please open an issue or submit a pull request on the project's GitHub repository. diff --git a/server/src/capabilities/syncedSegment.ts b/server/src/capabilities/syncedSegment.ts index 47f37700..b2c58008 100644 --- a/server/src/capabilities/syncedSegment.ts +++ b/server/src/capabilities/syncedSegment.ts @@ -4,6 +4,8 @@ import { } from '../../../manifest.schema'; import pointer from 'jsonpointer'; import { AppError, HttpStatus } from '../utils'; +import { Response } from 'express'; +import HandleBars from 'handlebars'; enum MembershipStatus { include = 'include', @@ -25,10 +27,109 @@ export type SyncedSegment = { batch: SyncedSegmentBatch[]; }; +export type SyncedSegmentResponseContext = { + requestBody: string; + statusCode: number; + errorMessage: string; + projectKey: string; + environmentKey: string; + segmentKey: string; + segmentUrl: string; +}; + +/** + * Handles parsing a synced segment request for the specified integration key + * + * @param res Express.Response + * @param integrationKey string + * @param manifest LaunchDarklyIntegrationsManifest + * @param body Object + */ export const handleSyncSegmentRequest = async ( + res: Response, integrationKey: string, manifest: LaunchDarklyIntegrationsManifest, body: any +) => { + try { + const parsedSegment = await parseSyncSegmentRequest(manifest, body); + + const parsedSegKey = `${integrationKey}-${parsedSegment.batch[0]?.cohortId}`; + const respContext = createResponseContext( + body, + 200, + parsedSegment.environmentId, + parsedSegKey + ); + + const jsonRes = parseJsonResponseBody(respContext, manifest); + res.status(respContext.statusCode).json(jsonRes); + } catch (err) { + const respContext = createResponseContext( + body, + (err as AppError).status || 500, + '', + '' + ); + const jsonRes = parseJsonResponseBody(respContext, manifest); + res.status(respContext.statusCode).json(jsonRes); + } +}; + +/** + * Create response context to be used by handlebar to generate the response body defined in the integration manifest + * @param body + * @param statusCode + * @param envKey + * @param segKey + * @param error + * @returns + */ +const createResponseContext = ( + body: any, + statusCode: number, + envKey: string, + segKey: string, + error?: string +) => ({ + requestBody: body, + statusCode, + errorMessage: error || '', + projectKey: 'default', + environmentKey: envKey, + segmentKey: segKey, + segmentUrl: `https://app.launchdarkly.com/default/production/segments/${segKey}/targeting`, +}); + +/** + * Parse the response body defined in the manifest + * @param ctx + * @param manifest + * @returns + */ +const parseJsonResponseBody = ( + ctx: SyncedSegmentResponseContext, + manifest: LaunchDarklyIntegrationsManifest +) => { + const responseTemplate = + manifest.capabilities?.syncedSegment?.jsonResponseBody; + if (!responseTemplate) { + return undefined; + } + + const template = HandleBars.compile(responseTemplate); + return template(ctx); +}; + +/** + * Parse the request path definitions from the manifest + * @param manifest + * @param body + * @returns + */ +const parseSyncSegmentRequest = async ( + manifest: LaunchDarklyIntegrationsManifest, + body: any ): Promise => { const capability = manifest.capabilities?.syncedSegment; if (!capability) { @@ -248,6 +349,13 @@ const getArrayMembershipStatus = ( ); }; +/** + * Returns the value of the json pointer from the payload + * @param payload + * @param jsonPtr + * @param required + * @returns + */ const getFieldValue = ( payload: any, jsonPtr: string | undefined, diff --git a/server/src/index.ts b/server/src/index.ts index caf97aa2..ec853054 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -32,15 +32,15 @@ app.post('/api/v2/segment-target/:integrationKey', async (req, res) => { } try { - const result = await handleSyncSegmentRequest(key, integration, body); - res.json(result); + await handleSyncSegmentRequest(res, key, integration, body); } catch (err) { + const isApiError = !!(err as AppError).status; return sendErrorResponse( res, new AppError( (err as AppError).status ?? HttpStatus.internalError, (err as AppError).message ?? `error occurred while processing request`, - err + isApiError ? undefined : err ) ); } diff --git a/server/src/utils/manifest.ts b/server/src/utils/manifest.ts index 131cef5b..2efcc7b0 100644 --- a/server/src/utils/manifest.ts +++ b/server/src/utils/manifest.ts @@ -1,4 +1,5 @@ -import { readdirSync } from 'fs'; +import { readdirSync, readFileSync } from 'fs'; +import path from 'path'; import { LaunchDarklyIntegrationsManifest } from '../../../manifest.schema'; type ManifestDirectory = [string, LaunchDarklyIntegrationsManifest]; @@ -8,12 +9,26 @@ const getDirectories = (source: string) => .filter(dir => dir.isDirectory()) .map(dir => dir.name); +export const readJson = (path: string) => { + try { + const data = readFileSync(path, 'utf8'); + return JSON.parse(data); + } catch (err) { + throw new Error( + `error occurred while reading json file at path ${path}: ${ + (err as Error).message + }` + ); + } +}; + export const getManifests = (): ManifestDirectory[] => { const manifests: ManifestDirectory[] = []; const integrationDirs = getDirectories('./integrations'); integrationDirs.forEach(dir => { - const manifest = require(`../../../integrations/${dir}/manifest.json`); + const manifestPath = path.resolve(`./integrations/${dir}/manifest.json`); + const manifest = readJson(manifestPath); manifests.push([dir, manifest]); }); From 745502ccbfd8340b6ec7441bf18e8ee3357a3b63 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 23 Jun 2023 11:15:54 -0500 Subject: [PATCH 692/936] Updated docs --- server/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/README.md b/server/README.md index bd13db84..b1839c39 100644 --- a/server/README.md +++ b/server/README.md @@ -30,7 +30,7 @@ npm install To start the server, run the following command: ```shell -npm run start +npm run start:server ``` The server will start running and will be listening on port 3000 by default. From 7485f9be43af4b4c40cc2ca71fe789fc77f57d9e Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 23 Jun 2023 11:25:00 -0500 Subject: [PATCH 693/936] Updated documentation text --- server/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/README.md b/server/README.md index b1839c39..f7ea200e 100644 --- a/server/README.md +++ b/server/README.md @@ -1,6 +1,6 @@ # LaunchDarkly Integration Validation Server (beta) -The LaunchDarkly Integration Validation Server is a tool that allows users to test their integration capabilities with LaunchDarkly using an Express server. This server provides an environment where developers can validate their integrations with LaunchDarkly's feature flag management platform. +The LaunchDarkly Integration Validation Server is a tool that allows developers to test their integrations with LaunchDarkly using an Express server. This server provides an environment where developers can validate their integrations with LaunchDarkly's feature flag management platform. ## Getting Started From 30043fcc4dc4b85328800c96512f4d3e4e056b48 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 23 Jun 2023 11:45:26 -0500 Subject: [PATCH 694/936] Removed duplicate endpoint in the docs --- server/README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/server/README.md b/server/README.md index f7ea200e..17be8667 100644 --- a/server/README.md +++ b/server/README.md @@ -39,12 +39,6 @@ The server will start running and will be listening on port 3000 by default. Once the server is running, you can make HTTP requests to the server endpoints to test your integration. The server provides several routes that simulate LaunchDarkly's API behavior. No authentication token is required to make requests to the endpoints. -### Endpoints - -The following endpoints are available: - -- POST /api/v2/segment-target/:integrationKey: Simulates processing a segment data from a Customer Data Provider (CDP). - ### Endpoints The LaunchDarkly Integration Validation Server exposes the following endpoints: From 759f1f1d7ad58c80334063415b64b6829f908a77 Mon Sep 17 00:00:00 2001 From: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Date: Fri, 23 Jun 2023 11:52:41 -0500 Subject: [PATCH 695/936] Apply suggestions from code review Co-authored-by: Molly --- server/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/README.md b/server/README.md index 17be8667..00fc8fd1 100644 --- a/server/README.md +++ b/server/README.md @@ -2,7 +2,7 @@ The LaunchDarkly Integration Validation Server is a tool that allows developers to test their integrations with LaunchDarkly using an Express server. This server provides an environment where developers can validate their integrations with LaunchDarkly's feature flag management platform. -## Getting Started +## Getting started To use the LaunchDarkly Integration Validation Server, follow the steps below: @@ -25,7 +25,7 @@ git clone https://github.com/launchdarkly/integration-framework.git npm install ``` -### Starting the Server +### Starting the server To start the server, run the following command: @@ -33,11 +33,11 @@ To start the server, run the following command: npm run start:server ``` -The server will start running and will be listening on port 3000 by default. +The server starts running and listens on port 3000 by default. ## Usage -Once the server is running, you can make HTTP requests to the server endpoints to test your integration. The server provides several routes that simulate LaunchDarkly's API behavior. No authentication token is required to make requests to the endpoints. +After the server is running, you can make HTTP requests to the server endpoints to test your integration. The server provides several routes that simulate LaunchDarkly's API behavior. No authentication token is required to make requests to the endpoints. ### Endpoints The LaunchDarkly Integration Validation Server exposes the following endpoints: @@ -46,19 +46,19 @@ The LaunchDarkly Integration Validation Server exposes the following endpoints: |--------------------|--------|-----------------------------------------------| | `/api/v2/segment-target/:integrationKey` | POST | Simulates processing a synced segment data from a Customer Data Provider (CDP). | -### Example Usage +### Example usage -To validate segment from a Customer Data Platform (CDP) will be successfully parsed and processed, you can make a curl request as shown below +To validate that a segment from a Customer Data Platform (CDP) will be successfully parsed and processed, you can make the following curl request: ```shell -curl --location 'http://localhost:3000/api/v2/segment-target/amplitude' \ +curl --location 'http://localhost:3000/api/v2/segment-target/example-integration-key' \ --header 'Content-Type: application/json' \ --data '{ "environmentId": "abcd123", "batch": [ { "userId": "user-1234", - "cohortName": "Amplitude Segment 1235", + "cohortName": "Example Segment 1234", "cohortId": "segment-12345", "cohortUrl": "https://example-cdp.com", "value": true From 9d79a60fba11b83eb4097eeda353f4524377abec Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 23 Jun 2023 11:54:30 -0500 Subject: [PATCH 696/936] Updated example request based on PR feedback --- server/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/README.md b/server/README.md index 00fc8fd1..56114b3b 100644 --- a/server/README.md +++ b/server/README.md @@ -57,7 +57,7 @@ curl --location 'http://localhost:3000/api/v2/segment-target/example-integration "environmentId": "abcd123", "batch": [ { - "userId": "user-1234", + "userId": "example-cdp-user-1234", "cohortName": "Example Segment 1234", "cohortId": "segment-12345", "cohortUrl": "https://example-cdp.com", From 660a7909d67ccf0a3da555ce78fd01124bf3d06c Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 26 Jun 2023 14:00:05 -0500 Subject: [PATCH 697/936] Logged request parser response --- server/src/capabilities/syncedSegment.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/capabilities/syncedSegment.ts b/server/src/capabilities/syncedSegment.ts index b2c58008..f7223169 100644 --- a/server/src/capabilities/syncedSegment.ts +++ b/server/src/capabilities/syncedSegment.ts @@ -62,6 +62,11 @@ export const handleSyncSegmentRequest = async ( parsedSegKey ); + console.log(`\nNew Segment Key: ${parsedSegKey}`); + console.log( + `Request Parser Result: ${JSON.stringify(parsedSegment, null, 2)}` + ); + const jsonRes = parseJsonResponseBody(respContext, manifest); res.status(respContext.statusCode).json(jsonRes); } catch (err) { From da1482285dfa51b073311bb9f3df7f0348965050 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 28 Jun 2023 15:29:23 -0500 Subject: [PATCH 698/936] Added dummy synced segments integration for mixpanel and heap showing example usage of the sync segment capability --- .../assets/horizontal.svg | 45 +++++++++++++++++++ .../assets/square.svg | 3 ++ .../example-synced-segment-heap/manifest.json | 33 ++++++++++++++ .../assets/horizontal.svg | 45 +++++++++++++++++++ .../assets/square.svg | 3 ++ .../manifest.json | 37 +++++++++++++++ server/src/capabilities/syncedSegment.ts | 27 ++++++----- server/src/utils/index.ts | 1 + server/src/utils/logger.ts | 5 +++ tsconfig.json | 1 + 10 files changed, 188 insertions(+), 12 deletions(-) create mode 100644 integrations/example-synced-segment-heap/assets/horizontal.svg create mode 100644 integrations/example-synced-segment-heap/assets/square.svg create mode 100644 integrations/example-synced-segment-heap/manifest.json create mode 100644 integrations/example-synced-segment-mixpanel/assets/horizontal.svg create mode 100644 integrations/example-synced-segment-mixpanel/assets/square.svg create mode 100644 integrations/example-synced-segment-mixpanel/manifest.json create mode 100644 server/src/utils/logger.ts diff --git a/integrations/example-synced-segment-heap/assets/horizontal.svg b/integrations/example-synced-segment-heap/assets/horizontal.svg new file mode 100644 index 00000000..699ed9ef --- /dev/null +++ b/integrations/example-synced-segment-heap/assets/horizontal.svg @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/integrations/example-synced-segment-heap/assets/square.svg b/integrations/example-synced-segment-heap/assets/square.svg new file mode 100644 index 00000000..a442b7d5 --- /dev/null +++ b/integrations/example-synced-segment-heap/assets/square.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/example-synced-segment-heap/manifest.json b/integrations/example-synced-segment-heap/manifest.json new file mode 100644 index 00000000..1e2bb102 --- /dev/null +++ b/integrations/example-synced-segment-heap/manifest.json @@ -0,0 +1,33 @@ +{ + "name": "Example Synced Segment Heap", + "version": "1.0.0", + "overview": "Example synced segment for Heap.", + "description": "Example synced segment for Heap Analytics' customer data platform", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.example.com", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/contexts/synced-segments", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["synced-segments"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "otherCapabilities": ["external"], + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/customer_config/fields/0/value/id", + "cohortIdPath": "/data/segment/id", + "cohortNamePath": "/data/segment/name", + "addMemberArrayPath": "/data/add", + "removeMemberArrayPath": "/data/remove", + "memberArrayParser": { + "memberIdPath": "/id" + } + } + } + } +} diff --git a/integrations/example-synced-segment-mixpanel/assets/horizontal.svg b/integrations/example-synced-segment-mixpanel/assets/horizontal.svg new file mode 100644 index 00000000..699ed9ef --- /dev/null +++ b/integrations/example-synced-segment-mixpanel/assets/horizontal.svg @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/integrations/example-synced-segment-mixpanel/assets/square.svg b/integrations/example-synced-segment-mixpanel/assets/square.svg new file mode 100644 index 00000000..a442b7d5 --- /dev/null +++ b/integrations/example-synced-segment-mixpanel/assets/square.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/example-synced-segment-mixpanel/manifest.json b/integrations/example-synced-segment-mixpanel/manifest.json new file mode 100644 index 00000000..d76ab1d3 --- /dev/null +++ b/integrations/example-synced-segment-mixpanel/manifest.json @@ -0,0 +1,37 @@ +{ + "name": "Example Synced Segment Mixpanel", + "version": "1.0.0", + "overview": "Example synced segment for Mixpanel.", + "description": "Example synced segment for Mixpanel customer data platform", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.example.com", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/contexts/synced-segments", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["synced-segments"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "otherCapabilities": ["external"], + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/parameters/mixpanel_project_id", + "cohortIdPath": "/parameters/mixpanel_cohort_id", + "cohortNamePath": "/parameters/mixpanel_cohort_name", + "arrayInclusion": { + "path": "/action", + "matcher": "^(members|add_members)$" + }, + "memberArrayPath": "/parameters/members", + "memberArrayParser": { + "memberIdPath": "/mixpanel_distinct_id" + } + }, + "jsonResponseBody": "{ \"action\": \"{{requestBody.action}}\", {{#if errorMessage}}\"status\":\"failure\", \"error\": {\"message\": \"{{errorMessage}}\", \"code\": {{statusCode}} }{{else}}\"status\": \"success\"{{/if}} }" + } + } +} diff --git a/server/src/capabilities/syncedSegment.ts b/server/src/capabilities/syncedSegment.ts index f7223169..d38e4553 100644 --- a/server/src/capabilities/syncedSegment.ts +++ b/server/src/capabilities/syncedSegment.ts @@ -3,10 +3,12 @@ import { RequestParser, } from '../../../manifest.schema'; import pointer from 'jsonpointer'; -import { AppError, HttpStatus } from '../utils'; +import { AppError, HttpStatus, createLogger } from '../utils'; import { Response } from 'express'; import HandleBars from 'handlebars'; +const logger = createLogger('synced-segment'); + enum MembershipStatus { include = 'include', exclude = 'exclude', @@ -62,19 +64,24 @@ export const handleSyncSegmentRequest = async ( parsedSegKey ); - console.log(`\nNew Segment Key: ${parsedSegKey}`); - console.log( + logger.log(`\nNew Segment Key: ${parsedSegKey}`); + logger.log( `Request Parser Result: ${JSON.stringify(parsedSegment, null, 2)}` ); const jsonRes = parseJsonResponseBody(respContext, manifest); res.status(respContext.statusCode).json(jsonRes); } catch (err) { + if (!(err instanceof AppError)) { + logger.log(err); + } + const respContext = createResponseContext( body, (err as AppError).status || 500, '', - '' + '', + (err as AppError).message ); const jsonRes = parseJsonResponseBody(respContext, manifest); res.status(respContext.statusCode).json(jsonRes); @@ -123,7 +130,7 @@ const parseJsonResponseBody = ( } const template = HandleBars.compile(responseTemplate); - return template(ctx); + return JSON.parse(template(ctx)); }; /** @@ -338,13 +345,7 @@ const getArrayMembershipStatus = ( rp.arrayInclusion?.path, true ); - const inclusionPattern = getFieldValue( - payload, - rp.arrayInclusion?.matcher, - true - ); - - const regex = new RegExp(inclusionPattern); + const regex = new RegExp(rp.arrayInclusion?.matcher || ''); return regex.test(inclusionValue); } @@ -370,6 +371,8 @@ const getFieldValue = ( return undefined as T; } + logger.log('processing ptr: ', jsonPtr); + const value = pointer.get(payload, jsonPtr); if (!value && required) { throw new AppError( diff --git a/server/src/utils/index.ts b/server/src/utils/index.ts index edc18068..69c1442e 100644 --- a/server/src/utils/index.ts +++ b/server/src/utils/index.ts @@ -1,2 +1,3 @@ export * from './manifest'; export * from './errors'; +export * from './logger'; diff --git a/server/src/utils/logger.ts b/server/src/utils/logger.ts new file mode 100644 index 00000000..d3e64310 --- /dev/null +++ b/server/src/utils/logger.ts @@ -0,0 +1,5 @@ +export const createLogger = (prefix: string) => { + return { + log: (...args: any) => console.log(`[${prefix}]: `, ...args), + }; +}; diff --git a/tsconfig.json b/tsconfig.json index 4550a337..99e836f9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,6 +11,7 @@ "strict": true, "skipLibCheck": true, "noImplicitAny": true, + "sourceMap": true }, "include": ["server"], "exclude": ["dist", "node_modules"] From 5075759f4fec727bcc9e7477576cf8a5cbdf2672 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 28 Jun 2023 15:40:06 -0500 Subject: [PATCH 699/936] Changed the logos of example integrations to be LD logo --- .../assets/horizontal.svg | 46 +------------------ .../assets/square.svg | 4 +- .../assets/horizontal.svg | 46 +------------------ .../assets/square.svg | 4 +- 4 files changed, 4 insertions(+), 96 deletions(-) diff --git a/integrations/example-synced-segment-heap/assets/horizontal.svg b/integrations/example-synced-segment-heap/assets/horizontal.svg index 699ed9ef..b10f95f8 100644 --- a/integrations/example-synced-segment-heap/assets/horizontal.svg +++ b/integrations/example-synced-segment-heap/assets/horizontal.svg @@ -1,45 +1 @@ - - - - - - - - + diff --git a/integrations/example-synced-segment-heap/assets/square.svg b/integrations/example-synced-segment-heap/assets/square.svg index a442b7d5..b10f95f8 100644 --- a/integrations/example-synced-segment-heap/assets/square.svg +++ b/integrations/example-synced-segment-heap/assets/square.svg @@ -1,3 +1 @@ - - - + diff --git a/integrations/example-synced-segment-mixpanel/assets/horizontal.svg b/integrations/example-synced-segment-mixpanel/assets/horizontal.svg index 699ed9ef..b10f95f8 100644 --- a/integrations/example-synced-segment-mixpanel/assets/horizontal.svg +++ b/integrations/example-synced-segment-mixpanel/assets/horizontal.svg @@ -1,45 +1 @@ - - - - - - - - + diff --git a/integrations/example-synced-segment-mixpanel/assets/square.svg b/integrations/example-synced-segment-mixpanel/assets/square.svg index a442b7d5..b10f95f8 100644 --- a/integrations/example-synced-segment-mixpanel/assets/square.svg +++ b/integrations/example-synced-segment-mixpanel/assets/square.svg @@ -1,3 +1 @@ - - - + From 2c6e71ae788347e23fe48820e39a29a78de23eed Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 28 Jun 2023 16:01:58 -0500 Subject: [PATCH 700/936] Renamed example integrations --- .../assets/horizontal.svg | 0 .../assets/square.svg | 0 .../manifest.json | 6 +++--- .../assets/horizontal.svg | 0 .../assets/square.svg | 0 .../manifest.json | 6 +++--- 6 files changed, 6 insertions(+), 6 deletions(-) rename integrations/{example-synced-segment-heap => example-synced-segment-integration1}/assets/horizontal.svg (100%) rename integrations/{example-synced-segment-heap => example-synced-segment-integration1}/assets/square.svg (100%) rename integrations/{example-synced-segment-heap => example-synced-segment-integration1}/manifest.json (82%) rename integrations/{example-synced-segment-mixpanel => example-synced-segment-integration2}/assets/horizontal.svg (100%) rename integrations/{example-synced-segment-mixpanel => example-synced-segment-integration2}/assets/square.svg (100%) rename integrations/{example-synced-segment-mixpanel => example-synced-segment-integration2}/manifest.json (86%) diff --git a/integrations/example-synced-segment-heap/assets/horizontal.svg b/integrations/example-synced-segment-integration1/assets/horizontal.svg similarity index 100% rename from integrations/example-synced-segment-heap/assets/horizontal.svg rename to integrations/example-synced-segment-integration1/assets/horizontal.svg diff --git a/integrations/example-synced-segment-heap/assets/square.svg b/integrations/example-synced-segment-integration1/assets/square.svg similarity index 100% rename from integrations/example-synced-segment-heap/assets/square.svg rename to integrations/example-synced-segment-integration1/assets/square.svg diff --git a/integrations/example-synced-segment-heap/manifest.json b/integrations/example-synced-segment-integration1/manifest.json similarity index 82% rename from integrations/example-synced-segment-heap/manifest.json rename to integrations/example-synced-segment-integration1/manifest.json index 1e2bb102..c9009b9e 100644 --- a/integrations/example-synced-segment-heap/manifest.json +++ b/integrations/example-synced-segment-integration1/manifest.json @@ -1,8 +1,8 @@ { - "name": "Example Synced Segment Heap", + "name": "Example Synced Segment Integration 1", "version": "1.0.0", - "overview": "Example synced segment for Heap.", - "description": "Example synced segment for Heap Analytics' customer data platform", + "overview": "Example synced segment for Integration 1.", + "description": "Example synced segment for Integration 1 customer data platform", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/example-synced-segment-mixpanel/assets/horizontal.svg b/integrations/example-synced-segment-integration2/assets/horizontal.svg similarity index 100% rename from integrations/example-synced-segment-mixpanel/assets/horizontal.svg rename to integrations/example-synced-segment-integration2/assets/horizontal.svg diff --git a/integrations/example-synced-segment-mixpanel/assets/square.svg b/integrations/example-synced-segment-integration2/assets/square.svg similarity index 100% rename from integrations/example-synced-segment-mixpanel/assets/square.svg rename to integrations/example-synced-segment-integration2/assets/square.svg diff --git a/integrations/example-synced-segment-mixpanel/manifest.json b/integrations/example-synced-segment-integration2/manifest.json similarity index 86% rename from integrations/example-synced-segment-mixpanel/manifest.json rename to integrations/example-synced-segment-integration2/manifest.json index d76ab1d3..08edb2f0 100644 --- a/integrations/example-synced-segment-mixpanel/manifest.json +++ b/integrations/example-synced-segment-integration2/manifest.json @@ -1,8 +1,8 @@ { - "name": "Example Synced Segment Mixpanel", + "name": "Example Synced Segment Integration 2", "version": "1.0.0", - "overview": "Example synced segment for Mixpanel.", - "description": "Example synced segment for Mixpanel customer data platform", + "overview": "Example synced segment for Integration 2.", + "description": "Example synced segment for Integration 2 customer data platform", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From 7f27694bb4e5d1b38b9fdc62f4235b91e3a4dcc3 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 28 Jun 2023 19:18:59 -0400 Subject: [PATCH 701/936] add snowplow integration --- .../snowplow/assets/images/horizontal.svg | 52 +++++++++++++++++++ .../snowplow/assets/images/square.svg | 24 +++++++++ integrations/snowplow/manifest.json | 20 +++++++ 3 files changed, 96 insertions(+) create mode 100644 integrations/snowplow/assets/images/horizontal.svg create mode 100644 integrations/snowplow/assets/images/square.svg create mode 100644 integrations/snowplow/manifest.json diff --git a/integrations/snowplow/assets/images/horizontal.svg b/integrations/snowplow/assets/images/horizontal.svg new file mode 100644 index 00000000..669eabe0 --- /dev/null +++ b/integrations/snowplow/assets/images/horizontal.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/snowplow/assets/images/square.svg b/integrations/snowplow/assets/images/square.svg new file mode 100644 index 00000000..6f1534a7 --- /dev/null +++ b/integrations/snowplow/assets/images/square.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + diff --git a/integrations/snowplow/manifest.json b/integrations/snowplow/manifest.json new file mode 100644 index 00000000..efaf07f9 --- /dev/null +++ b/integrations/snowplow/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Snowplow", + "version": "1.0.0", + "overview": "Forward Snowplow events as metrics to LaunchDarkly experiments.", + "description": "Use Snowplow to forward the behavioral data as metrics in your LaunchDarkly experiments.", + "author": "Snowplow", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://snowplow.io/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/snowplow", + "supportWebsite": "https://docs.snowplow.io/docs/destinations/forwarding-events/google-tag-manager-server-side/launchdarkly-tag-for-gtm-ss/", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "otherCapabilities": ["external"] +} From b808e84ada4f36b157880103ddaa84cac5769f55 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 3 Jul 2023 16:59:40 +0100 Subject: [PATCH 702/936] Update Grafana form variables to use service tokens instead of API keys (#476) --- integrations/grafana/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 35634fb9..9fd73a15 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -19,15 +19,15 @@ { "key": "endpointUrl", "name": "Grafana URL", - "description": "Enter your Grafana instance's URL. This instance must be accessible to LaunchDarkly's servers.", + "description": "Enter your Grafana instance's URL. This instance must be accessible to LaunchDarkly's servers. Do not include a trailing \"/\".", "placeholder": "https://grafana.example.org", "type": "uri", "isSecret": false }, { "key": "apiKey", - "name": "API key", - "description": "Enter an API key to your Grafana instance. This API key must have editor privileges.", + "name": "Service account token", + "description": "Enter Grafana [service account](https://grafana.com/docs/grafana/latest/administration/service-accounts/) token. The service account must have the \"Annotation writer\" role.", "placeholder": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk=", "type": "string", "isSecret": true From b1d43a6d996a47f9070721fbbf82b055d4e93aa2 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 5 Jul 2023 17:05:58 -0500 Subject: [PATCH 703/936] Updated dummy integration manifest to show an example of a complex response --- integrations/example-synced-segment-integration1/manifest.json | 3 ++- integrations/example-synced-segment-integration2/manifest.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/integrations/example-synced-segment-integration1/manifest.json b/integrations/example-synced-segment-integration1/manifest.json index c9009b9e..ce5fd9a5 100644 --- a/integrations/example-synced-segment-integration1/manifest.json +++ b/integrations/example-synced-segment-integration1/manifest.json @@ -25,7 +25,8 @@ "addMemberArrayPath": "/data/add", "removeMemberArrayPath": "/data/remove", "memberArrayParser": { - "memberIdPath": "/id" + "memberIdPath": "/id", + "cohortNamePath": "" } } } diff --git a/integrations/example-synced-segment-integration2/manifest.json b/integrations/example-synced-segment-integration2/manifest.json index 08edb2f0..8af955e7 100644 --- a/integrations/example-synced-segment-integration2/manifest.json +++ b/integrations/example-synced-segment-integration2/manifest.json @@ -31,7 +31,7 @@ "memberIdPath": "/mixpanel_distinct_id" } }, - "jsonResponseBody": "{ \"action\": \"{{requestBody.action}}\", {{#if errorMessage}}\"status\":\"failure\", \"error\": {\"message\": \"{{errorMessage}}\", \"code\": {{statusCode}} }{{else}}\"status\": \"success\"{{/if}} }" + "jsonResponseBody": "{ \"environmentId\": \"{{requestBody.environmentId}}\", \"projectKey\": \"{{projectKey}}\", \"envKey\": \"{{environmentKey}}\", \"segmentKey\": \"{{segmentKey}}\", \"segmentUrl\": \"{{segmentUrl}}\", {{#if errorMessage}}\"status\":\"failure\", \"error\": {\"message\": \"{{{errorMessage}}}\", \"code\": {{statusCode}} }{{else}}\"status\": \"success\"{{/if}} }" } } } From 9555d12d46654c58e96afd8e7f8d940aaacdf1b3 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 5 Jul 2023 17:08:02 -0500 Subject: [PATCH 704/936] removed unneeded change --- integrations/example-synced-segment-integration1/manifest.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/integrations/example-synced-segment-integration1/manifest.json b/integrations/example-synced-segment-integration1/manifest.json index ce5fd9a5..c9009b9e 100644 --- a/integrations/example-synced-segment-integration1/manifest.json +++ b/integrations/example-synced-segment-integration1/manifest.json @@ -25,8 +25,7 @@ "addMemberArrayPath": "/data/add", "removeMemberArrayPath": "/data/remove", "memberArrayParser": { - "memberIdPath": "/id", - "cohortNamePath": "" + "memberIdPath": "/id" } } } From 2e6afeedae18f095c7ab713c38e16d0b014ba81f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 9 Jul 2023 10:18:33 +0000 Subject: [PATCH 705/936] Bump tough-cookie from 4.0.0 to 4.1.3 Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.0.0 to 4.1.3. - [Release notes](https://github.com/salesforce/tough-cookie/releases) - [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md) - [Commits](https://github.com/salesforce/tough-cookie/compare/v4.0.0...v4.1.3) --- updated-dependencies: - dependency-name: tough-cookie dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc06686d..748dd36b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8494,14 +8494,15 @@ } }, "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { "node": ">=6" @@ -8715,9 +8716,9 @@ } }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "engines": { "node": ">= 4.0.0" @@ -15810,14 +15811,15 @@ } }, "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" } }, "tr46": { @@ -15961,9 +15963,9 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true }, "unpipe": { From e0f467ef3346ea3d00f42aa7f40b65a29f84b73c Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 10 Jul 2023 13:36:13 -0500 Subject: [PATCH 706/936] Updated merge to public script --- scripts/merge_to_public.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/merge_to_public.sh b/scripts/merge_to_public.sh index b63596c1..60229e64 100755 --- a/scripts/merge_to_public.sh +++ b/scripts/merge_to_public.sh @@ -3,14 +3,19 @@ # This script merges forward from the private mirror to the public one, # one main branch to the other while squashing commits. # -# Usage: ./merge_to_public.sh +# Usage: ./merge_to_public.sh # set -x COMMIT_MSG=${1:-Releasing changes publicly} +BRANCH_NAME=${2:-$(date +%B-%d-%Y)-release} + +# Convert BRANCH_NAME to lowercase +BRANCH_NAME=$(echo "$BRANCH_NAME" | tr '[:upper:]' '[:lower:]') echo +echo "Using branch ${BRANCH_NAME}" echo "Merging to the public mirror with message: ${COMMIT_MSG}" echo "NOTE: merge conflicts will be automatically resolved by preferring changes from the private mirror." echo @@ -23,7 +28,8 @@ git checkout main git fetch private git merge private/main --squash --strategy-option=theirs git commit -a -m "${COMMIT_MSG}" # Merge conflicts will need to be resolved manually -git push origin main +git checkout -b "${BRANCH_NAME}" +git push --set-upstream origin ${BRANCH_NAME} cd ../.. rm -rf temp From 57cb157dcf6fe798a95a5d1ec95425215998232e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jul 2023 11:01:46 +0000 Subject: [PATCH 707/936] Bump semver from 5.7.1 to 5.7.2 Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 60 +++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc06686d..10b5edac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4572,9 +4572,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5131,9 +5131,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5573,9 +5573,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5903,9 +5903,9 @@ } }, "node_modules/node-notifier/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "optional": true, "dependencies": { @@ -7526,9 +7526,9 @@ } }, "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -12761,9 +12761,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -13201,9 +13201,9 @@ }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -13545,9 +13545,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -13814,9 +13814,9 @@ }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "optional": true, "requires": { @@ -15019,9 +15019,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "send": { From 97347b39df89397380d208af7fc6676af174abeb Mon Sep 17 00:00:00 2001 From: Kelly Hofmann Date: Thu, 13 Jul 2023 11:45:35 -0700 Subject: [PATCH 708/936] add segment-audiences manifest --- integrations/segment-audiences/LICENSE.md | 13 +++++++ .../assets/images/horizontal.svg | 25 ++++++++++++++ .../assets/images/square.svg | 1 + integrations/segment-audiences/manifest.json | 34 +++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 integrations/segment-audiences/LICENSE.md create mode 100644 integrations/segment-audiences/assets/images/horizontal.svg create mode 100644 integrations/segment-audiences/assets/images/square.svg create mode 100644 integrations/segment-audiences/manifest.json diff --git a/integrations/segment-audiences/LICENSE.md b/integrations/segment-audiences/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/segment-audiences/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/segment-audiences/assets/images/horizontal.svg b/integrations/segment-audiences/assets/images/horizontal.svg new file mode 100644 index 00000000..1949c758 --- /dev/null +++ b/integrations/segment-audiences/assets/images/horizontal.svg @@ -0,0 +1,25 @@ + + + + +2019_SegmentLogo_Horizontal + + + + + + + + + + + + + + + + + + diff --git a/integrations/segment-audiences/assets/images/square.svg b/integrations/segment-audiences/assets/images/square.svg new file mode 100644 index 00000000..7b54e7a2 --- /dev/null +++ b/integrations/segment-audiences/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/segment-audiences/manifest.json b/integrations/segment-audiences/manifest.json new file mode 100644 index 00000000..b6edf312 --- /dev/null +++ b/integrations/segment-audiences/manifest.json @@ -0,0 +1,34 @@ +{ + "name": "Segment Audiences", + "version": "1.0.0", + "overview": "Sync Segment Audiences to LaunchDarkly Big Segments.", + "description": "Segment syncing lets you import audiences from Segment to LaunchDarkly to more efficiently target and deliver feature flags.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://segment.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/partner-integrations/synced-segments", + "supportWebsite": "https://segment.com/docs/connections/sources/catalog/cloud-apps/launchdarkly-audiences/", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/environmentId", + "cohortIdPath": "/batch/0/cohortId", + "cohortNamePath": "/batch/0/cohortName", + "cohortUrlPath": "/batch/0/cohortUrl", + "memberArrayPath": "/batch", + "memberArrayParser": { + "memberIdPath": "/userId", + "booleanMembershipPath": "/value" + } + } + } + } +} From efa52a3d0951ab0525f958d282ac4005341029c8 Mon Sep 17 00:00:00 2001 From: Kelly Hofmann Date: Thu, 13 Jul 2023 11:56:00 -0700 Subject: [PATCH 709/936] remove url path --- integrations/segment-audiences/manifest.json | 1 - 1 file changed, 1 deletion(-) diff --git a/integrations/segment-audiences/manifest.json b/integrations/segment-audiences/manifest.json index b6edf312..7f1e4941 100644 --- a/integrations/segment-audiences/manifest.json +++ b/integrations/segment-audiences/manifest.json @@ -22,7 +22,6 @@ "environmentIdPath": "/environmentId", "cohortIdPath": "/batch/0/cohortId", "cohortNamePath": "/batch/0/cohortName", - "cohortUrlPath": "/batch/0/cohortUrl", "memberArrayPath": "/batch", "memberArrayParser": { "memberIdPath": "/userId", From add9ca8c36f38e13455509688224608334362ba7 Mon Sep 17 00:00:00 2001 From: Kelly Hofmann <55991524+k3llymariee@users.noreply.github.com> Date: Thu, 13 Jul 2023 13:27:59 -0700 Subject: [PATCH 710/936] Apply suggestions from code review Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> --- integrations/segment-audiences/LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/segment-audiences/LICENSE.md b/integrations/segment-audiences/LICENSE.md index 9dcbe896..04b7d222 100644 --- a/integrations/segment-audiences/LICENSE.md +++ b/integrations/segment-audiences/LICENSE.md @@ -1,4 +1,4 @@ -Copyright 2020 Catamorphic Co. +Copyright 2023 Catamorphic Co. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 0d3e9577e51b47e87c34269ff66ce5d9c9d11426 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 18 Jul 2023 11:31:08 -0400 Subject: [PATCH 711/936] add fieldName to JSON path parser logger --- server/src/capabilities/syncedSegment.ts | 41 +++++++++++++++--------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/server/src/capabilities/syncedSegment.ts b/server/src/capabilities/syncedSegment.ts index d38e4553..f38bd2c5 100644 --- a/server/src/capabilities/syncedSegment.ts +++ b/server/src/capabilities/syncedSegment.ts @@ -168,12 +168,13 @@ const parseSyncSegmentRequest = async ( result.environmentId = getFieldValue( body, parser.environmentIdPath, - true + true, + "environmentIdPath" ); - const cohortId = getFieldValue(body, parser.cohortIdPath, true); - const cohortName = getFieldValue(body, parser.cohortNamePath, true); - const cohortUrl = getFieldValue(body, parser.cohortUrlPath, false); + const cohortId = getFieldValue(body, parser.cohortIdPath, true, "cohordIdPath"); + const cohortName = getFieldValue(body, parser.cohortNamePath, true, "cohortNamePath"); + const cohortUrl = getFieldValue(body, parser.cohortUrlPath, false, "cohortUrlPath"); const batchedRecords: SyncedSegmentBatch[] = []; @@ -181,7 +182,8 @@ const parseSyncSegmentRequest = async ( const memberArray = getFieldValue( body, parser.memberArrayPath, - true + true, + "memberArrayPath" ); const memberArrayBatch = parseBatchArray({ memberArray, @@ -198,7 +200,8 @@ const parseSyncSegmentRequest = async ( const memberArray = getFieldValue( body, parser.memberArrayPath, - true + true, + "memberArrayPath" ); const shouldInclude = getArrayMembershipStatus( parser, @@ -223,7 +226,8 @@ const parseSyncSegmentRequest = async ( const memberArray = getFieldValue( body, parser.addMemberArrayPath, - !!parser.removeMemberArrayPath + !!parser.removeMemberArrayPath, + "addMemberArrayPath" ); const memberArrayBatch = parseBatchArray({ memberArray, @@ -241,7 +245,8 @@ const parseSyncSegmentRequest = async ( const memberArray = getFieldValue( body, parser.removeMemberArrayPath, - !!parser.addMemberArrayPath + !!parser.addMemberArrayPath, + "removeMemberArrayPath" ); const memberArrayBatch = parseBatchArray({ memberArray, @@ -292,16 +297,18 @@ const parseBatchArray = (params: ParseArryParams): SyncedSegmentBatch[] => { params.status ); - const memberId = getFieldValue(member, memberParser.memberIdPath, true); + const memberId = getFieldValue(member, memberParser.memberIdPath, true, "memberIdPath"); const cohortIdOverride = getFieldValue( member, memberParser.cohortIdPath, - false + false, + "cohortIdPath" ); const cohortNameOverride = getFieldValue( member, memberParser.cohortNamePath, - false + false, + "cohortNamePath" ); const record: SyncedSegmentBatch = { @@ -335,7 +342,8 @@ const getArrayMembershipStatus = ( return getFieldValue( payload, rp.memberArrayParser.booleanMembershipPath, - true + true, + "booleanMembershipPath" ); } @@ -343,7 +351,8 @@ const getArrayMembershipStatus = ( const inclusionValue = getFieldValue( payload, rp.arrayInclusion?.path, - true + true, + "arrayInclusionPath.path" ); const regex = new RegExp(rp.arrayInclusion?.matcher || ''); return regex.test(inclusionValue); @@ -360,18 +369,20 @@ const getArrayMembershipStatus = ( * @param payload * @param jsonPtr * @param required + * @param fieldName * @returns */ const getFieldValue = ( payload: any, jsonPtr: string | undefined, - required?: boolean + required?: boolean, + fieldName?: string ): T => { if (!jsonPtr) { return undefined as T; } - logger.log('processing ptr: ', jsonPtr); + logger.log(`Processing ptr: '${jsonPtr}' ${fieldName ? `for manifest field: '${fieldName}'` : ''}`); const value = pointer.get(payload, jsonPtr); if (!value && required) { From 0cf3afc85a085a9afe683ab2f781d66454252794 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jul 2023 20:42:43 +0000 Subject: [PATCH 712/936] Bump word-wrap from 1.2.3 to 1.2.4 Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4. - [Release notes](https://github.com/jonschlinkert/word-wrap/releases) - [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4) --- updated-dependencies: - dependency-name: word-wrap dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc06686d..a827cf60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9009,9 +9009,9 @@ "dev": true }, "node_modules/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==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -16206,9 +16206,9 @@ "dev": true }, "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==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true }, "wordwrap": { From 97d7e008594e673ce791fb765dfb2e1eb8782abc Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 19 Jul 2023 12:45:48 -0500 Subject: [PATCH 713/936] Added context kind property to the integration framework manifest schema for synced segments --- __tests__/validateSyncedSegmentCapability.js | 1 + .../manifest.json | 3 +- manifest.schema.d.ts | 5 ++ manifest.schema.json | 7 +++ schemas/capabilities/syncedSegment.json | 7 +++ server/src/capabilities/syncedSegment.ts | 47 +++++++++++++++---- 6 files changed, 61 insertions(+), 9 deletions(-) diff --git a/__tests__/validateSyncedSegmentCapability.js b/__tests__/validateSyncedSegmentCapability.js index f427c4ee..6683938b 100644 --- a/__tests__/validateSyncedSegmentCapability.js +++ b/__tests__/validateSyncedSegmentCapability.js @@ -14,6 +14,7 @@ manifestsWithCapability.push([ syncedSegment: { requestParser: { environmentIdPath: '/environmentId', + contextKindPath: '/contextKind', cohortIdPath: '/batch[0]/cohortId', cohortNamePath: '/batch[0]/cohortName', cohortUrlPath: '/batch[0]/cohortUrl', diff --git a/integrations/example-synced-segment-integration2/manifest.json b/integrations/example-synced-segment-integration2/manifest.json index 8af955e7..aadf8a22 100644 --- a/integrations/example-synced-segment-integration2/manifest.json +++ b/integrations/example-synced-segment-integration2/manifest.json @@ -20,6 +20,7 @@ "syncedSegment": { "requestParser": { "environmentIdPath": "/parameters/mixpanel_project_id", + "contextKindPath": "/contextKind", "cohortIdPath": "/parameters/mixpanel_cohort_id", "cohortNamePath": "/parameters/mixpanel_cohort_name", "arrayInclusion": { @@ -31,7 +32,7 @@ "memberIdPath": "/mixpanel_distinct_id" } }, - "jsonResponseBody": "{ \"environmentId\": \"{{requestBody.environmentId}}\", \"projectKey\": \"{{projectKey}}\", \"envKey\": \"{{environmentKey}}\", \"segmentKey\": \"{{segmentKey}}\", \"segmentUrl\": \"{{segmentUrl}}\", {{#if errorMessage}}\"status\":\"failure\", \"error\": {\"message\": \"{{{errorMessage}}}\", \"code\": {{statusCode}} }{{else}}\"status\": \"success\"{{/if}} }" + "jsonResponseBody": "{ \"environmentId\": \"{{requestBody.environmentId}}\", \"contextKind\": \"{{requestBody.contextKind}}\", \"projectKey\": \"{{projectKey}}\", \"envKey\": \"{{environmentKey}}\", \"segmentKey\": \"{{segmentKey}}\", \"segmentUrl\": \"{{segmentUrl}}\", {{#if errorMessage}}\"status\":\"failure\", \"error\": {\"message\": \"{{{errorMessage}}}\", \"code\": {{statusCode}} }{{else}}\"status\": \"success\"{{/if}} }" } } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 78bb73cc..880a8732 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -580,6 +580,10 @@ export type ResponseBody = string; * JSON pointer to the LaunchDarkly environment id */ export type EnvironmentIdPath = string; +/** + * JSON pointer to the LaunchDarkly context kind + */ +export type ContextKindPath = string; /** * JSON pointer to the cohort id */ @@ -1028,6 +1032,7 @@ export interface SyncedSegment { */ export interface RequestParser { environmentIdPath: EnvironmentIdPath; + contextKindPath?: ContextKindPath; cohortIdPath: CohortIdPath; cohortNamePath: CohortNamePath; cohortUrlPath?: CohortUrlPath; diff --git a/manifest.schema.json b/manifest.schema.json index 34a5d146..af64bcf5 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -4106,6 +4106,7 @@ "propertyNames": { "enum": [ "environmentIdPath", + "contextKindPath", "cohortIdPath", "cohortNamePath", "cohortUrlPath", @@ -4129,6 +4130,12 @@ "type": "string", "description": "JSON pointer to the LaunchDarkly environment id" }, + "contextKindPath": { + "$id": "#/properties/capability/synced-segment/request-parser/context-kind-path", + "title": "Context kind path", + "type": "string", + "description": "JSON pointer to the LaunchDarkly context kind" + }, "cohortIdPath": { "$id": "#/properties/capability/synced-segment/request-parser/cohort-id-path", "title": "Cohort id path", diff --git a/schemas/capabilities/syncedSegment.json b/schemas/capabilities/syncedSegment.json index a3a2b8d3..5d58880f 100644 --- a/schemas/capabilities/syncedSegment.json +++ b/schemas/capabilities/syncedSegment.json @@ -24,6 +24,7 @@ "propertyNames": { "enum": [ "environmentIdPath", + "contextKindPath", "cohortIdPath", "cohortNamePath", "cohortUrlPath", @@ -47,6 +48,12 @@ "type": "string", "description": "JSON pointer to the LaunchDarkly environment id" }, + "contextKindPath": { + "$id": "#/properties/capability/synced-segment/request-parser/context-kind-path", + "title": "Context kind path", + "type": "string", + "description": "JSON pointer to the LaunchDarkly context kind" + }, "cohortIdPath": { "$id": "#/properties/capability/synced-segment/request-parser/cohort-id-path", "title": "Cohort id path", diff --git a/server/src/capabilities/syncedSegment.ts b/server/src/capabilities/syncedSegment.ts index f38bd2c5..51325585 100644 --- a/server/src/capabilities/syncedSegment.ts +++ b/server/src/capabilities/syncedSegment.ts @@ -9,6 +9,10 @@ import HandleBars from 'handlebars'; const logger = createLogger('synced-segment'); +enum ContextKind { + User = 'user', +} + enum MembershipStatus { include = 'include', exclude = 'exclude', @@ -26,6 +30,7 @@ export type SyncedSegmentBatch = { export type SyncedSegment = { environmentId: string; + contextKind: string; batch: SyncedSegmentBatch[]; }; @@ -160,6 +165,7 @@ const parseSyncSegmentRequest = async ( const result: SyncedSegment = { environmentId: '', + contextKind: ContextKind.User, batch: [], }; @@ -169,12 +175,37 @@ const parseSyncSegmentRequest = async ( body, parser.environmentIdPath, true, - "environmentIdPath" + 'environmentIdPath' ); - const cohortId = getFieldValue(body, parser.cohortIdPath, true, "cohordIdPath"); - const cohortName = getFieldValue(body, parser.cohortNamePath, true, "cohortNamePath"); - const cohortUrl = getFieldValue(body, parser.cohortUrlPath, false, "cohortUrlPath"); + const contextKind = getFieldValue( + body, + parser.contextKindPath, + false, + 'contextKindPath' + ); + if (contextKind) { + result.contextKind = contextKind; + } + + const cohortId = getFieldValue( + body, + parser.cohortIdPath, + true, + 'cohordIdPath' + ); + const cohortName = getFieldValue( + body, + parser.cohortNamePath, + true, + 'cohortNamePath' + ); + const cohortUrl = getFieldValue( + body, + parser.cohortUrlPath, + false, + 'cohortUrlPath' + ); const batchedRecords: SyncedSegmentBatch[] = []; @@ -183,7 +214,7 @@ const parseSyncSegmentRequest = async ( body, parser.memberArrayPath, true, - "memberArrayPath" + 'memberArrayPath' ); const memberArrayBatch = parseBatchArray({ memberArray, @@ -201,7 +232,7 @@ const parseSyncSegmentRequest = async ( body, parser.memberArrayPath, true, - "memberArrayPath" + 'memberArrayPath' ); const shouldInclude = getArrayMembershipStatus( parser, @@ -227,7 +258,7 @@ const parseSyncSegmentRequest = async ( body, parser.addMemberArrayPath, !!parser.removeMemberArrayPath, - "addMemberArrayPath" + 'addMemberArrayPath' ); const memberArrayBatch = parseBatchArray({ memberArray, @@ -246,7 +277,7 @@ const parseSyncSegmentRequest = async ( body, parser.removeMemberArrayPath, !!parser.addMemberArrayPath, - "removeMemberArrayPath" + 'removeMemberArrayPath' ); const memberArrayBatch = parseBatchArray({ memberArray, From 94e037c85c28ab924902af16aaa491b153646ed5 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Wed, 19 Jul 2023 12:49:43 -0500 Subject: [PATCH 714/936] Added context kind path to segment audiences --- integrations/segment-audiences/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/segment-audiences/manifest.json b/integrations/segment-audiences/manifest.json index 7f1e4941..c31e0244 100644 --- a/integrations/segment-audiences/manifest.json +++ b/integrations/segment-audiences/manifest.json @@ -20,6 +20,7 @@ "syncedSegment": { "requestParser": { "environmentIdPath": "/environmentId", + "contextKindPath": "/contextKind", "cohortIdPath": "/batch/0/cohortId", "cohortNamePath": "/batch/0/cohortName", "memberArrayPath": "/batch", From ec7133231363cd30713a1887f2eaa11ab8fe3eb4 Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Tue, 25 Jul 2023 12:43:58 -0700 Subject: [PATCH 715/936] Updates product name --- integrations/signalfx/README.md | 16 ++++++++-------- integrations/signalfx/manifest.json | 20 ++++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/integrations/signalfx/README.md b/integrations/signalfx/README.md index f7ec6842..60bc7655 100644 --- a/integrations/signalfx/README.md +++ b/integrations/signalfx/README.md @@ -1,22 +1,22 @@ -# SignalFx +# Splunk Observability Cloud -User documentation for this integration is available on the LaunchDarkly documentation site: [SignalFx](https://docs.launchdarkly.com/integrations/signalfx) +User documentation for this integration is available on the LaunchDarkly documentation site: [Splunk Observability Cloud](https://docs.launchdarkly.com/integrations/splunk/observability) -API documentation for this integration is available on the SignalFx documentation site: [SignalFx](https://developers.signalfx.com/ingest_data_reference.html#operation/Send%20Custom%20Events) +API documentation for this integration is available on the Splunk Observability Cloud documentation site: [Splunk Observability Cloud](https://dev.splunk.com/observability/reference/api/ingest_data/latest) -Trigger documentation for this integration is available on the SignalFx documentation site: [Webhook (trigger) documentation](https://docs.signalfx.com/en/latest/admin-guide/integrate-notifications.html) +Trigger documentation for this integration is available on the Splunk Observability Cloud documentation site: [Webhook (trigger) documentation](https://docs.splunk.com/Observability/admin/notif-services/webhook.html#webhook) -## Testing the SignalFx integration +## Testing the Splunk Observability Cloud integration -You can verify that the SignalFx integration is working correctly by locating LaunchDarkly events in SignalFx. +You can verify that the Splunk Observability Cloud integration is working correctly by locating LaunchDarkly events in Splunk Observability Cloud. Here's how: -1. Log in to SignalFx and navigate to the **Dashboards** tab. +1. Log in to Splunk Observability Cloud and navigate to the **Dashboards** tab. 2. Expand the "Buit-in Dashboard Groups" section. 3. Expand the "Sample Data" section. 4. Click into "Sample Charts." You can add LaunchDarkly events to any of these charts. 5. Under "Plot Editor," select "Add Metric or Event" and choose "LaunchDarkly flag change." 6. Send an event from your local LaunchDarkly instance. It appears at the bottom of the chart as a diamond shape. -Run `npm run curl signalfx` in the root repository directory to generate a `curl` command to send data to SignalFx. +Run `npm run curl signalfx` in the root repository directory to generate a `curl` command to send data to Splunk Observability Cloud. diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 2ff2f891..2f9a97a1 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -1,13 +1,13 @@ { - "name": "SignalFx", + "name": "Splunk Observability Cloud", "version": "1.0.0", - "overview": "Monitor LaunchDarkly flag changes in SignalFx.", - "description": "Monitor LaunchDarkly flag and other change events with clear data markers in SignalFx to correlate feature flag rollouts with changes in operational health.", + "overview": "Monitor LaunchDarkly flag changes in Splunk Observability Cloud.", + "description": "Monitor LaunchDarkly flag and other change events with clear data markers in Splunk Observability Cloud to correlate feature flag rollouts with changes in operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://www.signalfx.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/signalfx", + "site": "https://dev.splunk.com/observability/docs", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/splunk/observability", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring"], @@ -18,15 +18,15 @@ "formVariables": [ { "key": "accessToken", - "name": "SignalFx access token", - "description": "Enter your [SignalFx access token](https://docs.signalfx.com/en/latest/admin-guide/tokens.html#working-with-access-tokens).", + "name": "Splunk Observability Cloud access token", + "description": "Enter your [Splunk Observability Cloud access token](https://docs.splunk.com/Observability/admin/authentication-tokens/tokens.html#working-with-access-tokens).", "type": "string", "isSecret": true }, { "key": "realm", - "name": "SignalFx realm", - "description": "Enter your [SignalFx realm](https://developers.signalfx.com/#realms-in-endpoints).", + "name": "Splunk Observability Cloud realm", + "description": "Enter your [Splunk Observability Cloud realm](https://dev.splunk.com/observability/docs/realms_in_endpoints/).", "type": "string", "isSecret": false } @@ -60,7 +60,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/signalfx/triggers#connecting-a-flag-trigger-to-signalfx", + "documentation": "https://docs.launchdarkly.com/integrations/splunk/triggers#connecting-a-flag-trigger-to-splunk", "parser": { "eventName": "/eventType", "url": "/detectorUrl" From 412ce79cce25fa0fdfa59921c5664c717352101a Mon Sep 17 00:00:00 2001 From: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> Date: Tue, 25 Jul 2023 14:52:14 -0700 Subject: [PATCH 716/936] Update integrations/signalfx/manifest.json --- integrations/signalfx/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 2f9a97a1..3870ccab 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -6,7 +6,7 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://dev.splunk.com/observability/docs", + "site": "https://www.splunk.com/en_us/products/observability.html", "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/splunk/observability", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, From c6f21e158f5ca38f5e3278c0637b63c7797daa60 Mon Sep 17 00:00:00 2001 From: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> Date: Tue, 25 Jul 2023 16:25:51 -0700 Subject: [PATCH 717/936] Apply suggestions from code review --- integrations/signalfx/README.md | 2 +- integrations/signalfx/manifest.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/signalfx/README.md b/integrations/signalfx/README.md index 60bc7655..83cb0c12 100644 --- a/integrations/signalfx/README.md +++ b/integrations/signalfx/README.md @@ -1,6 +1,6 @@ # Splunk Observability Cloud -User documentation for this integration is available on the LaunchDarkly documentation site: [Splunk Observability Cloud](https://docs.launchdarkly.com/integrations/splunk/observability) +User documentation for this integration is available on the LaunchDarkly documentation site: [Splunk Observability Cloud](https://docs.launchdarkly.com/integrations/splunk-observability) API documentation for this integration is available on the Splunk Observability Cloud documentation site: [Splunk Observability Cloud](https://dev.splunk.com/observability/reference/api/ingest_data/latest) diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 3870ccab..21e1e426 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.splunk.com/en_us/products/observability.html", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/splunk/observability", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/splunk-observability", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring"], @@ -60,7 +60,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/splunk/triggers#connecting-a-flag-trigger-to-splunk", + "documentation": "https://docs.launchdarkly.com/integrations/splunk-observability/triggers#connecting-a-flag-trigger-to-splunk", "parser": { "eventName": "/eventType", "url": "/detectorUrl" From 4ac0e3c4d7fe707de8d568cfdd8e5fc9699e278f Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Tue, 25 Jul 2023 16:57:00 -0700 Subject: [PATCH 718/936] Updates logo --- .../signalfx/assets/images/horizontal.svg | 56 ------------------- .../signalfx/assets/images/splunk-icon.svg | 1 + .../signalfx/assets/images/splunk-logo.svg | 1 + .../signalfx/assets/images/square.svg | 6 -- integrations/signalfx/manifest.json | 4 +- 5 files changed, 4 insertions(+), 64 deletions(-) delete mode 100755 integrations/signalfx/assets/images/horizontal.svg create mode 100644 integrations/signalfx/assets/images/splunk-icon.svg create mode 100644 integrations/signalfx/assets/images/splunk-logo.svg delete mode 100644 integrations/signalfx/assets/images/square.svg diff --git a/integrations/signalfx/assets/images/horizontal.svg b/integrations/signalfx/assets/images/horizontal.svg deleted file mode 100755 index 9aee85db..00000000 --- a/integrations/signalfx/assets/images/horizontal.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/signalfx/assets/images/splunk-icon.svg b/integrations/signalfx/assets/images/splunk-icon.svg new file mode 100644 index 00000000..dfb56c69 --- /dev/null +++ b/integrations/signalfx/assets/images/splunk-icon.svg @@ -0,0 +1 @@ + diff --git a/integrations/signalfx/assets/images/splunk-logo.svg b/integrations/signalfx/assets/images/splunk-logo.svg new file mode 100644 index 00000000..d7f6e224 --- /dev/null +++ b/integrations/signalfx/assets/images/splunk-logo.svg @@ -0,0 +1 @@ + diff --git a/integrations/signalfx/assets/images/square.svg b/integrations/signalfx/assets/images/square.svg deleted file mode 100644 index 2c281a2e..00000000 --- a/integrations/signalfx/assets/images/square.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 21e1e426..03f9b3b5 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -12,8 +12,8 @@ }, "categories": ["monitoring"], "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" + "square": "assets/images/splunk-icon.svg", + "horizontal": "assets/images/splunk-logo.svg" }, "formVariables": [ { From a685027e6d212530fd964dcd51023632de013405 Mon Sep 17 00:00:00 2001 From: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> Date: Thu, 27 Jul 2023 10:08:02 -0700 Subject: [PATCH 719/936] Update integrations/signalfx/README.md --- integrations/signalfx/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/signalfx/README.md b/integrations/signalfx/README.md index 83cb0c12..4164aeee 100644 --- a/integrations/signalfx/README.md +++ b/integrations/signalfx/README.md @@ -1,4 +1,4 @@ -# Splunk Observability Cloud +# Splunk Observability Cloud (formerly SignalFx) User documentation for this integration is available on the LaunchDarkly documentation site: [Splunk Observability Cloud](https://docs.launchdarkly.com/integrations/splunk-observability) From 89a0dd28e8b41e3a79d4f5a4de73f362279e3a8e Mon Sep 17 00:00:00 2001 From: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> Date: Thu, 27 Jul 2023 13:27:13 -0700 Subject: [PATCH 720/936] Update integrations/signalfx/manifest.json --- integrations/signalfx/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index 03f9b3b5..e4fcfea6 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -60,7 +60,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/splunk-observability/triggers#connecting-a-flag-trigger-to-splunk", + "documentation": "https://docs.launchdarkly.com/integrations/splunk-observability/triggers#connecting-a-flag-trigger-to-splunk-observability-cloud", "parser": { "eventName": "/eventType", "url": "/detectorUrl" From d2f43c6e95e169857da39c52e820feac099b26d8 Mon Sep 17 00:00:00 2001 From: Molly Date: Mon, 7 Aug 2023 09:05:49 -0700 Subject: [PATCH 721/936] [sc-210243] update validation server readme (#486) * update validation server readme * Apply suggestions from code review Co-authored-by: Henry Barrow --------- Co-authored-by: Henry Barrow --- server/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/README.md b/server/README.md index 56114b3b..99d306ec 100644 --- a/server/README.md +++ b/server/README.md @@ -1,6 +1,6 @@ # LaunchDarkly Integration Validation Server (beta) -The LaunchDarkly Integration Validation Server is a tool that allows developers to test their integrations with LaunchDarkly using an Express server. This server provides an environment where developers can validate their integrations with LaunchDarkly's feature flag management platform. +The LaunchDarkly Integration Validation Server is a tool that developers can use to test their integrations with LaunchDarkly. This server provides an environment where developers can validate their integrations with LaunchDarkly's feature flag management platform. ## Getting started @@ -44,7 +44,7 @@ The LaunchDarkly Integration Validation Server exposes the following endpoints: | Endpoint | Method | Description | |--------------------|--------|-----------------------------------------------| -| `/api/v2/segment-target/:integrationKey` | POST | Simulates processing a synced segment data from a Customer Data Provider (CDP). | +| `/api/v2/segment-target/:integrationKey` | POST | Simulates processing a synced segment data from a Customer Data Provider (CDP). Replace `:integrationKey` with the name of the directory that you are adding to the `integration-framework` repository under `integrations/`. | ### Example usage @@ -54,7 +54,7 @@ To validate that a segment from a Customer Data Platform (CDP) will be successfu curl --location 'http://localhost:3000/api/v2/segment-target/example-integration-key' \ --header 'Content-Type: application/json' \ --data '{ - "environmentId": "abcd123", + "environmentId": "example-client-side-ID", "batch": [ { "userId": "example-cdp-user-1234", From e28faf57537f3371d60a1c205b106cea89d6cd32 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 23 Aug 2023 14:33:04 -0400 Subject: [PATCH 722/936] merging public to private --- integrations/akamai/assets/horizontal.svg | 151 ++++++++++++++++++ integrations/akamai/assets/square.svg | 151 ++++++++++++++++++ integrations/akamai/manifest.json | 55 +++++++ .../akamai/templates/default.json.hbs | 2 + integrations/fastly/assets/horizontal.svg | 36 +++++ integrations/fastly/assets/square.svg | 1 + integrations/fastly/manifest.json | 55 +++++++ .../fastly/templates/default.json.hbs | 2 + .../fullstory/assets/images/horizontal.svg | 4 + .../fullstory/assets/images/square.svg | 6 + integrations/fullstory/manifest.json | 20 +++ .../osano/assets/images/horizontal.svg | 1 + integrations/osano/assets/images/square.svg | 1 + integrations/osano/manifest.json | 21 +++ .../2021_Tealium_icon_rgb_full-color.svg | 36 +++++ .../2021_Tealium_logo_rgb_full-color.svg | 55 +++++++ integrations/tealium-inbound/manifest.json | 20 +++ 17 files changed, 617 insertions(+) create mode 100644 integrations/akamai/assets/horizontal.svg create mode 100644 integrations/akamai/assets/square.svg create mode 100644 integrations/akamai/manifest.json create mode 100644 integrations/akamai/templates/default.json.hbs create mode 100644 integrations/fastly/assets/horizontal.svg create mode 100644 integrations/fastly/assets/square.svg create mode 100644 integrations/fastly/manifest.json create mode 100644 integrations/fastly/templates/default.json.hbs create mode 100644 integrations/fullstory/assets/images/horizontal.svg create mode 100644 integrations/fullstory/assets/images/square.svg create mode 100644 integrations/fullstory/manifest.json create mode 100644 integrations/osano/assets/images/horizontal.svg create mode 100644 integrations/osano/assets/images/square.svg create mode 100644 integrations/osano/manifest.json create mode 100644 integrations/tealium-inbound/assets/images/2021_Tealium_icon_rgb_full-color.svg create mode 100644 integrations/tealium-inbound/assets/images/2021_Tealium_logo_rgb_full-color.svg create mode 100644 integrations/tealium-inbound/manifest.json diff --git a/integrations/akamai/assets/horizontal.svg b/integrations/akamai/assets/horizontal.svg new file mode 100644 index 00000000..49633d3a --- /dev/null +++ b/integrations/akamai/assets/horizontal.svg @@ -0,0 +1,151 @@ + + + +image/svg+xml diff --git a/integrations/akamai/assets/square.svg b/integrations/akamai/assets/square.svg new file mode 100644 index 00000000..2383d7fd --- /dev/null +++ b/integrations/akamai/assets/square.svg @@ -0,0 +1,151 @@ + + + +image/svg+xml diff --git a/integrations/akamai/manifest.json b/integrations/akamai/manifest.json new file mode 100644 index 00000000..7cc95377 --- /dev/null +++ b/integrations/akamai/manifest.json @@ -0,0 +1,55 @@ +{ + "name": "Akamai", + "version": "1.0.0", + "overview": "Evaluate LaunchDarkly feature flags in Akamai Edge Workers.", + "description": "Evaluate LaunchDarkly feature flags in Akamai Edge Workers for improved performance.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.akamai.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/akamai", + "privacyPolicy": "https://www.akamai.com/us/en/privacy-policies/" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + { + "key": "apiKey", + "name": "Akamai API key", + "type": "string", + "description": "Enter your Akamai API key.", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "http://example.com/path/to/nowhere", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "AKAMAI-API-KEY", + "value": "api-key-would-go-here" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/akamai/templates/default.json.hbs b/integrations/akamai/templates/default.json.hbs new file mode 100644 index 00000000..2c63c085 --- /dev/null +++ b/integrations/akamai/templates/default.json.hbs @@ -0,0 +1,2 @@ +{ +} diff --git a/integrations/fastly/assets/horizontal.svg b/integrations/fastly/assets/horizontal.svg new file mode 100644 index 00000000..ab886ee0 --- /dev/null +++ b/integrations/fastly/assets/horizontal.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/integrations/fastly/assets/square.svg b/integrations/fastly/assets/square.svg new file mode 100644 index 00000000..ef542f9f --- /dev/null +++ b/integrations/fastly/assets/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/fastly/manifest.json b/integrations/fastly/manifest.json new file mode 100644 index 00000000..cbc61e23 --- /dev/null +++ b/integrations/fastly/manifest.json @@ -0,0 +1,55 @@ +{ + "name": "Fastly", + "version": "1.0.0", + "overview": "Evaluate LaunchDarkly feature flags in Fastly's Compute@Edge offering.", + "description": "Evaluate LaunchDarkly feature flags in Fastly's Compute@Edge offering by storing flag rules in Fastly's edge dictionary.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.fastly.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/fastly", + "privacyPolicy": "https://www.fastly.com/privacy/" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + { + "key": "apiKey", + "name": "Fastly API key", + "type": "string", + "description": "Enter your Fastly API key.", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "http://example.com/path/to/nowhere", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "FASTLY-API-KEY", + "value": "api-key-would-go-here" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/fastly/templates/default.json.hbs b/integrations/fastly/templates/default.json.hbs new file mode 100644 index 00000000..2c63c085 --- /dev/null +++ b/integrations/fastly/templates/default.json.hbs @@ -0,0 +1,2 @@ +{ +} diff --git a/integrations/fullstory/assets/images/horizontal.svg b/integrations/fullstory/assets/images/horizontal.svg new file mode 100644 index 00000000..ea0048f5 --- /dev/null +++ b/integrations/fullstory/assets/images/horizontal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/fullstory/assets/images/square.svg b/integrations/fullstory/assets/images/square.svg new file mode 100644 index 00000000..bac90c50 --- /dev/null +++ b/integrations/fullstory/assets/images/square.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/integrations/fullstory/manifest.json b/integrations/fullstory/manifest.json new file mode 100644 index 00000000..d133600f --- /dev/null +++ b/integrations/fullstory/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "FullStory", + "version": "1.0.0", + "overview": "Send feature flag data from the LaunchDarkly JavaScript SDK to FullStory as page properties.", + "description": "FullStory combines analytics with high-fidelity session replay and intelligent diagnostics so you can fix issues impacting your customers' experience, even if the issues are not reported by customers.

Send feature flag evaluation data from the LaunchDarkly JavaScript SDK to FullStory as page properties.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "supportWebsite": "https://help.fullstory.com/", + "site": "https://www.fullstory.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/fullstory", + "privacyPolicy": "https://www.fullstory.com/legal/privacy-policy/" + }, + "categories": ["analytics"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "otherCapabilities": ["external"] +} diff --git a/integrations/osano/assets/images/horizontal.svg b/integrations/osano/assets/images/horizontal.svg new file mode 100644 index 00000000..b0646bfd --- /dev/null +++ b/integrations/osano/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/osano/assets/images/square.svg b/integrations/osano/assets/images/square.svg new file mode 100644 index 00000000..24edf2d9 --- /dev/null +++ b/integrations/osano/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/osano/manifest.json b/integrations/osano/manifest.json new file mode 100644 index 00000000..bfbc4123 --- /dev/null +++ b/integrations/osano/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Osano", + "version": "1.0.0", + "overview": "Search for customer personal information (PI) in LaunchDarkly.", + "description": "This integration facilitates data mapping and compliance with subject rights requests by automatically finding requester PI stored with LaunchDarkly via daily syncs and on demand.", + "details": "Osano is a data privacy management platform that supports, streamlines, and automates compliance with data privacy laws around the world.", + "author": "Osano", + "supportEmail": "help@osano.com", + "links": { + "supportWebsite": "https://docs.osano.com/", + "site": "https://osano.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/osano", + "privacyPolicy": "https://www.osano.com/legal/privacy" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "otherCapabilities": ["external"] +} diff --git a/integrations/tealium-inbound/assets/images/2021_Tealium_icon_rgb_full-color.svg b/integrations/tealium-inbound/assets/images/2021_Tealium_icon_rgb_full-color.svg new file mode 100644 index 00000000..2306f56f --- /dev/null +++ b/integrations/tealium-inbound/assets/images/2021_Tealium_icon_rgb_full-color.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/tealium-inbound/assets/images/2021_Tealium_logo_rgb_full-color.svg b/integrations/tealium-inbound/assets/images/2021_Tealium_logo_rgb_full-color.svg new file mode 100644 index 00000000..45062588 --- /dev/null +++ b/integrations/tealium-inbound/assets/images/2021_Tealium_logo_rgb_full-color.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/tealium-inbound/manifest.json b/integrations/tealium-inbound/manifest.json new file mode 100644 index 00000000..67981c72 --- /dev/null +++ b/integrations/tealium-inbound/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Tealium Inbound Events", + "version": "1.0.0", + "overview": "Send Tealium Metric Events to LaunchDarkly from Tealium's EventStream API Hub.", + "description": "Power your LaunchDarkly experiments with data from your Tealium Customer Data Hub with this turnkey integration.", + "author": "Tealium", + "supportEmail": "support@tealium.com", + "links": { + "supportWebsite": "https://tealium.com/docs-overview/", + "site": "https://tealium.com/", + "privacyPolicy": "https://tealium.com/privacy", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/tealium" + }, + "categories": ["analytics", "data"], + "icons": { + "square": "assets/images/2021_Tealium_icon_rgb_full-color.svg", + "horizontal": "assets/images/2021_Tealium_logo_rgb_full-color.svg" + }, + "otherCapabilities": ["external"] +} From c51a90caa1499b9044189d3ab7d006abaf9f4336 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 23 Aug 2023 14:36:35 -0400 Subject: [PATCH 723/936] remove akamai and fastly from public merge --- integrations/akamai/assets/horizontal.svg | 151 ------------------ integrations/akamai/assets/square.svg | 151 ------------------ integrations/akamai/manifest.json | 55 ------- .../akamai/templates/default.json.hbs | 2 - integrations/fastly/assets/horizontal.svg | 36 ----- integrations/fastly/assets/square.svg | 1 - integrations/fastly/manifest.json | 55 ------- .../fastly/templates/default.json.hbs | 2 - 8 files changed, 453 deletions(-) delete mode 100644 integrations/akamai/assets/horizontal.svg delete mode 100644 integrations/akamai/assets/square.svg delete mode 100644 integrations/akamai/manifest.json delete mode 100644 integrations/akamai/templates/default.json.hbs delete mode 100644 integrations/fastly/assets/horizontal.svg delete mode 100644 integrations/fastly/assets/square.svg delete mode 100644 integrations/fastly/manifest.json delete mode 100644 integrations/fastly/templates/default.json.hbs diff --git a/integrations/akamai/assets/horizontal.svg b/integrations/akamai/assets/horizontal.svg deleted file mode 100644 index 49633d3a..00000000 --- a/integrations/akamai/assets/horizontal.svg +++ /dev/null @@ -1,151 +0,0 @@ - - - -image/svg+xml diff --git a/integrations/akamai/assets/square.svg b/integrations/akamai/assets/square.svg deleted file mode 100644 index 2383d7fd..00000000 --- a/integrations/akamai/assets/square.svg +++ /dev/null @@ -1,151 +0,0 @@ - - - -image/svg+xml diff --git a/integrations/akamai/manifest.json b/integrations/akamai/manifest.json deleted file mode 100644 index 7cc95377..00000000 --- a/integrations/akamai/manifest.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "Akamai", - "version": "1.0.0", - "overview": "Evaluate LaunchDarkly feature flags in Akamai Edge Workers.", - "description": "Evaluate LaunchDarkly feature flags in Akamai Edge Workers for improved performance.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://www.akamai.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/akamai", - "privacyPolicy": "https://www.akamai.com/us/en/privacy-policies/" - }, - "categories": ["infrastructure"], - "icons": { - "square": "assets/square.svg", - "horizontal": "assets/horizontal.svg" - }, - "formVariables": [ - { - "key": "apiKey", - "name": "Akamai API key", - "type": "string", - "description": "Enter your Akamai API key.", - "isSecret": true - } - ], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "http://example.com/path/to/nowhere", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "AKAMAI-API-KEY", - "value": "api-key-would-go-here" - } - ] - }, - "templates": { - "default": "templates/default.json.hbs" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } -} diff --git a/integrations/akamai/templates/default.json.hbs b/integrations/akamai/templates/default.json.hbs deleted file mode 100644 index 2c63c085..00000000 --- a/integrations/akamai/templates/default.json.hbs +++ /dev/null @@ -1,2 +0,0 @@ -{ -} diff --git a/integrations/fastly/assets/horizontal.svg b/integrations/fastly/assets/horizontal.svg deleted file mode 100644 index ab886ee0..00000000 --- a/integrations/fastly/assets/horizontal.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - diff --git a/integrations/fastly/assets/square.svg b/integrations/fastly/assets/square.svg deleted file mode 100644 index ef542f9f..00000000 --- a/integrations/fastly/assets/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/fastly/manifest.json b/integrations/fastly/manifest.json deleted file mode 100644 index cbc61e23..00000000 --- a/integrations/fastly/manifest.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "name": "Fastly", - "version": "1.0.0", - "overview": "Evaluate LaunchDarkly feature flags in Fastly's Compute@Edge offering.", - "description": "Evaluate LaunchDarkly feature flags in Fastly's Compute@Edge offering by storing flag rules in Fastly's edge dictionary.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://www.fastly.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/fastly", - "privacyPolicy": "https://www.fastly.com/privacy/" - }, - "categories": ["infrastructure"], - "icons": { - "square": "assets/square.svg", - "horizontal": "assets/horizontal.svg" - }, - "formVariables": [ - { - "key": "apiKey", - "name": "Fastly API key", - "type": "string", - "description": "Enter your Fastly API key.", - "isSecret": true - } - ], - "capabilities": { - "auditLogEventsHook": { - "endpoint": { - "url": "http://example.com/path/to/nowhere", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "FASTLY-API-KEY", - "value": "api-key-would-go-here" - } - ] - }, - "templates": { - "default": "templates/default.json.hbs" - }, - "defaultPolicy": [ - { - "effect": "allow", - "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] - } - ] - } - } -} diff --git a/integrations/fastly/templates/default.json.hbs b/integrations/fastly/templates/default.json.hbs deleted file mode 100644 index 2c63c085..00000000 --- a/integrations/fastly/templates/default.json.hbs +++ /dev/null @@ -1,2 +0,0 @@ -{ -} From 61d8c9c0fd83d4d6cb8ea90d61f17dd13c53c626 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 29 Aug 2023 13:29:53 -0400 Subject: [PATCH 724/936] merge public to private to release rudderstack for EAP --- .../rudderstack/assets/horizontal.svg | 14 ++++++++ integrations/rudderstack/assets/square.svg | 4 +++ integrations/rudderstack/manifest.json | 35 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 integrations/rudderstack/assets/horizontal.svg create mode 100644 integrations/rudderstack/assets/square.svg create mode 100644 integrations/rudderstack/manifest.json diff --git a/integrations/rudderstack/assets/horizontal.svg b/integrations/rudderstack/assets/horizontal.svg new file mode 100644 index 00000000..edd1595d --- /dev/null +++ b/integrations/rudderstack/assets/horizontal.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/integrations/rudderstack/assets/square.svg b/integrations/rudderstack/assets/square.svg new file mode 100644 index 00000000..6c0d406f --- /dev/null +++ b/integrations/rudderstack/assets/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/rudderstack/manifest.json b/integrations/rudderstack/manifest.json new file mode 100644 index 00000000..91675531 --- /dev/null +++ b/integrations/rudderstack/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "RudderStack", + "version": "1.0.0", + "overview": "Sync RudderStack Audiences to LaunchDarkly Big Segments.", + "description": "Sync RudderStack audiences to LaunchDarkly Big Segments to more efficiently target and deliver feature flags.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.rudderstack.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/contexts/synced-segments", + "supportWebsite": "https://www.rudderstack.com/docs/destinations/streaming-destinations/launchdarkly-audience/", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["synced-segments"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/environmentId", + "contextKindPath": "/contextKind", + "cohortIdPath": "/cohortId", + "cohortNamePath": "/cohortName", + "cohortUrlPath": "/cohortUrl", + "addMemberArrayPath": "/listData/add", + "removeMemberArrayPath": "/listData/remove", + "memberArrayParser": { + "memberIdPath": "/id" + } + } + } + } +} From 083e68a5471d363be67c983845476fa0a42c40b8 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 7 Sep 2023 18:58:52 +0100 Subject: [PATCH 725/936] Backmerge public to pick up new Rudderstack logo (#489) * Releasing changes publicly * Bump path-parse from 1.0.6 to 1.0.7 Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump ws from 7.4.2 to 7.5.3 Bumps [ws](https://github.com/websockets/ws) from 7.4.2 to 7.5.3. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.2...7.5.3) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] * Releasing changes publicly * Releasing changes publically (#9) * Releasing changes publicly * Bump url-parse from 1.5.3 to 1.5.8 (#12) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.8. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.8) --- updated-dependencies: - dependency-name: url-parse dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Releasing changes publicly * Adding Atlassian Compass to LD integrations page (#16) * Adding Atlassian Compass to LD integrations page * Update integrations/compass/assets/images/horizontal.svg Co-authored-by: Henry Barrow * Update integrations/compass/assets/images/square.svg Co-authored-by: Henry Barrow Co-authored-by: Matt Dellandrea <9593724+mdellandrea@users.noreply.github.com> Co-authored-by: Henry Barrow * Fix schema from bad merge (#17) * Imiller/ch78837/update some categories (#130) * add missing categories messaging, code-references, log-management, issue-tracking, analytics * update msteams * update honeycomb, logdna, dynatrace * update appoptics, datadog, grafana * update new relic, signalfx, splunk * update appdynamics and jira * update circleci, heap, pendo * update gitlab and trello * update git and slack app * update bitbucket pipes (not pipelines/flags) and github * Imiller/ch78837/remove unused categories (#131) * remove unused from sample-integration * remove from base schema & manifest schema * Update s3 buckets in circle config (#132) * Add validation template (#135) * coderefs copy changes (#138) * coderefs copy changes * update icon * cleanup * Update manifest.json * Update git integration name to "Code references" (#139) * update coderefs integration title * remove yarn.lock * Imiller/ch69350/audit appdynamics template and manifest (#65) * Resolve merge conflict (#141) * Promoting from prod to catfood (#114) * Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru * Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Deploy to prod (#110) * Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Henry Barrow Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Promote staging to production (#119) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Isabelle Miller * Deploy Catfood from production (#121) * Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru * Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * Deploy to prod (#110) * better logdna link (#112) * Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates * Promote staging to production (#119) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Promoting from stg to prod (#127) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Henry Barrow Co-authored-by: Isabelle Miller * Deploy new relic to prod (#129) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add more detail to new relic template (#126) Co-authored-by: Henry Barrow Co-authored-by: Isabelle Miller * Promote staging -> prod (#133) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add more detail to new relic template (#126) * Imiller/ch74105/add member details to existing integrations (#89) * update msteams default template * add user data to dynatrace payload * add instructions for testing signalfx * add user data to signalfx template * remove entire comment field if no comment * make user link to mailto instead of user payload * fix trailing comma Co-Authored-By: Henry Barrow * remove superfluous space Co-Authored-By: Henry Barrow * move comma to inside if to fix invalid json * fix trailing whitespace * move trailing commas to inside handlebars ifs * add if around name for in case it's not set * add user data to splunk payload * only display comment field if there is a comment * revert msteams default template to original * signalfx - separate user and user email into two fields * splunk - separate user and user email into separate fields * update spacing Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * separate dynatrace user into name and email Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update spacing on splunk Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * remove lingering parentheses * don't display user name if both don't exist * fix capitalization * add missing space * add missing space Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * Imiller/ch78837/update some categories (#130) * add missing categories messaging, code-references, log-management, issue-tracking, analytics * update msteams * update honeycomb, logdna, dynatrace * update appoptics, datadog, grafana * update new relic, signalfx, splunk * update appdynamics and jira * update circleci, heap, pendo * update gitlab and trello * update git and slack app * update bitbucket pipes (not pipelines/flags) and github * Imiller/ch78837/remove unused categories (#131) * remove unused from sample-integration * remove from base schema & manifest schema * Update s3 buckets in circle config (#132) Co-authored-by: Isabelle Miller Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * Deploy prod (#136) Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Henry Barrow Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * renamed coderefs folder to git * delete coderefs folder * Add new capability to manifest schema (#146) * Added OAuth tidbit (#147) * Added OAuth tidbit * Added missing period. * Copy *.svgs to static.launchdarkly.com (#148) * Rename remote update to trigger (#149) * Rename remote update -> trigger * Update title * Update docs * Update docs/capabilities.md Co-authored-by: Isabelle Miller Co-authored-by: Isabelle Miller * Testing Azure Event Hub integration * Requested changes * Requested changes * Update heap url (#154) * Change New Relic integration to use their deployment api (#153) * adding code snippets and validation template info to docs (#155) * Bump lodash from 4.17.15 to 4.17.19 (#158) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fixed name of integration (from azure-event-hub to azure-event-hubs) * Added integration icon * Remove validation templates from integrations with configurable hosts (#160) * Remove MSteams validation (#163) * Re-enable validation template for configurable host integrations (#165) * Imiller/ch83288/add trigger to datadog manifest (#168) * add trigger capability to datadog manifest * add parser * add note to docs about payload * Imiller/ch83287/add trigger to honeycomb manifest (#169) * add trigger to honeycomb + update readme * add sample payload * add some more detail to datadog readme * add parser * remove value from parser * switch out launchdarkly for team name var * Revert "switch out launchdarkly for team name var" This reverts commit 91cdffd4cd10f84876fdebd1388e033a5dde642f. * Revert "remove value from parser" This reverts commit 002deab54ed53d416c5379da916de07a4d0c6f67. * update link to integrations center and remove value from parser (#170) * Update event-hub integration link * Fix broken trigger doc link (#172) * Minor trigger doc update (#173) * Imiller/ch84138/use goaltender parsers when handling inbound (#174) * rename parser paths * rename external condition parser * split trigger parser out into separate parser schema file * remove redundant id paths * Revert "remove redundant id paths" This reverts commit c8c0e7c6a7653c06a03315836f807a5a1fed0cdd. * Revert "split trigger parser out into separate parser schema file" This reverts commit bc3adb0c1a1f0c4e278b9e7a11c21ae38868eb9b. * Revert "rename external condition parser" This reverts commit 7a5dcdbd876c2fbba14f4bd66d7777b6deb1c55d. * Revert "rename parser paths" This reverts commit c131dca2fb0760a1bf32205377a1d749597a896a. * rename trigger parser from 'parser' to 'trigger-parser' * oops make it trigger parser, not trigger body parser * Use the COMMIT_MSG var (#175) * Add support for generic trigger (#176) * Add generic trigger * Update description and logo * Remove templates * Add readme * Change name to Generic (#178) * Update README to call out "trigger" auto-append (#179) * Update README * grammar * Require isOptional = true when defaultValue is used (#181) * Make datadog host optional * Use isOptional wherever defaultValue is used and add test lock this change in * update docs * use org-global for deploy-to-s3 jobs (#182) * Update bucket names in circle config (#184) * clean up circle config * Update datadog trigger parser and readme (#183) * [ch87329] Add automatic clubhouse ticketeting for private repo (#185) * Add generic trigger icon (#186) * [ch87329] Fix clubhouse link (#187) * [ch87972] updated trigger urls and descriptions (#188) * [ch87971] Add new eventName field and default value (#190) * Add new eventName field and default value * Add deprecation warning * Add eventName to all triggers * Fix generic template parser paths (#191) * readme update for generic triggers (#189) * adding some periods (#194) * Bump yargs-parser from 18.1.1 to 18.1.3 (#197) Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 18.1.1 to 18.1.3. - [Release notes](https://github.com/yargs/yargs-parser/releases) - [Changelog](https://github.com/yargs/yargs-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/yargs-parser/compare/v18.1.1...v18.1.3) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [ch83496] Upload archive of manifests to artifacts bucket instead of directy copying to deploy buckets (#198) * Send webhook to spinnaker when build is done (#199) * [ch83496] auto deploy staging pt 2 (#200) * Add Azure Active Directory docs link (#201) * [ch90065] add trigger capability to signalfx (#203) * add trigger capability * add signalfx webhook doc link to readme * [ch91335] remove deprecated alertName trigger parser field (#205) * add triggers capability * eventName and alertName should be the same * chagne event_type to condition_name * remove alertName * update doc link * update capabilities.md to use eventName instead of alertName * remove alertName from all integration manifests * remove alertName from schemas * remove trigger capability from new relic manifest since it should be on a different pr * [ch90570] add testEventNameRegexp field to schema (#206) * add testEventNameRegexp field to schema * add note to doc * add testEventNameRegexp to propertyNames list * [ch90823] add triggers capability (#204) * add triggers capability * eventName and alertName should be the same * chagne event_type to condition_name * remove alertName * update doc link * update name and description" * update overview as well * make exact match Co-authored-by: Henry Barrow * remove triggers from overview and description Co-authored-by: Henry Barrow * [ch90064] add trigger capability to dynatrace manifest (#202) * add trigger * add dynatrace doc link to readme * change parser fields to match datadog * add testEventNameRegexp * [ch92301] add test event to datadog trigger (#207) * add test event regex for datadog * update honeycomb manifest for tests * remove test events & change eventName back * Default is not an accepted value (#208) * [ch78771] update templates to use new displayName field (#209) * add displayName to sample context * update dynatrace flag template * add displayName to all flag sample contexts * add displayName to env sample contexts * add displayName to other sample xontexts * add displayName to project sample contexts * update elastic template * update logdna template * update new relic template (including deprecated just for kicks) * update signalfx template * update splunk template * [ch94760] Save junit tests on Circle (#210) * Use pinned node orb * use junit and save results * [ch95983] add dynamicEnum formVariable type field (#212) * add displayName to sample context * update dynatrace flag template * add displayName to all flag sample contexts * add displayName to env sample contexts * add displayName to other sample xontexts * add displayName to project sample contexts * update elastic template * update logdna template * update new relic template (including deprecated just for kicks) * update signalfx template * update splunk template * add dynamicEnum to formVariables type definition * add sample dropdownOptions field of dynamicEnum type * refactor endpoint out of auditLogEventsHook for general use across capabilities * add parser to dynamicOptions schema * refactor endpoints * add test to check dynamicEnum has dynamicOptions and vice versa * [ch95983] Add reqres API endpoint to sample-integration manifest (#213) * Add reqres API endpoint to sample-integration manifest * make sure dynamic enum is passed to context in preview and tests * Add color as query param * [ch95892] Goaltender info for Tray (tray.io) (#211) * [ch95983] refactor reusable components out of schema (#214) * refactor documentation url out of trigger * replace external condition endpoint with generic * factor out the subparts of the reusable endpoint to allow for description flexibility * replace external condition endpoint properties * refactor endpointProperties * refactor out capability parsers into parser file * Add string type to endpoint method and make it required (#215) * Remove oauth from sample-integration (#216) * Move formVariable items to definitions.json (#217) * [ch95986] Add approval capability schema (#218) * Move formVariable items to definitions.json * Add approval capability * Remove periods in description * generate typescript type definitions from schema JSON * fix indentation * [ch97425] Add first draft of ServiceNow manifest (#220) * Add first draft of servicenow manifest * Bump jest version to remove vulnerability warning * Ensure defualt values are provided when formVariable is optional (#221) * Imiller/ch98557/update approvalParser schema to have approvalId (#222) * add approvalId to approval parser * add approvalId to propertyNames * best guess at servicenow approvalId path * pull package-lock.json over from master * Add short description query param to creation template to verify everything is working (#223) * add urlTemplate to approvalparser (#224) * add deletionRequest * update servicenow status endpoint (#225) * Use Implementing state as Servicenow approval condition (#226) * [ch98744] Add justification to servicenow manifest (#227) * Add justification * Add url template * Add Servicenow svgs (#228) * [ch100894] add new memberListRequest to approvals schema (#229) * add member list request and new member list parser to approvals schema * forgot to add memberListRequest to property list * actually probably want this to be required * add servicenow memberListRequest * make not required for now so it doesn't break all the goaltender tests * oops forgot leading slash * change user to member * update snow manifest * well that was a bug * missed some members * missed some more * update descriptions * how many typos can i make in a day * fix typo (#230) * Imiller/ch97553/make MemberListRequest required (#231) * fix typo * make required * Make deletion request required (#232) * [ch101451] Add postApplyRequest and add parser to deletionRequest (#233) * Add postApplyRequest to schema and add parser to deletionRequest * Make parsers required and move memberListRequest up * [ch101677] add requested_by to SNow creation requests (#234) * it turns out it's user_name, not sys_id, that we wanted * add requested_by to creation request * pass member id from context Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow * Add link to LD approval request to ServiceNow change request (#235) * Minor vscode card updates (#237) * Fix externalMemberId bug (#239) * Reject approval requests when change request is in state 4 (#238) * Improve servicenow description and sentance case environment form variable name (#240) * [ch102661] Improve serveral horizontal icons (#241) * Route staging deploys through Thumb Seeker (#242) * add IntelliJ card (#236) * [ch103605] remove external condition (#243) * remove external condition * remove tests * [ch103708] add otherCapabilities array to phase out legacy kind (#244) * replace legacy with externalCapabilities * everything at once for pre commits * add sso and ide capabilities * categorize sso and ide integrations * add legacy back in + external and externalEnterprise capabilities * remove slackWebhooks from externalCapabilities * add legacy back in to manifests * add test to enforce at least one capability * remove externalEnterprise * change external to other * add minItems to enforce * Adding a better link for the pendo integration (#245) * Add basicAuthHeaderValue helper documentation and example (#246) * Add JSON body template string to all approval requests (#247) * Add horizontal appoptics logo (#248) * Update sample context to include 'simple' timestamp format (#249) * [ch105018] Use JSON body for ServiceNow creation request and set start and end dates (#250) * Use jsonBody for request * Include start and end date in creation request * bump handlebars package due to vulnerability (#253) * Bump hosted-git-info from 2.8.8 to 2.8.9 (#254) * bump lodash (#256) * [ch105018] Add ServiceNow C0 manifest (#251) * Use jsonBody for request * Update servicenow-c0 manifest * Bump ws from 7.4.2 to 7.4.6 (#257) Bumps [ws](https://github.com/websockets/ws) from 7.4.2 to 7.4.6. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.2...7.4.6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Henry Barrow * [ch105018] Update servicenow-c0 creation request path (#258) * Update servicenow-c0 creation request path * fix creation request url * Temporarily use plaintext password for servicenow-c0 manifest (#259) * Update servicenow-c0 urlTemplate based on provided information (#260) * [ch105018] Update servicenow-c0 creation request based on feedback (#262) * Update servicenow-c0 to use isSecret for password * Update servicenow-c0 creation request based on feedback * Add formatWithOffset helper (#263) * Include timestamp offset in servicenow-c0 and add additional required field (#264) * [ch111110] Use nvmrc file and node v14 (#266) * Use nvmrc file and node v14 * Update docs * [ch111068] fake akamai integration (#265) * Added zendesk goaltender card * Removed unused license file for zendesk * Update integrations/zendesk/manifest.json nice, looks good to me Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * [ch110701] Utilize reserved custom properties for servicenow-c0 manifest" (#268) * start using custom properties in servicenow-c0 manifest * remove environment form variables * servicenow-c0 ensure end_date is after start_date (#269) * fake fastly integration (#270) * Update servicenow-c0 to use custom properties in postApply and deletion requests (#271) * Descrease timestamp offset (#272) * Added description to reserved custom properties and updated datadog reserved custom property to have description * Updated sample reserved custom property in docs * [ch113600] Update servicenow-c0 description, short_desription, start_date, and end_date (#274) * Update servicenow-c0 description, short_desription, start_date, and end_date * Use double brackets when possible * Add leading \n to serivenow-c0 justification (#275) * [ch110172] Add flag form variables to manifest schema (#276) * Add flag form variables to manifest schema * Fix grammar * Bump path-parse from 1.0.6 to 1.0.7 (#277) Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [ch109967] Add flagFormVariables to servicenow-c0 manifest (#279) * Add flagFormVariables to servicenow-c0 manifest * Add userID to postApply and deletion requests * Add emailLocalPart to all sample context (#280) * Updating heap and pendo doc URLs (#278) * Update servicenow-c0 manifest to use emailLocalPart as serviceNow username (#281) * Reduce start and end date offest for servicenow-c0 (#283) * Use git gatsby tray docs link (#282) * Remove state parameter form servicenow-c0 creation request (#285) * Updating ansible docs link (#284) * [ch120153] Add support for new feature store capability (#286) * add new manifest for featureStore and cloudflare * fixing typo * update svg, update description * run prettier * removing period * fix newline * fixing whitespace, removing placeholders * Added includeErrorResponseBody property in autiLogEventHook capability * Fixed typo * [ch122281] Only include error response body for integrations that do not have customizable domains (#288) * Whitelist including error response body for integrations that do not have customizable domains * Remove feature from signalFX * Bump tmpl from 1.0.4 to 1.0.5 (#289) Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5. - [Release notes](https://github.com/daaku/nodejs-tmpl/releases) - [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5) --- updated-dependencies: - dependency-name: tmpl dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add cache control headers to integrations svgs (#290) * Remove unused copy_to_s3.sh (#291) * [sc-123860] Clubouse GH action -> Shortcut (#292) * Clubouse GH action -> Shortcut * Update name of action * [sc-122283] add test to check domain is static when includeErrorResponseBody is set to true (#293) * this should work * account for dynamic subdomains * check for multiple substrings in hostname * [sc-124497] add connector ui blocks to prelim capability schema (#294) * add connector ui blocks to prelim capability schema * forgot to commit parser * update description * forgot to actually add to base.json (#295) * a few small edits (#296) * forgot brace * some updates * naming updates and add new types (#297) * small updates for cloudflare * updating doc links (#299) * [sc-128309] Update labels for Clouflare KV ID form field (#300) Also adds missing periods to description text. * [sc-126368] add external references to slack-app (#301) * remove lingering redundant parser property from externalReferences * update metadata block paths and add hyperlink type * Added definitions and schema for UI block and elements for external flag refs capability * Updated with PR feedback and replaced timestamp type with isTimestamp boolean boolean * Made ui block text required and updated jira ui block template string * [sc-130013] add placeholders to cloudflare manifest (#303) Uses example values which are straight out of Cloudflare's own API docs See: https://api.cloudflare.com/ * Added UI blocks for slack app * Fixing slack context block timestamp defaulting to the 70s * [sc-129873] add eu data center option for new relic one integration (#308) * feat: add and use new formVariable * feat: integration working with new EU endpoint * docs: fix typo in readme * fix: fix existing US url * fix: fix existing US url * chore: Apply suggestions from code review Co-authored-by: Henry Barrow * fix: escape quotes in description * fix: remove includeErrorResponseBody as domain is not static anymore * feedback: account for existing integrations not having domain field Co-authored-by: Henry Barrow * chore: make things pretty Co-authored-by: Henry Barrow * [sc-132618] Upgrade node to v16 and resolve secuirty vulnerabilities (#309) * Upgrade node to v16 * Resolve security vulnerabilities * Add the option to change where default information is populated in ServiceNow (#310) * Renaming external refs to flag links * More renaming * Renamed link context -> flag link context * Update Cloudflare manifest * Update feature store capability schema * Initial integration for ld2git. * add template for webhook event. * Review comments. * adding general integration docs. * scoping out secret/token based on value set. * expose ld api token. * cleanup. * Fix description. Co-authored-by: Isabelle Miller * Fix secret description. Co-authored-by: Isabelle Miller * Update integrations/ld-to-git/manifest.json * Update integrations/ld-to-git/manifest.json * Escaping some flag link templates * Fix Cloudflare manifest JSON pointers * [sc-129419] First draft documentation for feature store capability (#313) * first draft feature store capability * removing ... * Update docs/capabilities.md Co-authored-by: Jaz White * swap sections * Apply suggestions from code review Co-authored-by: Molly * PR feedback * sample to example * Apply suggestions from code review Co-authored-by: Molly * Apply suggestions from code review Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Jaz White Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> * Add 5 minute offset to end date in servicenow creation request (#317) * Updated empty state text * Add all 6 Datadog sites to Datadog manifest (#319) * Updated flag link metadata schema to be an object instead of an array * Removed unused flag link metadata property for slack app * Replace slack manifest's flag link permalink metadata attribute with deeplink since they are both the same * Updated URLs for flag links docs * Updated Jira header text match Atlassian's branding * [sc-137630] remove parser for delivery request (#323) * [sc-137630] remove parser for delivery request * [sc-138928] add generic feature store integration manifest for testing (#324) Co-authored-by: Henry Barrow Co-authored-by: Carmen Quan Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> * Increase servicenow-c0 end_date offset to 5 mins (#325) * Increase servicenow-c0 start_date from 1s to 5s (#326) * Renaming references to master to be main * Rename master to main in bash script * Added Dynatrace cloud automation manifest for trigerring flag change events in LaunchDarkly from their cloud sequence * Updated the flag links capaibility verbiage to match the new design verbiage * Small text change * Bump url-parse from 1.5.3 to 1.5.9 (#332) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.9. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.9) --- updated-dependencies: - dependency-name: url-parse dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Removing date/time elements from the flag links ui blocks since these are no longer needed in the new design * request issue if user is not service owner * Updated context text for jira * Remove unnecessary line breaks (#336) * Remove unnecessary line breaks * Trim trailing whitespace * Remove flag link stub * [sc-143291] Add a hide member details checkbox to datadog integration (#333) * add hideMemberDetails formVariable * dont send memberName tag if hideMemberDetails is true * build title from titleVerb and targetName for project and env templates * default template sends nothing for member events with hideMemberDetails, and filters memberDetails for other events if required * fix tag generation in project and env templates * update logic in default template, add equalWithElse helper * [sc-145741] docs: copyedits and minor cleanup (#338) * docs: copyedits and minor cleanup * Apply suggestions from code review Co-authored-by: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> * Update docs/capabilities.md * Apply suggestions from code review: integrations team, not integration team Co-authored-by: Henry Barrow * remove mention of auth per discussion here: https://github.com/launchdarkly/integration-framework-private/pull/338/files#r828030266 * one more integration -> integrations team correction Co-authored-by: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Henry Barrow * Back merge public to pick up Compass tile (#342) Co-authored-by: Isabelle Miller Co-authored-by: Arnold Trakhtenberg Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich Co-authored-by: Rich Manalang Co-authored-by: Wei We Lu Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Blake Wilson Co-authored-by: Dan O'Brien Co-authored-by: Kevin Brackbill Co-authored-by: Ben Woskow Co-authored-by: Clifford Tawiah Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Co-authored-by: carmenquan Co-authored-by: Dan O'Brien Co-authored-by: Jaz White Co-authored-by: Fabian Co-authored-by: Christie Williams Co-authored-by: Mahek Chheda Co-authored-by: Mahek Chheda <86633378+mchheda-ld@users.noreply.github.com> Co-authored-by: Christie Williams Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Fabian * Releasing changes publicly * Releasing changes publicly * Releasing changes publicly (#18) * Releasing changes publicly (#19) * Bump minimatch from 3.0.4 to 3.1.2 (#20) Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2. - [Release notes](https://github.com/isaacs/minimatch/releases) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump decode-uri-component from 0.2.0 to 0.2.2 (#21) Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump json5 from 2.1.3 to 2.2.3 (#22) Bumps [json5](https://github.com/json5/json5) from 2.1.3 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.1.3...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: Add CloudQuery integration (#23) * feat: Add CloudQuery integration * Remove 'data' as per CR * Update integrations/cloudquery/manifest.json Co-authored-by: Dan O'Brien --------- Co-authored-by: Kemal Hadimli Co-authored-by: Dan O'Brien * Update CODEOWNERS with new PD org changes (#25) * Dob/roost (#26) * Releasing Roost.ai LaunchDarkly Integration * Changing support mail * Changing the square image * Preetier changes * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update manifest.json * Roost Commit * Deleting roost config files * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Added otherCapabilities in roost.ai manifest * lint fixes * lint fixes * lint fixes * lint fixes --------- Co-authored-by: Divyeshzb <60085094+Divyeshzb@users.noreply.github.com> Co-authored-by: roost-io * Releasing changes publicly (#27) * add census integration (#28) * add census integration * add capabilities field * add link to docs Co-authored-by: Dan O'Brien --------- Co-authored-by: Dan O'Brien * add ngrok integration (#29) * Adding Liquibase integration (#30) * Adding Liquibase integration * Adding Liquibase integration * Making requested changes * Dob/release fixes (#31) * lint fixes editorial feedback add editorconfig file * build fixes * manifest for okteto integration (#33) * manifest for okteto integration * Apply suggestions from code review Co-authored-by: Dan O'Brien * Add link to launchdarklyDocs --------- Co-authored-by: Dan O'Brien * sprig integration page (#34) * sprig integration page * new line * fix lint build * fix integration test * update privacy policy * Resmo LaunchDarkly Integration (#35) * implements Resmo's LaunchDarkly integration docs * refactorings * adds other capabilities as external * adds horizontal logo * changes overview text * Update integrations/resmo/manifest.json Co-authored-by: Dan O'Brien --------- Co-authored-by: Dan O'Brien * adding ctrlstack integration manifest (#36) * adding ctrlstack integration manifest * update ctrlstack manifest details and categories * Add Snowplow LaunchDarkly integration (#37) * Add Snowplow LaunchDarkly integration * Address review comments * Releasing changes publicly (#39) * Releasing changes publicly (#41) * add Tealium inbound events integration card (#46) * add Tealium inbound events integration card * prettier fix * Added manifest for Osano (#45) * adding FullStory integration card (#48) * adding FullStory integration card * shorten description * remove evaluation revert description * Releasing changes publicly (#49) * Releasing changes publicly * Rebuild schema * Fix prettier * Run pre-commit * feat: add RudderStack LaunchDarkly Integration (#50) * feat: add RudderStack LaunchDarkly Integration * chore: used prettier * chore: update description Co-authored-by: Henry Barrow --------- Co-authored-by: Henry Barrow * feat: update RudderStack horizontal svg (#51) --------- Signed-off-by: dependabot[bot] Co-authored-by: Ben Woskow Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: parrishioner Co-authored-by: Matt Dellandrea <9593724+mdellandrea@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Arnold Trakhtenberg Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich Co-authored-by: Rich Manalang Co-authored-by: Wei We Lu Co-authored-by: Blake Wilson Co-authored-by: Dan O'Brien Co-authored-by: Kevin Brackbill Co-authored-by: Clifford Tawiah Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Co-authored-by: carmenquan Co-authored-by: Dan O'Brien Co-authored-by: Jaz White Co-authored-by: Fabian Co-authored-by: Christie Williams Co-authored-by: Mahek Chheda Co-authored-by: Mahek Chheda <86633378+mchheda-ld@users.noreply.github.com> Co-authored-by: Christie Williams Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Fabian Co-authored-by: Kemal <223029+disq@users.noreply.github.com> Co-authored-by: Kemal Hadimli Co-authored-by: Alex Smolen Co-authored-by: Divyeshzb <60085094+Divyeshzb@users.noreply.github.com> Co-authored-by: roost-io Co-authored-by: Nick Carchedi Co-authored-by: Niji Co-authored-by: Robert Reeves Co-authored-by: Ramiro Berrelleza Co-authored-by: Cindy Nguyen Co-authored-by: Korhan Keser <48186697+shuetisha@users.noreply.github.com> Co-authored-by: jj-ctrlstack <128837927+jj-ctrlstack@users.noreply.github.com> Co-authored-by: adatzer Co-authored-by: Clayton Surfus Co-authored-by: Gauravudia <60897972+Gauravudia@users.noreply.github.com> --- .../rudderstack/assets/horizontal.svg | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/integrations/rudderstack/assets/horizontal.svg b/integrations/rudderstack/assets/horizontal.svg index edd1595d..90075fe1 100644 --- a/integrations/rudderstack/assets/horizontal.svg +++ b/integrations/rudderstack/assets/horizontal.svg @@ -1,14 +1,14 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + From 16b81f05cc78ed0b0941f9ace52d4cb1de7428e1 Mon Sep 17 00:00:00 2001 From: Molly Date: Wed, 13 Sep 2023 08:01:12 -0700 Subject: [PATCH 726/936] update launchdarklyDocs in manifests for synced segments (#490) --- integrations/amplitude/manifest.json | 2 +- integrations/segment-audiences/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/amplitude/manifest.json b/integrations/amplitude/manifest.json index 734fb27e..eddb1f82 100644 --- a/integrations/amplitude/manifest.json +++ b/integrations/amplitude/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.amplitude.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/contexts/synced-segments", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/amplitude", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, "categories": ["synced-segments"], diff --git a/integrations/segment-audiences/manifest.json b/integrations/segment-audiences/manifest.json index c31e0244..4becbf5e 100644 --- a/integrations/segment-audiences/manifest.json +++ b/integrations/segment-audiences/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://segment.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/partner-integrations/synced-segments", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/segment", "supportWebsite": "https://segment.com/docs/connections/sources/catalog/cloud-apps/launchdarkly-audiences/", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, From 0196feb119df5e59cc56b6af6ffc3b49673eff33 Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Thu, 14 Sep 2023 10:37:33 -0700 Subject: [PATCH 727/936] [SC-216614] Update synced-segment manifests to include cohortId per member When validating that all users in a batch are coming from the same cohort, we parse the cohortId from the top-level `cohortIdPath` if a `cohortIdPath` is not provided in the `memberParser` for synced segments. Using the top level path applies the same cohortId to all members, which can result in incorrect data if the members are in fact from different cohorts. This updates the integration manifests that define synced-segments to include a `cohortIdPath` and `cohortNamePath` in the `memberParser` so that cohorts can be validated for all members. --- integrations/amplitude/manifest.json | 4 +++- integrations/segment-audiences/manifest.json | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/integrations/amplitude/manifest.json b/integrations/amplitude/manifest.json index eddb1f82..ac4e41cb 100644 --- a/integrations/amplitude/manifest.json +++ b/integrations/amplitude/manifest.json @@ -26,7 +26,9 @@ "memberArrayPath": "/batch", "memberArrayParser": { "memberIdPath": "/userId", - "booleanMembershipPath": "/value" + "booleanMembershipPath": "/value", + "cohortIdPath": "/cohortId", + "cohortNamePath": "/cohortName" } } } diff --git a/integrations/segment-audiences/manifest.json b/integrations/segment-audiences/manifest.json index 4becbf5e..d6583011 100644 --- a/integrations/segment-audiences/manifest.json +++ b/integrations/segment-audiences/manifest.json @@ -26,7 +26,9 @@ "memberArrayPath": "/batch", "memberArrayParser": { "memberIdPath": "/userId", - "booleanMembershipPath": "/value" + "booleanMembershipPath": "/value", + "cohortIdPath": "/cohortId", + "cohortNamePath": "/cohortName" } } } From 061f6ed023750087af1de0c46258e601156649eb Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 15 Sep 2023 12:46:08 -0500 Subject: [PATCH 728/936] Fixed synced segment add member and remove member array requirements in validation server --- server/src/capabilities/syncedSegment.ts | 26 +++++++++++++----------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/server/src/capabilities/syncedSegment.ts b/server/src/capabilities/syncedSegment.ts index 51325585..0c9d3c99 100644 --- a/server/src/capabilities/syncedSegment.ts +++ b/server/src/capabilities/syncedSegment.ts @@ -254,12 +254,13 @@ const parseSyncSegmentRequest = async ( if (parser.addMemberArrayPath) { // this is only required if removeMemberArrayPath is specified - const memberArray = getFieldValue( - body, - parser.addMemberArrayPath, - !!parser.removeMemberArrayPath, - 'addMemberArrayPath' - ); + const memberArray = + getFieldValue( + body, + parser.addMemberArrayPath, + false, + 'addMemberArrayPath' + ) ?? []; const memberArrayBatch = parseBatchArray({ memberArray, parser, @@ -273,12 +274,13 @@ const parseSyncSegmentRequest = async ( if (parser.removeMemberArrayPath) { // this is only required if addMemberArrayPath is specified - const memberArray = getFieldValue( - body, - parser.removeMemberArrayPath, - !!parser.addMemberArrayPath, - 'removeMemberArrayPath' - ); + const memberArray = + getFieldValue( + body, + parser.removeMemberArrayPath, + false, + 'removeMemberArrayPath' + ) ?? []; const memberArrayBatch = parseBatchArray({ memberArray, parser, From 5803adb906c14472c6dfcf4e6e56e2eb4c03e6d8 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 15 Sep 2023 12:48:30 -0500 Subject: [PATCH 729/936] Removed unneeded comment --- server/src/capabilities/syncedSegment.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/src/capabilities/syncedSegment.ts b/server/src/capabilities/syncedSegment.ts index 0c9d3c99..9470f272 100644 --- a/server/src/capabilities/syncedSegment.ts +++ b/server/src/capabilities/syncedSegment.ts @@ -253,7 +253,6 @@ const parseSyncSegmentRequest = async ( } if (parser.addMemberArrayPath) { - // this is only required if removeMemberArrayPath is specified const memberArray = getFieldValue( body, @@ -273,7 +272,6 @@ const parseSyncSegmentRequest = async ( } if (parser.removeMemberArrayPath) { - // this is only required if addMemberArrayPath is specified const memberArray = getFieldValue( body, From f97c7ec8ee80096a182c5a6a17da1467bfdb12da Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 25 Sep 2023 15:37:30 +0200 Subject: [PATCH 730/936] [sc-218322] add big segment store capability to integration schema (#493) * stub capability * this somehow did not get committed * add trailing whitespace * now it works * remove formVariables from capability --- manifest.schema.d.ts | 12 ++++++++++ manifest.schema.json | 29 ++++++++++++++++++++++- schemas/base.json | 6 ++++- schemas/capabilities/bigSegmentStore.json | 22 +++++++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 schemas/capabilities/bigSegmentStore.json diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 880a8732..464f1655 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -632,6 +632,10 @@ export type CohortNamePath1 = string; * JSON pointer to the cohort id. Overrides the cohort id for a single member */ export type CohortIdPath1 = string; +/** + * Describes what type of database LaunchDarkly will sync big segments to + */ +export type DatabaseStyle = "redis" | "dynamoDB"; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -764,6 +768,7 @@ export interface Capabilities { externalConfigurationURL?: ExternalConfigurationURL; externalConfigurationPages?: ExternalConfigurationPages; syncedSegment?: SyncedSegment; + bigSegmentStore?: BigSegmentStore; [k: string]: unknown; } /** @@ -1061,3 +1066,10 @@ export interface MemberArrayParser { cohortIdPath?: CohortIdPath1; [k: string]: unknown; } +/** + * This capability allows LaunchDarkly to sync big segment data directly to a user-managed database + */ +export interface BigSegmentStore { + dbStyle: DatabaseStyle; + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index af64bcf5..82eeb432 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -689,7 +689,8 @@ "hideConfiguration", "externalConfigurationURL", "externalConfigurationPages", - "syncedSegment" + "syncedSegment", + "bigSegmentStore" ] }, "properties": { @@ -4248,6 +4249,32 @@ } } } + }, + "bigSegmentStore": { + "$id": "#/properties/capability/big-segment-store", + "title": "Big segment store", + "description": "This capability allows LaunchDarkly to sync big segment data directly to a user-managed database", + "type": "object", + "propertyNames": { + "enum": [ + "dbStyle" + ] + }, + "required": [ + "dbStyle" + ], + "properties": { + "dbStyle": { + "$id": "#/properties/database-style", + "title": "Database style", + "type": "string", + "enum": [ + "redis", + "dynamoDB" + ], + "description": "Describes what type of database LaunchDarkly will sync big segments to" + } + } } } }, diff --git a/schemas/base.json b/schemas/base.json index 56b83e1b..db483f32 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -262,7 +262,8 @@ "hideConfiguration", "externalConfigurationURL", "externalConfigurationPages", - "syncedSegment" + "syncedSegment", + "bigSegmentStore" ] }, "properties": { @@ -295,6 +296,9 @@ }, "syncedSegment": { "$ref": "schemas/capabilities/syncedSegment.json#/syncedSegment" + }, + "bigSegmentStore": { + "$ref": "schemas/capabilities/bigSegmentStore.json#/bigSegmentStore" } } }, diff --git a/schemas/capabilities/bigSegmentStore.json b/schemas/capabilities/bigSegmentStore.json new file mode 100644 index 00000000..ab726c43 --- /dev/null +++ b/schemas/capabilities/bigSegmentStore.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "bigSegmentStore": { + "$id": "#/properties/capability/big-segment-store", + "title": "Big segment store", + "description": "This capability allows LaunchDarkly to sync big segment data directly to a user-managed database", + "type": "object", + "propertyNames": { + "enum": ["dbStyle"] + }, + "required": ["dbStyle"], + "properties": { + "dbStyle": { + "$id": "#/properties/database-style", + "title": "Database style", + "type": "string", + "enum": ["redis", "dynamoDB"], + "description": "Describes what type of database LaunchDarkly will sync big segments to" + } + } + } +} From b3ec29bf956cf652d60eb9f743f902975c2bcc8a Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Mon, 25 Sep 2023 16:20:45 -0400 Subject: [PATCH 731/936] adding public synced segment integrations --- .../heap-inbound/assets/horizontal.svg | 11 ++ integrations/heap-inbound/assets/square.svg | 6 + integrations/heap-inbound/manifest.json | 34 ++++++ integrations/hightouch/assets/horizontal.svg | 109 ++++++++++++++++++ integrations/hightouch/assets/square.svg | 19 +++ integrations/hightouch/manifest.json | 36 ++++++ .../rudderstack/assets/horizontal.svg | 14 +++ integrations/rudderstack/assets/square.svg | 4 + integrations/rudderstack/manifest.json | 35 ++++++ 9 files changed, 268 insertions(+) create mode 100644 integrations/heap-inbound/assets/horizontal.svg create mode 100644 integrations/heap-inbound/assets/square.svg create mode 100644 integrations/heap-inbound/manifest.json create mode 100644 integrations/hightouch/assets/horizontal.svg create mode 100644 integrations/hightouch/assets/square.svg create mode 100644 integrations/hightouch/manifest.json create mode 100644 integrations/rudderstack/assets/horizontal.svg create mode 100644 integrations/rudderstack/assets/square.svg create mode 100644 integrations/rudderstack/manifest.json diff --git a/integrations/heap-inbound/assets/horizontal.svg b/integrations/heap-inbound/assets/horizontal.svg new file mode 100644 index 00000000..9bc59e19 --- /dev/null +++ b/integrations/heap-inbound/assets/horizontal.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/integrations/heap-inbound/assets/square.svg b/integrations/heap-inbound/assets/square.svg new file mode 100644 index 00000000..68b1fdf5 --- /dev/null +++ b/integrations/heap-inbound/assets/square.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/integrations/heap-inbound/manifest.json b/integrations/heap-inbound/manifest.json new file mode 100644 index 00000000..04472691 --- /dev/null +++ b/integrations/heap-inbound/manifest.json @@ -0,0 +1,34 @@ +{ + "name": "Heap Segments", + "version": "1.0.0", + "overview": "Sync Heap user segments to LaunchDarkly.", + "description": "Segment syncing lets you import Users from Heap to LaunchDarkly to more efficiently target and deliver features.", + "author": "Heap", + "supportEmail": "support@heap.io", + "links": { + "site": "https://www.heap.io/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/heap-inbound", + "privacyPolicy": "https://www.heap.io/privacy" + }, + "categories": ["synced-segments"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "otherCapabilities": ["external"], + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/parameters/environment_id", + "cohortIdPath": "/heap/data/segment/id", + "cohortNamePath": "/heap/data/segment/name", + "addMemberArrayPath": "/heap/data/add", + "removeMemberArrayPath": "/heap/data/remove", + "memberArrayParser": { + "memberIdPath": "/id" + } + }, + "jsonResponseBody": "{ \"projectId\": \"{{projectKey}}\", \"environmentId\": \"{{environmentKey}}\", \"segmentId\": \"{{segmentKey}}\", \"segmentUrl\": \"{{segmentUrl}}\", {{#if errorMessage}}\"status\":\"failure\", \"error\": {\"message\": \"{{{errorMessage}}}\", \"code\": {{statusCode}} }{{else}}\"status\": \"success\"{{/if}} }" + } + } +} diff --git a/integrations/hightouch/assets/horizontal.svg b/integrations/hightouch/assets/horizontal.svg new file mode 100644 index 00000000..cdf6aacf --- /dev/null +++ b/integrations/hightouch/assets/horizontal.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/hightouch/assets/square.svg b/integrations/hightouch/assets/square.svg new file mode 100644 index 00000000..2542e2ea --- /dev/null +++ b/integrations/hightouch/assets/square.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + diff --git a/integrations/hightouch/manifest.json b/integrations/hightouch/manifest.json new file mode 100644 index 00000000..7cc6ec5c --- /dev/null +++ b/integrations/hightouch/manifest.json @@ -0,0 +1,36 @@ +{ + "name": "Hightouch", + "version": "1.0.0", + "overview": "Sync data from any source to LaunchDarkly segments.", + "description": "Sync Hightouch models to LaunchDarkly segments to seamlessly maintain your LaunchDarkly feature flags.", + "author": "Hightouch", + "supportEmail": "developers@hightouch.com", + "links": { + "site": "https://hightouch.com/", + "privacyPolicy": "https://hightouch.com/privacy-policy", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/hightouch" + }, + "categories": ["synced-segments"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/environmentId", + "cohortIdPath": "/cohortId", + "cohortNamePath": "/cohortName", + "contextKindPath": "/contextKind", + "arrayInclusion": { + "path": "/action", + "matcher": "^add$" + }, + "memberArrayPath": "/members", + "memberArrayParser": { + "memberIdPath": "/integration_distinct_id" + } + } + } + } +} diff --git a/integrations/rudderstack/assets/horizontal.svg b/integrations/rudderstack/assets/horizontal.svg new file mode 100644 index 00000000..90075fe1 --- /dev/null +++ b/integrations/rudderstack/assets/horizontal.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/integrations/rudderstack/assets/square.svg b/integrations/rudderstack/assets/square.svg new file mode 100644 index 00000000..6c0d406f --- /dev/null +++ b/integrations/rudderstack/assets/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/rudderstack/manifest.json b/integrations/rudderstack/manifest.json new file mode 100644 index 00000000..91675531 --- /dev/null +++ b/integrations/rudderstack/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "RudderStack", + "version": "1.0.0", + "overview": "Sync RudderStack Audiences to LaunchDarkly Big Segments.", + "description": "Sync RudderStack audiences to LaunchDarkly Big Segments to more efficiently target and deliver feature flags.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.rudderstack.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/contexts/synced-segments", + "supportWebsite": "https://www.rudderstack.com/docs/destinations/streaming-destinations/launchdarkly-audience/", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["synced-segments"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/environmentId", + "contextKindPath": "/contextKind", + "cohortIdPath": "/cohortId", + "cohortNamePath": "/cohortName", + "cohortUrlPath": "/cohortUrl", + "addMemberArrayPath": "/listData/add", + "removeMemberArrayPath": "/listData/remove", + "memberArrayParser": { + "memberIdPath": "/id" + } + } + } + } +} From afc78e140e937ff3c9a74e1a4f64e8a720b16a81 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Mon, 25 Sep 2023 17:56:53 -0400 Subject: [PATCH 732/936] forcing ci From 3c77f8d42c979c95fb6e645128e429a4c7fdec1f Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 28 Sep 2023 13:34:59 -0400 Subject: [PATCH 733/936] add Census sync --- .../assets/images/horizontal.svg | 1 + .../assets/images/square.svg | 1 + .../census-synced-segments/manifest.json | 37 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 integrations/census-synced-segments/assets/images/horizontal.svg create mode 100644 integrations/census-synced-segments/assets/images/square.svg create mode 100644 integrations/census-synced-segments/manifest.json diff --git a/integrations/census-synced-segments/assets/images/horizontal.svg b/integrations/census-synced-segments/assets/images/horizontal.svg new file mode 100644 index 00000000..d4c19d9c --- /dev/null +++ b/integrations/census-synced-segments/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/census-synced-segments/assets/images/square.svg b/integrations/census-synced-segments/assets/images/square.svg new file mode 100644 index 00000000..73e9a6ae --- /dev/null +++ b/integrations/census-synced-segments/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/census-synced-segments/manifest.json b/integrations/census-synced-segments/manifest.json new file mode 100644 index 00000000..b0b32333 --- /dev/null +++ b/integrations/census-synced-segments/manifest.json @@ -0,0 +1,37 @@ +{ + "name": "Census Segments", + "version": "1.0.0", + "overview": "Use Census to sync Segments from your data warehouse into LaunchDarkly.", + "description": "Your data warehouse is the source of truth for how users interact with your product. Now you can use it to supercharge your LaunchDarkly experiments by syncing segments.", + "author": "Census", + "supportEmail": "support@getcensus.com", + "links": { + "site": "https://www.getcensus.com", + "launchdarklyDocs": "https://docs.getcensus.com/destinations/launchdarkly", + "privacyPolicy": "https://www.getcensus.com/legal/privacy-policy" + }, + "categories": ["data", "infrastructure", "automation"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "requiresOAuth": false, + "otherCapabilities": ["external"], + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/environment_id", + "contextKindPath": "/context_kind", + "cohortIdPath": "/batch/0/cohort_id", + "cohortNamePath": "/batch/0/cohort_name", + "memberArrayPath": "/batch", + "memberArrayParser": { + "memberIdPath": "/user_id", + "booleanMembershipPath": "/value", + "cohortIdPath": "/cohort_id", + "cohortNamePath": "/cohort_name" + } + } + } + } +} From 7ebdcc7b3174209f52e26856b4e665b0f099a054 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Fri, 13 Oct 2023 16:02:19 -0400 Subject: [PATCH 734/936] update synced segment partner links --- integrations/census-synced-segments/manifest.json | 2 +- integrations/heap-inbound/manifest.json | 2 +- integrations/hightouch/manifest.json | 2 +- integrations/rudderstack/manifest.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/census-synced-segments/manifest.json b/integrations/census-synced-segments/manifest.json index b0b32333..e9bdfc83 100644 --- a/integrations/census-synced-segments/manifest.json +++ b/integrations/census-synced-segments/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@getcensus.com", "links": { "site": "https://www.getcensus.com", - "launchdarklyDocs": "https://docs.getcensus.com/destinations/launchdarkly", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/census", "privacyPolicy": "https://www.getcensus.com/legal/privacy-policy" }, "categories": ["data", "infrastructure", "automation"], diff --git a/integrations/heap-inbound/manifest.json b/integrations/heap-inbound/manifest.json index 04472691..51ec1549 100644 --- a/integrations/heap-inbound/manifest.json +++ b/integrations/heap-inbound/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@heap.io", "links": { "site": "https://www.heap.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/heap-inbound", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/heap", "privacyPolicy": "https://www.heap.io/privacy" }, "categories": ["synced-segments"], diff --git a/integrations/hightouch/manifest.json b/integrations/hightouch/manifest.json index 7cc6ec5c..694023d2 100644 --- a/integrations/hightouch/manifest.json +++ b/integrations/hightouch/manifest.json @@ -8,7 +8,7 @@ "links": { "site": "https://hightouch.com/", "privacyPolicy": "https://hightouch.com/privacy-policy", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/hightouch" + "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/hightouch" }, "categories": ["synced-segments"], "icons": { diff --git a/integrations/rudderstack/manifest.json b/integrations/rudderstack/manifest.json index 91675531..f71e09f8 100644 --- a/integrations/rudderstack/manifest.json +++ b/integrations/rudderstack/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.rudderstack.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/contexts/synced-segments", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/rudderstack", "supportWebsite": "https://www.rudderstack.com/docs/destinations/streaming-destinations/launchdarkly-audience/", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, From 516a444ca8e1fb2a764c25d6e50b4ebbbdf5d355 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 18 Oct 2023 10:06:56 +0200 Subject: [PATCH 735/936] [sc-218323] add big segment manifests (#498) * add big segment manifests * update descriptions * update link --- .../dynamodb/assets/images/square.svg | 1 + integrations/dynamodb/manifest.json | 44 ++++++++++++++++++ .../redis/assets/images/horizontal.svg | 1 + integrations/redis/assets/images/square.svg | 2 + integrations/redis/manifest.json | 46 +++++++++++++++++++ 5 files changed, 94 insertions(+) create mode 100644 integrations/dynamodb/assets/images/square.svg create mode 100644 integrations/dynamodb/manifest.json create mode 100644 integrations/redis/assets/images/horizontal.svg create mode 100644 integrations/redis/assets/images/square.svg create mode 100644 integrations/redis/manifest.json diff --git a/integrations/dynamodb/assets/images/square.svg b/integrations/dynamodb/assets/images/square.svg new file mode 100644 index 00000000..b4d1117b --- /dev/null +++ b/integrations/dynamodb/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/dynamodb/manifest.json b/integrations/dynamodb/manifest.json new file mode 100644 index 00000000..b0f8cb3f --- /dev/null +++ b/integrations/dynamodb/manifest.json @@ -0,0 +1,44 @@ +{ + "name": "DynamoDB Big Segment store", + "version": "1.0.0", + "overview": "Sync LaunchDarkly Big Segments with DynamoDB.", + "description": "The DynamoDB Big Segment store integration syncs your LaunchDarkly Big Segments with your DynamoDB.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://aws.amazon.com/pm/dynamodb/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/dynamodb", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "formVariables": [ + { + "key": "tableName", + "name": "DynamoDB table name", + "description": "Your DynamoDB table name. This table must already exist", + "type": "string" + }, + { + "key": "region", + "name": "AWS Region", + "description": "The AWS region where your", + "type": "enum", + "allowedValues": ["us-east-1", "us-east-2", "us-west-1", "us-west-2"] + }, + { + "key": "roleArn", + "name": "AWS Role ARN", + "description": "The Role ARN that will be assumed by LaunchDarkly to manage your DynamoDB table.", + "type": "string" + } + ], + "capabilities": { + "bigSegmentStore": { + "dbStyle": "dynamoDB" + } + } +} diff --git a/integrations/redis/assets/images/horizontal.svg b/integrations/redis/assets/images/horizontal.svg new file mode 100644 index 00000000..7dbbae8b --- /dev/null +++ b/integrations/redis/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/redis/assets/images/square.svg b/integrations/redis/assets/images/square.svg new file mode 100644 index 00000000..90963b87 --- /dev/null +++ b/integrations/redis/assets/images/square.svg @@ -0,0 +1,2 @@ + + diff --git a/integrations/redis/manifest.json b/integrations/redis/manifest.json new file mode 100644 index 00000000..83bcae00 --- /dev/null +++ b/integrations/redis/manifest.json @@ -0,0 +1,46 @@ +{ + "name": "Redis Big Segment store", + "version": "1.0.0", + "overview": "Sync LaunchDarkly Big Segments with Redis.", + "description": "The Redis Big Segment store integration syncs your LaunchDarkly Big Segments with your Redis DB.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://redis.io/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/redis", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "host", + "name": "Redis Host", + "description": "Your Redis host", + "type": "string" + }, + { + "key": "port", + "name": "Redis Port", + "description": "Your Redis host", + "type": "string" + }, + { + "key": "password", + "name": "Redis Password", + "description": "Your Redis password", + "type": "string", + "isSecret": true, + "isOptional": true, + "defaultValue": "" + } + ], + "capabilities": { + "bigSegmentStore": { + "dbStyle": "redis" + } + } +} From a8e00067c810ed6ead1cf0f6909ef1158dca61ad Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 19 Oct 2023 12:26:47 -0400 Subject: [PATCH 736/936] merge Fulcrum synced segment from public --- integrations/fulcrum/assets/horizontal.svg | 37 ++++++++++++++++++++++ integrations/fulcrum/assets/square.svg | 21 ++++++++++++ integrations/fulcrum/manifest.json | 35 ++++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 integrations/fulcrum/assets/horizontal.svg create mode 100644 integrations/fulcrum/assets/square.svg create mode 100644 integrations/fulcrum/manifest.json diff --git a/integrations/fulcrum/assets/horizontal.svg b/integrations/fulcrum/assets/horizontal.svg new file mode 100644 index 00000000..038a371a --- /dev/null +++ b/integrations/fulcrum/assets/horizontal.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/fulcrum/assets/square.svg b/integrations/fulcrum/assets/square.svg new file mode 100644 index 00000000..fbea32f9 --- /dev/null +++ b/integrations/fulcrum/assets/square.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/fulcrum/manifest.json b/integrations/fulcrum/manifest.json new file mode 100644 index 00000000..3f197566 --- /dev/null +++ b/integrations/fulcrum/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "Fulcrum", + "version": "1.0.0", + "overview": "Sync Fulcrum's AI-driven Adaptable Segmentation with LaunchDarkly to create targeted experiences.", + "description": "Fulcrum's brings customer 360 data together, automatically creates key customer segments for activation, adoption & monetization. and syncs with Launch Darkly to help create targeted native product experiences.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.getfulcrum.io/", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/fulcrum", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/", + "supportWebsite": "https://docs.getfulcrum.io/guides/fulcrum-launchdarkly-sync" + }, + "categories": ["synced-segments"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/environmentId", + "contextKindPath": "/contextKind", + "cohortIdPath": "/cohortId", + "cohortNamePath": "/cohortName", + "cohortUrlPath": "/cohortUrl", + "addMemberArrayPath": "/included/add", + "removeMemberArrayPath": "/included/remove", + "memberArrayParser": { + "memberIdPath": "/id" + } + } + } + } +} From 3fd6317b8546d7f37c7988e61deb1c193897fa15 Mon Sep 17 00:00:00 2001 From: Dan O'Brien Date: Thu, 19 Oct 2023 12:43:14 -0400 Subject: [PATCH 737/936] Update integrations/fulcrum/manifest.json Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> --- integrations/fulcrum/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/fulcrum/manifest.json b/integrations/fulcrum/manifest.json index 3f197566..c194c3cb 100644 --- a/integrations/fulcrum/manifest.json +++ b/integrations/fulcrum/manifest.json @@ -2,7 +2,7 @@ "name": "Fulcrum", "version": "1.0.0", "overview": "Sync Fulcrum's AI-driven Adaptable Segmentation with LaunchDarkly to create targeted experiences.", - "description": "Fulcrum's brings customer 360 data together, automatically creates key customer segments for activation, adoption & monetization. and syncs with Launch Darkly to help create targeted native product experiences.", + "description": "Fulcrum's brings customer 360 data together, automatically creates key customer segments for activation, adoption & monetization. and syncs with LaunchDarkly to help create targeted native product experiences.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From b863491311ee2536189185cfa3da2f6e551d62a7 Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Tue, 31 Oct 2023 09:53:20 -0700 Subject: [PATCH 738/936] Updates Rudderstack URL --- integrations/rudderstack/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/rudderstack/manifest.json b/integrations/rudderstack/manifest.json index f71e09f8..9916e6b7 100644 --- a/integrations/rudderstack/manifest.json +++ b/integrations/rudderstack/manifest.json @@ -2,13 +2,13 @@ "name": "RudderStack", "version": "1.0.0", "overview": "Sync RudderStack Audiences to LaunchDarkly Big Segments.", - "description": "Sync RudderStack audiences to LaunchDarkly Big Segments to more efficiently target and deliver feature flags.", + "description": "Sync RudderStack audiences to LaunchDarkly Big Segments to more efficiently target and deliver feature flags.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.rudderstack.com/", "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/rudderstack", - "supportWebsite": "https://www.rudderstack.com/docs/destinations/streaming-destinations/launchdarkly-audience/", + "supportWebsite": "https://www.rudderstack.com/docs/destinations/streaming-destinations/launchdarkly-segments/", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, "categories": ["synced-segments"], From 886cf8ff4392d416ce27d60b81224f56497a6b8d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 16 Nov 2023 16:31:49 +0000 Subject: [PATCH 739/936] [sc-224439] Clean up Redis port formVariable (#501) * Clean up Redis port formVariable * Reverse language --- integrations/redis/manifest.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/integrations/redis/manifest.json b/integrations/redis/manifest.json index 83bcae00..1cc554e6 100644 --- a/integrations/redis/manifest.json +++ b/integrations/redis/manifest.json @@ -25,8 +25,11 @@ { "key": "port", "name": "Redis Port", - "description": "Your Redis host", - "type": "string" + "description": "Your Redis port. The default port of 6379 wil be used if not specified.", + "type": "string", + "placeholder": "6379", + "defaultValue": "6379", + "isOptional": true }, { "key": "password", From d6cf1fb9b80634d24bcdbfb52f9bf7040197412a Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 20 Nov 2023 12:59:57 +0100 Subject: [PATCH 740/936] [sc-224777] Update tags on store manifests (#502) * add new big-segment-store tag to schema * update on redis & dynamo manifests * update description --- integrations/dynamodb/manifest.json | 4 ++-- integrations/redis/manifest.json | 4 ++-- manifest.schema.d.ts | 6 ++++++ manifest.schema.json | 1 + schemas/base.json | 1 + 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/integrations/dynamodb/manifest.json b/integrations/dynamodb/manifest.json index b0f8cb3f..067605e6 100644 --- a/integrations/dynamodb/manifest.json +++ b/integrations/dynamodb/manifest.json @@ -1,7 +1,7 @@ { "name": "DynamoDB Big Segment store", "version": "1.0.0", - "overview": "Sync LaunchDarkly Big Segments with DynamoDB.", + "overview": "Sync LaunchDarkly Big Segments with DynamoDB. Scoped to all segments within an environment.", "description": "The DynamoDB Big Segment store integration syncs your LaunchDarkly Big Segments with your DynamoDB.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/dynamodb", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["infrastructure"], + "categories": ["big-segment-store", "data", "synced-segments"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/square.svg" diff --git a/integrations/redis/manifest.json b/integrations/redis/manifest.json index 1cc554e6..65234f7e 100644 --- a/integrations/redis/manifest.json +++ b/integrations/redis/manifest.json @@ -1,7 +1,7 @@ { "name": "Redis Big Segment store", "version": "1.0.0", - "overview": "Sync LaunchDarkly Big Segments with Redis.", + "overview": "Sync LaunchDarkly Big Segments with Redis. Scoped to all segments within an environment.", "description": "The Redis Big Segment store integration syncs your LaunchDarkly Big Segments with your Redis DB.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -10,7 +10,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/redis", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["infrastructure"], + "categories": ["big-segment-store", "data", "synced-segments"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 464f1655..82f540a0 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -58,6 +58,7 @@ export type Categories = | "approval" | "authentication" | "automation" + | "big-segment-store" | "code-references" | "customer-support" | "data" @@ -76,6 +77,7 @@ export type Categories = | "approval" | "authentication" | "automation" + | "big-segment-store" | "code-references" | "customer-support" | "data" @@ -93,6 +95,7 @@ export type Categories = | "approval" | "authentication" | "automation" + | "big-segment-store" | "code-references" | "customer-support" | "data" @@ -112,6 +115,7 @@ export type Categories = | "approval" | "authentication" | "automation" + | "big-segment-store" | "code-references" | "customer-support" | "data" @@ -129,6 +133,7 @@ export type Categories = | "approval" | "authentication" | "automation" + | "big-segment-store" | "code-references" | "customer-support" | "data" @@ -146,6 +151,7 @@ export type Categories = | "approval" | "authentication" | "automation" + | "big-segment-store" | "code-references" | "customer-support" | "data" diff --git a/manifest.schema.json b/manifest.schema.json index 82eeb432..29bca0bc 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -158,6 +158,7 @@ "approval", "authentication", "automation", + "big-segment-store", "code-references", "customer-support", "data", diff --git a/schemas/base.json b/schemas/base.json index db483f32..54c2c7ec 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -146,6 +146,7 @@ "approval", "authentication", "automation", + "big-segment-store", "code-references", "customer-support", "data", From 0d8a83aadfd739f2fb977c4578dc4fb2d95cb10f Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 22 Nov 2023 18:46:42 +0000 Subject: [PATCH 741/936] Update Big Segment store overviews (#503) --- integrations/dynamodb/manifest.json | 2 +- integrations/redis/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/dynamodb/manifest.json b/integrations/dynamodb/manifest.json index 067605e6..c2a836d0 100644 --- a/integrations/dynamodb/manifest.json +++ b/integrations/dynamodb/manifest.json @@ -1,7 +1,7 @@ { "name": "DynamoDB Big Segment store", "version": "1.0.0", - "overview": "Sync LaunchDarkly Big Segments with DynamoDB. Scoped to all segments within an environment.", + "overview": "Integrate with a persistent store for segments with over 15k targets or synced from external tools.", "description": "The DynamoDB Big Segment store integration syncs your LaunchDarkly Big Segments with your DynamoDB.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", diff --git a/integrations/redis/manifest.json b/integrations/redis/manifest.json index 65234f7e..606ead6d 100644 --- a/integrations/redis/manifest.json +++ b/integrations/redis/manifest.json @@ -1,7 +1,7 @@ { "name": "Redis Big Segment store", "version": "1.0.0", - "overview": "Sync LaunchDarkly Big Segments with Redis. Scoped to all segments within an environment.", + "overview": "Integrate with a persistent store for segments with over 15k targets or synced from external tools.", "description": "The Redis Big Segment store integration syncs your LaunchDarkly Big Segments with your Redis DB.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", From 554727bbb1e0c367185ed2946d6edae256df8524 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 29 Nov 2023 10:49:11 +0000 Subject: [PATCH 742/936] Add username and tlsEnabled formVariables (#505) --- integrations/redis/manifest.json | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/integrations/redis/manifest.json b/integrations/redis/manifest.json index 606ead6d..c2dc76cd 100644 --- a/integrations/redis/manifest.json +++ b/integrations/redis/manifest.json @@ -18,27 +18,44 @@ "formVariables": [ { "key": "host", - "name": "Redis Host", - "description": "Your Redis host", + "name": "Host", + "description": "Your Redis host.", "type": "string" }, { "key": "port", - "name": "Redis Port", - "description": "Your Redis port. The default port of 6379 wil be used if not specified.", + "name": "Port", + "description": "Your Redis port. The default port of 6379 will be used if not specified.", "type": "string", "placeholder": "6379", "defaultValue": "6379", "isOptional": true }, + { + "key": "username", + "name": "Username", + "description": "Your Redis username. The default username \"default\" will be used if not specified.", + "type": "string", + "placeholder": "default", + "defaultValue": "default", + "isOptional": true + }, { "key": "password", - "name": "Redis Password", - "description": "Your Redis password", + "name": "Password", + "description": "Your Redis password.", "type": "string", "isSecret": true, "isOptional": true, "defaultValue": "" + }, + { + "key": "tlsEnabled", + "name": "Connect with TLS", + "description": "Check this box if your Redis DB has TLS (SSL) enabled.", + "type": "boolean", + "isOptional": true, + "defaultValue": false } ], "capabilities": { From 3a0d15682bf7792aa608d4f491109f02377e6174 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 29 Nov 2023 11:29:25 +0000 Subject: [PATCH 743/936] Change redis default username to empty string (#506) --- integrations/redis/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/redis/manifest.json b/integrations/redis/manifest.json index c2dc76cd..736a1689 100644 --- a/integrations/redis/manifest.json +++ b/integrations/redis/manifest.json @@ -34,10 +34,10 @@ { "key": "username", "name": "Username", - "description": "Your Redis username. The default username \"default\" will be used if not specified.", + "description": "Your Redis username. Leave this field empty if your Redis DB does not have a username configured.", "type": "string", "placeholder": "default", - "defaultValue": "default", + "defaultValue": "", "isOptional": true }, { From a02a496a7a8ecc6d772151180d318587e6b9d18a Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 29 Nov 2023 15:31:20 +0000 Subject: [PATCH 744/936] add externalId field (#507) --- integrations/dynamodb/manifest.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/integrations/dynamodb/manifest.json b/integrations/dynamodb/manifest.json index c2a836d0..2bb6a8c7 100644 --- a/integrations/dynamodb/manifest.json +++ b/integrations/dynamodb/manifest.json @@ -29,6 +29,12 @@ "type": "enum", "allowedValues": ["us-east-1", "us-east-2", "us-west-1", "us-west-2"] }, + { + "key": "externalId", + "name": "External Id", + "description": "Use this external ID when creating the IAM Role that LaunchDarkly will assume to manage your DynamoDB table.", + "type": "generated" + }, { "key": "roleArn", "name": "AWS Role ARN", From 0998295c823495ce865bcbbae1c7627830f0a8b0 Mon Sep 17 00:00:00 2001 From: Molly Date: Thu, 30 Nov 2023 02:48:09 -0800 Subject: [PATCH 745/936] new image from linda (#504) Co-authored-by: Henry Barrow --- integrations/dynamodb/assets/images/square.svg | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/integrations/dynamodb/assets/images/square.svg b/integrations/dynamodb/assets/images/square.svg index b4d1117b..0dea2883 100644 --- a/integrations/dynamodb/assets/images/square.svg +++ b/integrations/dynamodb/assets/images/square.svg @@ -1 +1,11 @@ - + + + + + + + + + + + From 4c5c0133df6139c044d6148f216c51831fc6e5fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Nov 2023 10:49:13 +0000 Subject: [PATCH 746/936] Bump @babel/traverse from 7.12.12 to 7.23.2 (#497) Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.12.12 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 512 +++++++++++++++++++++++++++++++++------------- 1 file changed, 375 insertions(+), 137 deletions(-) diff --git a/package-lock.json b/package-lock.json index ebd86afa..c10aa222 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,12 +45,87 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/@babel/core": { @@ -93,43 +168,62 @@ } }, "node_modules/@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { @@ -204,19 +298,34 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.12.11" + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helpers": { "version": "7.12.5", @@ -230,14 +339,17 @@ } }, "node_modules/@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight/node_modules/ansi-styles": { @@ -278,13 +390,13 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/@babel/highlight/node_modules/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=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -293,7 +405,7 @@ "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" @@ -312,9 +424,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -468,42 +580,52 @@ } }, "node_modules/@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { @@ -903,6 +1025,20 @@ "node": ">= 10.14.2" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -912,6 +1048,15 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -9183,12 +9328,71 @@ } }, "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "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==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/core": { @@ -9223,42 +9427,52 @@ } }, "@babel/generator": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", - "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@babel/types": "^7.12.11", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "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 + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } } } }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, "@babel/helper-function-name": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", - "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/types": "^7.12.11" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, - "@babel/helper-get-function-arity": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", - "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { @@ -9333,18 +9547,24 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", - "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.12.11" + "@babel/types": "^7.22.5" } }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helpers": { @@ -9359,13 +9579,13 @@ } }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -9401,19 +9621,19 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "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=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "supports-color": { @@ -9428,9 +9648,9 @@ } }, "@babel/parser": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", - "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -9542,41 +9762,42 @@ } }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" } }, "@babel/traverse": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", - "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.11", - "@babel/generator": "^7.12.11", - "@babel/helper-function-name": "^7.12.11", - "@babel/helper-split-export-declaration": "^7.12.11", - "@babel/parser": "^7.12.11", - "@babel/types": "^7.12.12", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -9892,12 +10113,29 @@ "chalk": "^4.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", From e607cbab1f23d8d19062b84ab65b5080dbe6a85a Mon Sep 17 00:00:00 2001 From: Molly Date: Thu, 30 Nov 2023 02:52:02 -0800 Subject: [PATCH 747/936] [sc-225010] Big Segment store: copyedit manifests (#509) * minor copyedits for big segment store manifests * also update descriptions (used in upsells only) * Update integrations/dynamodb/manifest.json --------- Co-authored-by: Henry Barrow --- integrations/dynamodb/manifest.json | 10 +++++----- integrations/redis/manifest.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/integrations/dynamodb/manifest.json b/integrations/dynamodb/manifest.json index 2bb6a8c7..c9af3850 100644 --- a/integrations/dynamodb/manifest.json +++ b/integrations/dynamodb/manifest.json @@ -2,7 +2,7 @@ "name": "DynamoDB Big Segment store", "version": "1.0.0", "overview": "Integrate with a persistent store for segments with over 15k targets or synced from external tools.", - "description": "The DynamoDB Big Segment store integration syncs your LaunchDarkly Big Segments with your DynamoDB.", + "description": "Integrate with a persistent store for segments with over 15k targets or synced from external tools. The DynamoDB Big Segment store syncs these LaunchDarkly segments with your DynamoDB.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { @@ -19,26 +19,26 @@ { "key": "tableName", "name": "DynamoDB table name", - "description": "Your DynamoDB table name. This table must already exist", + "description": "Your DynamoDB table name. This table must already exist.", "type": "string" }, { "key": "region", "name": "AWS Region", - "description": "The AWS region where your", + "description": "The AWS region where your DynamoDB is located.", "type": "enum", "allowedValues": ["us-east-1", "us-east-2", "us-west-1", "us-west-2"] }, { "key": "externalId", "name": "External Id", - "description": "Use this external ID when creating the IAM Role that LaunchDarkly will assume to manage your DynamoDB table.", + "description": "Use this external ID when you create the IAM Role that LaunchDarkly will assume to manage your DynamoDB table.", "type": "generated" }, { "key": "roleArn", "name": "AWS Role ARN", - "description": "The Role ARN that will be assumed by LaunchDarkly to manage your DynamoDB table.", + "description": "The AWS role Amazon Resource Name (ARN) that LaunchDarkly will assume to manage your DynamoDB table.", "type": "string" } ], diff --git a/integrations/redis/manifest.json b/integrations/redis/manifest.json index 736a1689..1ecdcd15 100644 --- a/integrations/redis/manifest.json +++ b/integrations/redis/manifest.json @@ -2,7 +2,7 @@ "name": "Redis Big Segment store", "version": "1.0.0", "overview": "Integrate with a persistent store for segments with over 15k targets or synced from external tools.", - "description": "The Redis Big Segment store integration syncs your LaunchDarkly Big Segments with your Redis DB.", + "description": "Integrate with a persistent store for segments with over 15k targets or synced from external tools. The Redis Big Segment store syncs these LaunchDarkly segments with your Redis DB.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { @@ -25,7 +25,7 @@ { "key": "port", "name": "Port", - "description": "Your Redis port. The default port of 6379 will be used if not specified.", + "description": "Your Redis port. Uses the default port of 6379 if not specified.", "type": "string", "placeholder": "6379", "defaultValue": "6379", From 41bca353a2c952163b6060de18e30177f0f5b0f1 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 1 Dec 2023 16:08:51 +0000 Subject: [PATCH 748/936] Add more regions to DynamoDB manifest (#510) --- integrations/dynamodb/manifest.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/integrations/dynamodb/manifest.json b/integrations/dynamodb/manifest.json index c9af3850..22983d1c 100644 --- a/integrations/dynamodb/manifest.json +++ b/integrations/dynamodb/manifest.json @@ -27,7 +27,25 @@ "name": "AWS Region", "description": "The AWS region where your DynamoDB is located.", "type": "enum", - "allowedValues": ["us-east-1", "us-east-2", "us-west-1", "us-west-2"] + "allowedValues": [ + "us-east-1", + "us-east-2", + "us-west-1", + "us-west-2", + "ap-south-1", + "ap-northeast-1", + "ap-northeast-2", + "ap-northeast-3", + "ap-southeast-1", + "ap-southeast-2", + "ca-central-1", + "eu-central-1", + "eu-west-1", + "eu-west-2", + "eu-west-3", + "eu-north-1", + "sa-east-1" + ] }, { "key": "externalId", From 800b74f9be994535032a6d0a7446d7a37a361f01 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Mon, 4 Dec 2023 16:09:12 -0500 Subject: [PATCH 749/936] adding Cortex integration --- .../cortex/assets/images/horizontal.svg | 9 ++++++++ integrations/cortex/assets/images/square.svg | 3 +++ integrations/cortex/manifest.json | 21 +++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 integrations/cortex/assets/images/horizontal.svg create mode 100644 integrations/cortex/assets/images/square.svg create mode 100644 integrations/cortex/manifest.json diff --git a/integrations/cortex/assets/images/horizontal.svg b/integrations/cortex/assets/images/horizontal.svg new file mode 100644 index 00000000..5972ad59 --- /dev/null +++ b/integrations/cortex/assets/images/horizontal.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/integrations/cortex/assets/images/square.svg b/integrations/cortex/assets/images/square.svg new file mode 100644 index 00000000..e030ccab --- /dev/null +++ b/integrations/cortex/assets/images/square.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/cortex/manifest.json b/integrations/cortex/manifest.json new file mode 100644 index 00000000..8b0fdde7 --- /dev/null +++ b/integrations/cortex/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Cortex", + "version": "1.0.0", + "overview": "View LaunchDarkly feature flags directly in the catalog and alert on Scorecards in Cortex.", + "description": "With the integration, you can view and monitor feature flags in the Cortex catalog. You can also write Scorecard rules to enforce in Cortex feature flag usage and drive operational maturity.", + "author": "Cortex", + "supportEmail": "support@cortex.io", + "links": { + "site": "https://www.cortex.io/home", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/cortex", + "supportWebsite": "https://support.getcortexapp.com/", + "privacyPolicy": "https://www.cortex.io/legal/privacy-policy" + }, + "categories": ["developer-tools", "infrastructure"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "requiresOAuth": false, + "otherCapabilities": ["external"] +} From ee0dc3069a5e2f2f68b4516b1a82f902a0b7cfd8 Mon Sep 17 00:00:00 2001 From: Molly Date: Thu, 28 Dec 2023 08:00:26 -0800 Subject: [PATCH 750/936] big segments no longer require capitalization (#512) --- integrations/dynamodb/manifest.json | 4 ++-- integrations/redis/manifest.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integrations/dynamodb/manifest.json b/integrations/dynamodb/manifest.json index 22983d1c..353b746f 100644 --- a/integrations/dynamodb/manifest.json +++ b/integrations/dynamodb/manifest.json @@ -1,8 +1,8 @@ { - "name": "DynamoDB Big Segment store", + "name": "DynamoDB big segment store", "version": "1.0.0", "overview": "Integrate with a persistent store for segments with over 15k targets or synced from external tools.", - "description": "Integrate with a persistent store for segments with over 15k targets or synced from external tools. The DynamoDB Big Segment store syncs these LaunchDarkly segments with your DynamoDB.", + "description": "Integrate with a persistent store for segments with over 15k targets or synced from external tools. The DynamoDB big segment store syncs these LaunchDarkly segments with your DynamoDB.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/redis/manifest.json b/integrations/redis/manifest.json index 1ecdcd15..f8753aec 100644 --- a/integrations/redis/manifest.json +++ b/integrations/redis/manifest.json @@ -1,8 +1,8 @@ { - "name": "Redis Big Segment store", + "name": "Redis big segment store", "version": "1.0.0", "overview": "Integrate with a persistent store for segments with over 15k targets or synced from external tools.", - "description": "Integrate with a persistent store for segments with over 15k targets or synced from external tools. The Redis Big Segment store syncs these LaunchDarkly segments with your Redis DB.", + "description": "Integrate with a persistent store for segments with over 15k targets or synced from external tools. The Redis big segment store syncs these LaunchDarkly segments with your Redis DB.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From c8fd0ead01c909d70707ac2dcba090b508b0d5bb Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 24 Jan 2024 15:07:31 -0500 Subject: [PATCH 751/936] add chronosphere and bitrise --- .../bitrise/assets/images/horizontal.svg | 7 ++ integrations/bitrise/assets/images/square.svg | 7 ++ integrations/bitrise/manifest.json | 19 +++++ integrations/chronosphere/README.md | 5 ++ .../chronosphere/assets/horizontal.svg | 9 ++ integrations/chronosphere/assets/square.svg | 16 ++++ integrations/chronosphere/manifest.json | 82 +++++++++++++++++++ .../chronosphere/templates/default.json.hbs | 2 + 8 files changed, 147 insertions(+) create mode 100644 integrations/bitrise/assets/images/horizontal.svg create mode 100644 integrations/bitrise/assets/images/square.svg create mode 100644 integrations/bitrise/manifest.json create mode 100644 integrations/chronosphere/README.md create mode 100644 integrations/chronosphere/assets/horizontal.svg create mode 100644 integrations/chronosphere/assets/square.svg create mode 100644 integrations/chronosphere/manifest.json create mode 100644 integrations/chronosphere/templates/default.json.hbs diff --git a/integrations/bitrise/assets/images/horizontal.svg b/integrations/bitrise/assets/images/horizontal.svg new file mode 100644 index 00000000..019ff94c --- /dev/null +++ b/integrations/bitrise/assets/images/horizontal.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/integrations/bitrise/assets/images/square.svg b/integrations/bitrise/assets/images/square.svg new file mode 100644 index 00000000..02765c81 --- /dev/null +++ b/integrations/bitrise/assets/images/square.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/integrations/bitrise/manifest.json b/integrations/bitrise/manifest.json new file mode 100644 index 00000000..b0d2ccd1 --- /dev/null +++ b/integrations/bitrise/manifest.json @@ -0,0 +1,19 @@ +{ + "name": "Bitrise Release Management", + "version": "1.0.0", + "overview": "View LaunchDarkly feature flags in your mobile app releases with Bitrise Release Management.", + "description": "Access your feature flag details in your mobile app releases. Quickly understand the status and configuration of your mobile app feature flags — without delving into detailed settings. With this integration, you'll be able to have an overview of your feature flags, alongside your app release in Bitrise Release Management. This helps you easily monitor the status of your app and feature releases.", + "author": "Bitrise.io", + "supportEmail": "support@bitrise.io", + "links": { + "site": "https://bitrise.io", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/bitrise", + "privacyPolicy": "https://go.bitrise.io/privacy-policy" + }, + "categories": ["automation"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "otherCapabilities": ["external"] +} diff --git a/integrations/chronosphere/README.md b/integrations/chronosphere/README.md new file mode 100644 index 00000000..5fcafc55 --- /dev/null +++ b/integrations/chronosphere/README.md @@ -0,0 +1,5 @@ +# Chronosphere + +[User documentation](https://docs.launchdarkly.com/integrations/chronosphere) + +[API documentation](https://docs.chronosphere.io/documentation/explore/change-events/third-party#launchdarkly) diff --git a/integrations/chronosphere/assets/horizontal.svg b/integrations/chronosphere/assets/horizontal.svg new file mode 100644 index 00000000..18d0552c --- /dev/null +++ b/integrations/chronosphere/assets/horizontal.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/integrations/chronosphere/assets/square.svg b/integrations/chronosphere/assets/square.svg new file mode 100644 index 00000000..8be98864 --- /dev/null +++ b/integrations/chronosphere/assets/square.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/integrations/chronosphere/manifest.json b/integrations/chronosphere/manifest.json new file mode 100644 index 00000000..ed442129 --- /dev/null +++ b/integrations/chronosphere/manifest.json @@ -0,0 +1,82 @@ +{ + "name": "Chronosphere Events", + "version": "1.0.0", + "overview": "Monitor LaunchDarkly feature flag changes in Chronosphere.", + "description": "Monitor LaunchDarkly feature flag change events in Chronosphere.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://chronosphere.io/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/chronosphere", + "privacyPolicy": "https://chronosphere.io/privacy/" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + { + "key": "secretToken", + "name": "Chronosphere secret token", + "type": "string", + "description": "Enter your Chronosphere secret token.", + "isSecret": true + }, + { + "key": "receiverURL", + "name": "Chronosphere receiver URL", + "description": "Your Chronosphere receiver URL. Should look like https://{MY_COMPANY}.chronosphere.io/api/v1/data/events/receiver/launchdarkly", + "type": "string" + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{receiverURL}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "X-LD-Signature", + "value": "{{secretToken}}" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": [ + "updateFallThrough", + "updateFlagVariations", + "updateFeatureWorkflows", + "updateGlobalArchived", + "updateOffVariation", + "updateOn", + "updatePrerequisites", + "updateRules", + "updateScheduledChanges", + "updateTargets", + "createFlag", + "deleteFlag", + "updateClientSideFlagAvailability", + "updateFlagDefaultVariations", + "updateName", + "updateTemporary", + "createTriggers", + "deleteTriggers", + "updateTriggers", + "updateFlagSalt" + ] + } + ] + } + } +} diff --git a/integrations/chronosphere/templates/default.json.hbs b/integrations/chronosphere/templates/default.json.hbs new file mode 100644 index 00000000..2c63c085 --- /dev/null +++ b/integrations/chronosphere/templates/default.json.hbs @@ -0,0 +1,2 @@ +{ +} From 990d4094f70f7f5396df4eb1b97b107e5b5c4c75 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 6 Feb 2024 14:24:57 -0500 Subject: [PATCH 752/936] add Sumatra integration --- integrations/rudderstack/manifest.json | 4 +- .../assets/horizontal.svg | 161 +++++++++++++++ .../sumatra-synced-segments/assets/square.svg | 183 ++++++++++++++++++ .../sumatra-synced-segments/manifest.json | 35 ++++ 4 files changed, 381 insertions(+), 2 deletions(-) create mode 100644 integrations/sumatra-synced-segments/assets/horizontal.svg create mode 100644 integrations/sumatra-synced-segments/assets/square.svg create mode 100644 integrations/sumatra-synced-segments/manifest.json diff --git a/integrations/rudderstack/manifest.json b/integrations/rudderstack/manifest.json index 9916e6b7..f71e09f8 100644 --- a/integrations/rudderstack/manifest.json +++ b/integrations/rudderstack/manifest.json @@ -2,13 +2,13 @@ "name": "RudderStack", "version": "1.0.0", "overview": "Sync RudderStack Audiences to LaunchDarkly Big Segments.", - "description": "Sync RudderStack audiences to LaunchDarkly Big Segments to more efficiently target and deliver feature flags.", + "description": "Sync RudderStack audiences to LaunchDarkly Big Segments to more efficiently target and deliver feature flags.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.rudderstack.com/", "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/rudderstack", - "supportWebsite": "https://www.rudderstack.com/docs/destinations/streaming-destinations/launchdarkly-segments/", + "supportWebsite": "https://www.rudderstack.com/docs/destinations/streaming-destinations/launchdarkly-audience/", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, "categories": ["synced-segments"], diff --git a/integrations/sumatra-synced-segments/assets/horizontal.svg b/integrations/sumatra-synced-segments/assets/horizontal.svg new file mode 100644 index 00000000..6fc903e8 --- /dev/null +++ b/integrations/sumatra-synced-segments/assets/horizontal.svg @@ -0,0 +1,161 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/sumatra-synced-segments/assets/square.svg b/integrations/sumatra-synced-segments/assets/square.svg new file mode 100644 index 00000000..105bdb89 --- /dev/null +++ b/integrations/sumatra-synced-segments/assets/square.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/sumatra-synced-segments/manifest.json b/integrations/sumatra-synced-segments/manifest.json new file mode 100644 index 00000000..85cd6117 --- /dev/null +++ b/integrations/sumatra-synced-segments/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "Sumatra", + "version": "1.0.0", + "overview": "Sync Sumatra Audiences with LaunchDarkly to create targeted experiences and experiments.", + "description": "The Sumatra AI engine generates behavioral signals from raw event data to predict customer intent and segment users by cohorts. Sumatra’s LaunchDarkly integration allows you to sync Sumatra cohorts with LaunchDarkly audiences to create targeted experiences and experiments.", + "author": "Sumatra", + "supportEmail": "support@sumatra.ai", + "links": { + "site": "https://sumatra.ai/", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/sumatra", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/", + "supportWebsite": "https://optimize-docs.sumatra.ai/experiences/launchdarkly" + }, + "categories": ["synced-segments"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/environmentId", + "contextKindPath": "/contextKind", + "cohortIdPath": "/cohortId", + "cohortNamePath": "/cohortName", + "cohortUrlPath": "/cohortUrl", + "addMemberArrayPath": "/included/add", + "removeMemberArrayPath": "/included/remove", + "memberArrayParser": { + "memberIdPath": "/id" + } + } + } + } +} From bf2c7d850050a41656847d724c89914be27e24b9 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 6 Feb 2024 14:27:10 -0500 Subject: [PATCH 753/936] revert rudderstack --- integrations/rudderstack/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/rudderstack/manifest.json b/integrations/rudderstack/manifest.json index f71e09f8..9916e6b7 100644 --- a/integrations/rudderstack/manifest.json +++ b/integrations/rudderstack/manifest.json @@ -2,13 +2,13 @@ "name": "RudderStack", "version": "1.0.0", "overview": "Sync RudderStack Audiences to LaunchDarkly Big Segments.", - "description": "Sync RudderStack audiences to LaunchDarkly Big Segments to more efficiently target and deliver feature flags.", + "description": "Sync RudderStack audiences to LaunchDarkly Big Segments to more efficiently target and deliver feature flags.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.rudderstack.com/", "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/rudderstack", - "supportWebsite": "https://www.rudderstack.com/docs/destinations/streaming-destinations/launchdarkly-audience/", + "supportWebsite": "https://www.rudderstack.com/docs/destinations/streaming-destinations/launchdarkly-segments/", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, "categories": ["synced-segments"], From f77b49e55bb8aeb93b9719195cf15afca00cb047 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 22 Feb 2024 13:15:28 -0500 Subject: [PATCH 754/936] Adding Ditto integration --- integrations/ditto/README.md | 5 +++++ .../ditto/assets/ditto-logo-horizontal.svg | 14 ++++++++++++ .../ditto/assets/ditto-logo-square.svg | 14 ++++++++++++ integrations/ditto/manifest.json | 22 +++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 integrations/ditto/README.md create mode 100644 integrations/ditto/assets/ditto-logo-horizontal.svg create mode 100644 integrations/ditto/assets/ditto-logo-square.svg create mode 100644 integrations/ditto/manifest.json diff --git a/integrations/ditto/README.md b/integrations/ditto/README.md new file mode 100644 index 00000000..0093bad6 --- /dev/null +++ b/integrations/ditto/README.md @@ -0,0 +1,5 @@ +# Ditto Integration + +Ditto is your single source of truth for product copy from draft to design to development. Ditto's LaunchDarkly integration allows you to sync variants in your Ditto workspace with feature flags in LaunchDarkly, enabling your team to tighten the A/B testing feedback loop while iterating on product text. + +[How to connect Ditto with LaunchDarkly](https://www.dittowords.com/docs/launchdarkly-integration) diff --git a/integrations/ditto/assets/ditto-logo-horizontal.svg b/integrations/ditto/assets/ditto-logo-horizontal.svg new file mode 100644 index 00000000..5e779656 --- /dev/null +++ b/integrations/ditto/assets/ditto-logo-horizontal.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/integrations/ditto/assets/ditto-logo-square.svg b/integrations/ditto/assets/ditto-logo-square.svg new file mode 100644 index 00000000..85853bea --- /dev/null +++ b/integrations/ditto/assets/ditto-logo-square.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/integrations/ditto/manifest.json b/integrations/ditto/manifest.json new file mode 100644 index 00000000..5d76062a --- /dev/null +++ b/integrations/ditto/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Ditto Integration", + "version": "1.0.0", + "overview": "Sync variants of product text in designs from Ditto to LaunchDarkly feature flags.", + "description": "Ditto is your single source of truth for product copy from draft to design to development. Ditto's LaunchDarkly integration allows you to sync variants in your Ditto workspace with feature flags in LaunchDarkly, enabling your team to tighten the A/B testing feedback loop while iterating on product text.", + "author": "Ditto", + "supportEmail": "support@dittowords.com", + "links": { + "site": "https://www.dittowords.com", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/ditto", + "privacyPolicy": "https://www.dittowords.com/legal/privacy-policy" + }, + "categories": ["developer-tools"], + "icons": { + "square": "assets/ditto-logo-square.svg", + "horizontal": "assets/ditto-logo-horizontal.svg" + }, + "capabilities": { + "externalConfigurationURL": "https://app.dittowords.com/account/connections" + }, + "requiresOAuth": false +} From 7e07e8568499e8452fa4f9ec39073c8c3693ed5e Mon Sep 17 00:00:00 2001 From: Jaz White Date: Fri, 1 Mar 2024 06:58:46 -0800 Subject: [PATCH 755/936] feat: add github flaglink capability (#517) --- integrations/github/manifest.json | 77 ++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index c98fae3b..076b1649 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -19,5 +19,80 @@ "legacy": { "kind": "codeRefs" }, - "otherCapabilities": ["codeRefs"] + "otherCapabilities": ["codeRefs"], + "capabilities": { + "flagLink": { + "header": "GitHub pull request", + "emptyState": { + "title": "No GitHub pull requests link to this flag.", + "leadText": "To enable the GitHub integration, [read the documentation](https://docs.launchdarkly.com/integrations/github-actions/find-code-references)" + }, + "metadata": { + "avatarUrl": { + "type": "uri" + }, + "authorDisplayName": { + "type": "string" + }, + "authorLogin": { + "type": "string" + }, + "authorName": { + "type": "string" + }, + "prNumber": { + "type": "string" + }, + "prTitle": { + "type": "string" + }, + "prBody": { + "type": "string" + }, + "message": { + "type": "string" + }, + "repoName": { + "type": "string" + }, + "repoUrl": { + "type": "uri" + }, + "state": { + "type": "string" + } + }, + "uiBlocks": { + "image": { + "sourceUrl": "{{{metadata.avatarUrl}}}", + "isAvatar": true + }, + "title": { + "linkToReference": true, + "elements": [ + { "text": "{{{metadata.prTitle}}} #{{{metadata.prNumber}}}" } + ] + }, + "description": "{{{metadata.prBody}}}", + "context": { + "elements": [ + { + "text": "Opened by" + }, + { + "text": "{{{metadata.authorDisplayName}}}", + "isBold": true + }, + { + "text": "in repo" + }, + { + "text": "{{{metadata.repoName}}}", + "url": "{{{metadata.repoUrl}}}" + } + ] + } + } + } + } } From dbbf2582c0f8f5b494cd790aa1965d737169c13e Mon Sep 17 00:00:00 2001 From: Jaz White Date: Fri, 1 Mar 2024 09:32:03 -0800 Subject: [PATCH 756/936] bump github manifest version (#519) --- integrations/github/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index 076b1649..f92c7c7d 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -1,6 +1,6 @@ { "name": "GitHub code references", - "version": "1.0.0", + "version": "1.1.0", "overview": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", "description": "Use our open-source utility to track references to flags in your code, using GitHub Actions.", "details": "GitHub is a service for software development and version control using Git. Use our open-source utility to track references to flags in your code to power in-app functionality. Search for feature flags that have no existing code references. Add additional safety checks when you're ready to archive a flag that it does not exist in any codebase running the utility.", From 5c785ab327cb076eab242ef47055918cc002bfe7 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Fri, 22 Mar 2024 12:35:06 -0400 Subject: [PATCH 757/936] adding zeoptap --- .../assets/images/horizontal_zeotap.svg | 18 +++++++++ .../zeotap/assets/images/square_zeotap.svg | 10 +++++ integrations/zeotap/manifest.json | 37 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 integrations/zeotap/assets/images/horizontal_zeotap.svg create mode 100644 integrations/zeotap/assets/images/square_zeotap.svg create mode 100644 integrations/zeotap/manifest.json diff --git a/integrations/zeotap/assets/images/horizontal_zeotap.svg b/integrations/zeotap/assets/images/horizontal_zeotap.svg new file mode 100644 index 00000000..f82180cc --- /dev/null +++ b/integrations/zeotap/assets/images/horizontal_zeotap.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/integrations/zeotap/assets/images/square_zeotap.svg b/integrations/zeotap/assets/images/square_zeotap.svg new file mode 100644 index 00000000..7f614703 --- /dev/null +++ b/integrations/zeotap/assets/images/square_zeotap.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/integrations/zeotap/manifest.json b/integrations/zeotap/manifest.json new file mode 100644 index 00000000..a6502d74 --- /dev/null +++ b/integrations/zeotap/manifest.json @@ -0,0 +1,37 @@ +{ + "name": "Zeotap", + "version": "1.0.0", + "overview": "Sync Zeotap audiences to LaunchDarkly Big Segments.", + "description": "Segment syncing lets you import audiences from Zeotap to LaunchDarkly to more efficiently target and deliver feature flags.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://zeotap.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/zeotap", + "privacyPolicy": "https://launchdarkly.com/policies/privacy " + }, + "categories": ["synced-segments"], + "icons": { + "horizontal": "assets/images/horizontal_zeotap.svg", + "square": "assets/images/square_zeotap.svg" + }, + "requiresOAuth": false, + "otherCapabilities": ["external"], + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/parameters/integration_project_id", + "cohortIdPath": "/parameters/integration_cohort_id", + "cohortNamePath": "/parameters/integration_cohort_name", + "arrayInclusion": { + "path": "/action", + "matcher": "^(members|add_members)$" + }, + "memberArrayPath": "/parameters/members", + "memberArrayParser": { + "memberIdPath": "/integration_distinct_id" + } + } + } + } +} From 17f05f212e1b825bf6ecf56e4dc313be925c4417 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Tue, 26 Mar 2024 12:06:26 -0400 Subject: [PATCH 758/936] action fix for Chronosphere --- integrations/chronosphere/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/chronosphere/manifest.json b/integrations/chronosphere/manifest.json index ed442129..bf3173e8 100644 --- a/integrations/chronosphere/manifest.json +++ b/integrations/chronosphere/manifest.json @@ -54,7 +54,7 @@ "effect": "allow", "resources": ["proj/*:env/production:flag/*"], "actions": [ - "updateFallThrough", + "updateFallthrough", "updateFlagVariations", "updateFeatureWorkflows", "updateGlobalArchived", From 923b4b46146ba8de69bb14b3b02b6af27be32b2a Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Mon, 29 Apr 2024 07:37:44 -0400 Subject: [PATCH 759/936] adding Tealium --- .../2021_Tealium_icon_rgb_full-color.svg | 36 ++++++++++++ .../2021_Tealium_logo_rgb_full-color.svg | 55 +++++++++++++++++++ .../tealium-synced-segments/manifest.json | 34 ++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 integrations/tealium-synced-segments/assets/images/2021_Tealium_icon_rgb_full-color.svg create mode 100644 integrations/tealium-synced-segments/assets/images/2021_Tealium_logo_rgb_full-color.svg create mode 100644 integrations/tealium-synced-segments/manifest.json diff --git a/integrations/tealium-synced-segments/assets/images/2021_Tealium_icon_rgb_full-color.svg b/integrations/tealium-synced-segments/assets/images/2021_Tealium_icon_rgb_full-color.svg new file mode 100644 index 00000000..2306f56f --- /dev/null +++ b/integrations/tealium-synced-segments/assets/images/2021_Tealium_icon_rgb_full-color.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/tealium-synced-segments/assets/images/2021_Tealium_logo_rgb_full-color.svg b/integrations/tealium-synced-segments/assets/images/2021_Tealium_logo_rgb_full-color.svg new file mode 100644 index 00000000..45062588 --- /dev/null +++ b/integrations/tealium-synced-segments/assets/images/2021_Tealium_logo_rgb_full-color.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/tealium-synced-segments/manifest.json b/integrations/tealium-synced-segments/manifest.json new file mode 100644 index 00000000..3345d1fa --- /dev/null +++ b/integrations/tealium-synced-segments/manifest.json @@ -0,0 +1,34 @@ +{ + "name": "Tealium Audience Cohorting", + "version": "1.0.0", + "overview": "Send Audience membership to your LaunchDarkly Segments through Tealium's AudienceStream CDP.", + "description": "Through Tealium's AudienceStream CDP, you can send real-time segment membership to your LaunchDarkly instance through their Cohorting connector. Enhance your segments with your real-time data from Tealium's Customer Data Hub with our turnkey integration.", + "author": "Tealium", + "supportEmail": "support@tealium.com", + "links": { + "site": "https://tealium.com/", + "privacyPolicy": "https://tealium.com/privacy" + }, + "categories": ["analytics", "data"], + "icons": { + "square": "assets/images/2021_Tealium_icon_rgb_full-color.svg", + "horizontal": "assets/images/2021_Tealium_logo_rgb_full-color.svg" + }, + "capabilities": { + "syncedSegment": { + "requestParser": { + "environmentIdPath": "/parameters/tealium_project_id", + "cohortIdPath": "/parameters/tealium_cohort_id", + "cohortNamePath": "/parameters/tealium_cohort_name", + "arrayInclusion": { + "path": "/action", + "matcher": "^(add_member | remove_member)$" + }, + "memberArrayPath": "/parameters/members", + "memberArrayParser": { + "memberIdPath": "/member_id" + } + } + } + } +} From cb474812c8b2a3545452784b3e5406d36717ef4b Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 15 May 2024 12:34:29 -0400 Subject: [PATCH 760/936] add Port integration --- integrations/port/README.md | 6 ++++++ .../port/assets/port-logo-horizontal.svg | 7 +++++++ integrations/port/assets/port-logo-square.svg | 3 +++ integrations/port/manifest.json | 20 +++++++++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 integrations/port/README.md create mode 100644 integrations/port/assets/port-logo-horizontal.svg create mode 100644 integrations/port/assets/port-logo-square.svg create mode 100644 integrations/port/manifest.json diff --git a/integrations/port/README.md b/integrations/port/README.md new file mode 100644 index 00000000..c658c97e --- /dev/null +++ b/integrations/port/README.md @@ -0,0 +1,6 @@ +# Port Integration + +Port is an open internal developer portal, providing an end-to-end developer experience, resulting in better quality, security +& cost control as well as faster onboarding and velocity. Port's LaunchDarkly integration allows you to import projects, flags and environments from your LaunchDarkly account into Port, according to your mapping and definition. + +[How to connect instal Port's LaunchDarkly integration](https://docs.getport.io/build-your-software-catalog/sync-data-to-catalog/feature-management/launchdarkly/) diff --git a/integrations/port/assets/port-logo-horizontal.svg b/integrations/port/assets/port-logo-horizontal.svg new file mode 100644 index 00000000..53d6de39 --- /dev/null +++ b/integrations/port/assets/port-logo-horizontal.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/integrations/port/assets/port-logo-square.svg b/integrations/port/assets/port-logo-square.svg new file mode 100644 index 00000000..44c58912 --- /dev/null +++ b/integrations/port/assets/port-logo-square.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/port/manifest.json b/integrations/port/manifest.json new file mode 100644 index 00000000..f56bac8d --- /dev/null +++ b/integrations/port/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "Port", + "version": "0.1.3", + "overview": "Access Feature Flags, Projects and Environments from your LaunchDarkly account in Port.", + "description": "Port's LaunchDarkly integration allows you to access Feature Flags, Projects and Environments from your LaunchDarkly account in Port, according to your mapping and definition.", + "author": "Port", + "supportEmail": "support@getport.io", + "links": { + "site": "https://getport.io", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/port", + "privacyPolicy": "https://www.getport.io/legal/privacy-policy" + }, + "categories": ["developer-tools", "infrastructure"], + "icons": { + "square": "assets/port-logo-square.svg", + "horizontal": "assets/port-logo-horizontal.svg" + }, + "requiresOAuth": false, + "otherCapabilities": ["external"] +} From 80977d4d268e7ea0090ab050cb3f01104b587c0f Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 22 May 2024 16:12:04 -0400 Subject: [PATCH 761/936] add Last9 integration --- integrations/last9/README.md | 10 ++ .../assets/images/last9-horizontal-logo.svg | 1 + .../last9/assets/images/last9-square-logo.svg | 5 + integrations/last9/manifest.json | 101 ++++++++++++++++++ integrations/last9/templates/default.json.hbs | 42 ++++++++ 5 files changed, 159 insertions(+) create mode 100644 integrations/last9/README.md create mode 100644 integrations/last9/assets/images/last9-horizontal-logo.svg create mode 100644 integrations/last9/assets/images/last9-square-logo.svg create mode 100644 integrations/last9/manifest.json create mode 100644 integrations/last9/templates/default.json.hbs diff --git a/integrations/last9/README.md b/integrations/last9/README.md new file mode 100644 index 00000000..732f8daf --- /dev/null +++ b/integrations/last9/README.md @@ -0,0 +1,10 @@ +# Last9 # + +Send Launchdarkly events (changes in configuration) to Last9. Integration will unlock: +- Correlating Launchdarkly events with other key KPIs (Key Performing Indicator) of your system to reduce MTTD. +- Create intelligent alert rules by changing alert configuration like threshold etc, according to the type of event received which helps in getting more contextual alerts and reduce alert noise. +- Visualise these events on service dashboards to have an overall view of system activities and health. + + +# Getting started with the Last9 integration $ +Run `npm run curl last9` in the root repository directory to generate a curl command to send data to Last9. diff --git a/integrations/last9/assets/images/last9-horizontal-logo.svg b/integrations/last9/assets/images/last9-horizontal-logo.svg new file mode 100644 index 00000000..b5feb9c3 --- /dev/null +++ b/integrations/last9/assets/images/last9-horizontal-logo.svg @@ -0,0 +1 @@ + diff --git a/integrations/last9/assets/images/last9-square-logo.svg b/integrations/last9/assets/images/last9-square-logo.svg new file mode 100644 index 00000000..d7b0d163 --- /dev/null +++ b/integrations/last9/assets/images/last9-square-logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/integrations/last9/manifest.json b/integrations/last9/manifest.json new file mode 100644 index 00000000..217dedab --- /dev/null +++ b/integrations/last9/manifest.json @@ -0,0 +1,101 @@ +{ + "name": "Last9", + "version": "0.0.1", + "overview": "Correlate your dashboards and alerts with LaunchDarkly events.", + "description": "Send what's changing from configuration point to view as events to Last9 for correlation with your dashboards and alerts.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://last9.io/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/last9", + "privacyPolicy": "https://last9.io/privacy/" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/images/last9-square-logo.svg", + "horizontal": "assets/images/last9-horizontal-logo.svg" + }, + "formVariables": [ + { + "key": "endpointUrl", + "name": "Last9 API Base URL", + "description": "Enter your Last9 api base url. Do not include a trailing \"/\".", + "placeholder": "https://{host}/api/v4/organizations/{org}", + "type": "uri", + "isSecret": false + }, + { + "key": "apiToken", + "name": "Enter api write token", + "description": "Enter Last9 API token. This token must have the `write` access to the Last9 API.", + "placeholder": "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijk=", + "type": "string", + "isSecret": true + }, + { + "name": "Last9 tag", + "key": "last9", + "type": "string", + "isOptional": true, + "defaultValue": "", + "description": "If provided, all feature flag events matching the policy filter will be associated with Last9 entities with the same tag." + } + ], + "capabilities": { + "reservedCustomProperties": [ + { + "name": "Last9 tags", + "key": "last9" + } + ], + "auditLogEventsHook": { + "endpoint": { + "url": "{{ endpointUrl }}/events/receiver/launchdarkly", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{ apiToken }}" + } + ] + }, + "templates": { + "default": "templates/default.json.hbs", + "validation": "templates/default.json.hbs" + }, + "includeErrorResponseBody": true, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": [ + "updateFallthrough", + "updateFlagVariations", + "updateFeatureWorkflows", + "updateGlobalArchived", + "updateOffVariation", + "updateOn", + "updatePrerequisites", + "updateRules", + "updateScheduledChanges", + "updateTargets", + "createFlag", + "deleteFlag", + "updateClientSideFlagAvailability", + "updateFlagDefaultVariations", + "updateName", + "updateTemporary", + "createTriggers", + "deleteTriggers", + "updateTriggers", + "updateFlagSalt" + ] + } + ] + } + } +} diff --git a/integrations/last9/templates/default.json.hbs b/integrations/last9/templates/default.json.hbs new file mode 100644 index 00000000..b3917a2c --- /dev/null +++ b/integrations/last9/templates/default.json.hbs @@ -0,0 +1,42 @@ +{ + "version": "1.0", + "userIdentity": { + "userId": "{{member._id}}", + "userEmail": "{{member.email}}" + }, + "eventTime": "{{timestamp.seconds}}", + "eventSource": "launchdarkly", + "eventName": "{{kind}}", + "additionalEventData": { + "action": "{{verbKind}}", + "targetName": "{{target.name}}", + {{#if project}} + "projectKey": "{{project.key}}", + {{/if}} + {{#if _links.details.href}} + "deepLink": "{{_links.details.href}}", + {{/if}} + {{#if project.environment}} + "environmentKey": "{{project.environment.key}}", + {{/if}} + {{#if customProperties}} + "customProperties": { + {{#each customProperties}} + "{{@key}}": ["{{this.values}}"]{{#unless @last}},{{/unless}} + {{/each}} + }, + {{/if}} + {{#if tags}} + "tags": [{{#each tags}}{{#if @index}}, {{/if}}"{{this}}"{{/each}}], + {{/if}} + {{#if details}} + {{#if details.plainText}} + "details": "{{{details.plainText}}}", + {{/if}} + {{/if}} + {{#if comment}} + "comment": "{{{comment}}}", + {{/if}} + "summary": "{{{titleVerb}}} {{#if target.name}}{{{target.name}}}{{else}}{{{target._id}}}{{/if}}" + } +} From 25da71b72290a58e491ed81dabfce45a3ec430bf Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 30 May 2024 11:59:15 -0400 Subject: [PATCH 762/936] merge last9 fix --- integrations/last9/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/last9/manifest.json b/integrations/last9/manifest.json index 217dedab..e18f1df3 100644 --- a/integrations/last9/manifest.json +++ b/integrations/last9/manifest.json @@ -58,7 +58,7 @@ "value": "application/json" }, { - "name": "Authorization", + "name": "X-LAST9-API-TOKEN", "value": "Bearer {{ apiToken }}" } ] From 19c85e8d3373b04642fb1d389c92575e80c7d99e Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 27 Jun 2024 11:12:37 +0200 Subject: [PATCH 763/936] add flagImport capability, add split manifest (#527) --- integrations/split/LICENSE.md | 13 ++++ .../split/assets/images/horizontal.svg | 13 ++++ integrations/split/assets/images/square.svg | 13 ++++ integrations/split/manifest.json | 60 ++++++++++++++++++ .../split/templates/flagList.json.hbs | 6 ++ .../split/templates/flagListEnv.json.hbs | 9 +++ manifest.schema.d.ts | 40 ++++++++++++ manifest.schema.json | 61 ++++++++++++++++++- schemas/base.json | 7 ++- schemas/capabilities/flagImport.json | 51 ++++++++++++++++ 10 files changed, 271 insertions(+), 2 deletions(-) create mode 100644 integrations/split/LICENSE.md create mode 100644 integrations/split/assets/images/horizontal.svg create mode 100644 integrations/split/assets/images/square.svg create mode 100644 integrations/split/manifest.json create mode 100644 integrations/split/templates/flagList.json.hbs create mode 100644 integrations/split/templates/flagListEnv.json.hbs create mode 100644 schemas/capabilities/flagImport.json diff --git a/integrations/split/LICENSE.md b/integrations/split/LICENSE.md new file mode 100644 index 00000000..4e686505 --- /dev/null +++ b/integrations/split/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2024 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/split/assets/images/horizontal.svg b/integrations/split/assets/images/horizontal.svg new file mode 100644 index 00000000..43dc8747 --- /dev/null +++ b/integrations/split/assets/images/horizontal.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/integrations/split/assets/images/square.svg b/integrations/split/assets/images/square.svg new file mode 100644 index 00000000..43dc8747 --- /dev/null +++ b/integrations/split/assets/images/square.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/integrations/split/manifest.json b/integrations/split/manifest.json new file mode 100644 index 00000000..3a24fc43 --- /dev/null +++ b/integrations/split/manifest.json @@ -0,0 +1,60 @@ +{ + "name": "Split", + "version": "1.0.0", + "overview": "Import feature flags from Split to LaunchDarkly.", + "description": "Import feature flags from Split to LaunchDarkly. Customize a tag to be assigned to each flag imported.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://split.com", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["automation", "import"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "workspaceApiKey", + "name": "Split API Key", + "type": "string", + "isSecret": true, + "description": "An API key with read permissions on your Split workspace", + "isOptional": false + }, + { + "key": "workspaceId", + "name": "Split Workspace ID", + "type": "string", + "isSecret": true, + "description": "The ID of the Split Workspace to import from", + "isOptional": false + }, + { + "key": "environmentId", + "name": "Split Environment ID", + "type": "string", + "isSecret": true, + "description": "The ID of the Split environment to import from", + "isOptional": false + }, + { + "key": "tag", + "name": "Tag", + "type": "string", + "description": "A tag to apply to all flags imported from Split. Defaults to 'imported'", + "isOptional": false, + "placeholder": "imported-from-split" + } + ], + "capabilities": { + "flagImport": { + "templates": { + "splitOverview": "templates/flagList.json.hbs", + "splitDetails": "templates/flagListEnv.json.hbs" + }, + "includeErrorResponseBody": true + } + } +} diff --git a/integrations/split/templates/flagList.json.hbs b/integrations/split/templates/flagList.json.hbs new file mode 100644 index 00000000..3a911fd9 --- /dev/null +++ b/integrations/split/templates/flagList.json.hbs @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "name": "name", + "description": "description", + "tags": "tags", +} diff --git a/integrations/split/templates/flagListEnv.json.hbs b/integrations/split/templates/flagListEnv.json.hbs new file mode 100644 index 00000000..380c06bf --- /dev/null +++ b/integrations/split/templates/flagListEnv.json.hbs @@ -0,0 +1,9 @@ +{ + "version": "1.0", + "name": "name", + "variations": "treatments", + "defaults": { + "onVariation": 0, + "offVariation": 0 + } +} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 82f540a0..5baa8b27 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -63,6 +63,7 @@ export type Categories = | "customer-support" | "data" | "developer-tools" + | "import" | "infrastructure" | "issue-tracking" | "log-management" @@ -82,6 +83,7 @@ export type Categories = | "customer-support" | "data" | "developer-tools" + | "import" | "infrastructure" | "issue-tracking" | "log-management" @@ -100,6 +102,7 @@ export type Categories = | "customer-support" | "data" | "developer-tools" + | "import" | "infrastructure" | "issue-tracking" | "log-management" @@ -120,6 +123,7 @@ export type Categories = | "customer-support" | "data" | "developer-tools" + | "import" | "infrastructure" | "issue-tracking" | "log-management" @@ -138,6 +142,7 @@ export type Categories = | "customer-support" | "data" | "developer-tools" + | "import" | "infrastructure" | "issue-tracking" | "log-management" @@ -156,6 +161,7 @@ export type Categories = | "customer-support" | "data" | "developer-tools" + | "import" | "infrastructure" | "issue-tracking" | "log-management" @@ -642,6 +648,22 @@ export type CohortIdPath1 = string; * Describes what type of database LaunchDarkly will sync big segments to */ export type DatabaseStyle = "redis" | "dynamoDB"; +/** + * Template to use for imports from Split + */ +export type SplitTemplate = string; +/** + * Template to use for imports from Split + */ +export type SplitDetailsTemplate = string; +/** + * Template to use for imports from StatSig + */ +export type StatSigTemplate = string; +/** + * Whether errors received while importing should be displayed in the error log in LaunchDarkly UI + */ +export type IncludeErrorResponseBody1 = boolean; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -775,6 +797,7 @@ export interface Capabilities { externalConfigurationPages?: ExternalConfigurationPages; syncedSegment?: SyncedSegment; bigSegmentStore?: BigSegmentStore; + flagImport?: FlagImport; [k: string]: unknown; } /** @@ -1079,3 +1102,20 @@ export interface BigSegmentStore { dbStyle: DatabaseStyle; [k: string]: unknown; } +/** + * This capability enables importing feature flags to LaunchDarkly + */ +export interface FlagImport { + templates: FlagImportBodyTemplate; + includeErrorResponseBody?: IncludeErrorResponseBody1; + [k: string]: unknown; +} +/** + * Templates to use for parsing of the flag import body + */ +export interface FlagImportBodyTemplate { + splitOverview?: SplitTemplate; + splitDetails?: SplitDetailsTemplate; + statsig?: StatSigTemplate; + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index 29bca0bc..9003504a 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -163,6 +163,7 @@ "customer-support", "data", "developer-tools", + "import", "infrastructure", "issue-tracking", "log-management", @@ -691,7 +692,8 @@ "externalConfigurationURL", "externalConfigurationPages", "syncedSegment", - "bigSegmentStore" + "bigSegmentStore", + "flagImport" ] }, "properties": { @@ -4276,6 +4278,63 @@ "description": "Describes what type of database LaunchDarkly will sync big segments to" } } + }, + "flagImport": { + "$id": "#/capability/flagImport", + "title": "Flag Import", + "description": "This capability enables importing feature flags to LaunchDarkly", + "type": "object", + "propertyNames": { + "enum": [ + "includeErrorResponseBody", + "templates" + ] + }, + "required": [ + "templates" + ], + "properties": { + "templates": { + "$id": "#/capability/flagImport/templates", + "title": "Flag import body template", + "description": "Templates to use for parsing of the flag import body", + "type": "object", + "propertyNames": { + "enum": [ + "splitDetails", + "splitOverview", + "statsig" + ] + }, + "properties": { + "splitOverview": { + "$id": "#/capability/flagImport/templates/splitOverview", + "title": "Split template", + "description": "Template to use for imports from Split", + "type": "string" + }, + "splitDetails": { + "$id": "#/capability/flagImport/templates/splitDetails", + "title": "Split Details template", + "description": "Template to use for imports from Split", + "type": "string" + }, + "statsig": { + "$id": "#/capability/flagImport/templates/statsig", + "title": "StatSig template", + "description": "Template to use for imports from StatSig", + "type": "string" + } + } + }, + "includeErrorResponseBody": { + "$id": "#/properties/include-error-response-body", + "title": "Include error response body", + "type": "boolean", + "description": "Whether errors received while importing should be displayed in the error log in LaunchDarkly UI", + "default": true + } + } } } }, diff --git a/schemas/base.json b/schemas/base.json index 54c2c7ec..86878460 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -151,6 +151,7 @@ "customer-support", "data", "developer-tools", + "import", "infrastructure", "issue-tracking", "log-management", @@ -264,7 +265,8 @@ "externalConfigurationURL", "externalConfigurationPages", "syncedSegment", - "bigSegmentStore" + "bigSegmentStore", + "flagImport" ] }, "properties": { @@ -300,6 +302,9 @@ }, "bigSegmentStore": { "$ref": "schemas/capabilities/bigSegmentStore.json#/bigSegmentStore" + }, + "flagImport": { + "$ref": "schemas/capabilities/flagImport.json#/flagImport" } } }, diff --git a/schemas/capabilities/flagImport.json b/schemas/capabilities/flagImport.json new file mode 100644 index 00000000..5af2a744 --- /dev/null +++ b/schemas/capabilities/flagImport.json @@ -0,0 +1,51 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "flagImport": { + "$id": "#/capability/flagImport", + "title": "Flag Import", + "description": "This capability enables importing feature flags to LaunchDarkly", + "type": "object", + "propertyNames": { + "enum": ["includeErrorResponseBody", "templates"] + }, + "required": ["templates"], + "properties": { + "templates": { + "$id": "#/capability/flagImport/templates", + "title": "Flag import body template", + "description": "Templates to use for parsing of the flag import body", + "type": "object", + "propertyNames": { + "enum": ["splitDetails", "splitOverview", "statsig"] + }, + "properties": { + "splitOverview": { + "$id": "#/capability/flagImport/templates/splitOverview", + "title": "Split template", + "description": "Template to use for imports from Split", + "type": "string" + }, + "splitDetails": { + "$id": "#/capability/flagImport/templates/splitDetails", + "title": "Split Details template", + "description": "Template to use for imports from Split", + "type": "string" + }, + "statsig": { + "$id": "#/capability/flagImport/templates/statsig", + "title": "StatSig template", + "description": "Template to use for imports from StatSig", + "type": "string" + } + } + }, + "includeErrorResponseBody": { + "$id": "#/properties/include-error-response-body", + "title": "Include error response body", + "type": "boolean", + "description": "Whether errors received while importing should be displayed in the error log in LaunchDarkly UI", + "default": true + } + } + } +} From c9e79442a161103446bfb8be01710364f02d550e Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 28 Jun 2024 13:31:07 +0200 Subject: [PATCH 764/936] [sc-248580] add dummy manifest (#528) * add dummy manifest * allow only importing a subset of flags * pr feedback: typos --- integrations/homegrown/LICENSE.md | 13 + .../homegrown/assets/images/horizontal.svg | 1 + .../homegrown/assets/images/square.svg | 1 + integrations/homegrown/manifest.json | 41 ++ .../split/assets/images/horizontal.svg | 74 ++- integrations/split/assets/images/square.svg | 61 ++- integrations/split/manifest.json | 14 +- integrations/statsig/LICENSE.md | 13 + .../statsig/assets/images/horizontal.svg | 446 ++++++++++++++++++ integrations/statsig/assets/images/square.svg | 446 ++++++++++++++++++ integrations/statsig/manifest.json | 41 ++ 11 files changed, 1124 insertions(+), 27 deletions(-) create mode 100644 integrations/homegrown/LICENSE.md create mode 100644 integrations/homegrown/assets/images/horizontal.svg create mode 100644 integrations/homegrown/assets/images/square.svg create mode 100644 integrations/homegrown/manifest.json create mode 100644 integrations/statsig/LICENSE.md create mode 100644 integrations/statsig/assets/images/horizontal.svg create mode 100644 integrations/statsig/assets/images/square.svg create mode 100644 integrations/statsig/manifest.json diff --git a/integrations/homegrown/LICENSE.md b/integrations/homegrown/LICENSE.md new file mode 100644 index 00000000..4e686505 --- /dev/null +++ b/integrations/homegrown/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2024 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/homegrown/assets/images/horizontal.svg b/integrations/homegrown/assets/images/horizontal.svg new file mode 100644 index 00000000..47fb4cde --- /dev/null +++ b/integrations/homegrown/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/homegrown/assets/images/square.svg b/integrations/homegrown/assets/images/square.svg new file mode 100644 index 00000000..47fb4cde --- /dev/null +++ b/integrations/homegrown/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/homegrown/manifest.json b/integrations/homegrown/manifest.json new file mode 100644 index 00000000..b511708c --- /dev/null +++ b/integrations/homegrown/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "Homegrown", + "version": "1.0.0", + "overview": "Bring your flags with you to their new home.", + "description": "Let us do the hard work of moving you in. We'll take care of your flags and make sure they're comfortable in their new home.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://launchdarkly.com", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["automation", "import"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "jsonLink", + "name": "JSON Link", + "type": "string", + "isSecret": true, + "description": "A link to a JSON representation of your flags", + "isOptional": false + }, + { + "key": "map", + "name": "JSON Map", + "type": "string", + "description": "Dynamic JSON map of your flag data to LD format", + "isOptional": false, + "placeholder": "TBD" + } + ], + "capabilities": { + "flagImport": { + "templates": {}, + "includeErrorResponseBody": true + } + } +} diff --git a/integrations/split/assets/images/horizontal.svg b/integrations/split/assets/images/horizontal.svg index 43dc8747..46bdf1ae 100644 --- a/integrations/split/assets/images/horizontal.svg +++ b/integrations/split/assets/images/horizontal.svg @@ -1,13 +1,63 @@ - - - - - - + diff --git a/integrations/split/assets/images/square.svg b/integrations/split/assets/images/square.svg index 43dc8747..dbc7302d 100644 --- a/integrations/split/assets/images/square.svg +++ b/integrations/split/assets/images/square.svg @@ -1,13 +1,50 @@ - - - - - - + diff --git a/integrations/split/manifest.json b/integrations/split/manifest.json index 3a24fc43..1269b43e 100644 --- a/integrations/split/manifest.json +++ b/integrations/split/manifest.json @@ -40,10 +40,18 @@ "isOptional": false }, { - "key": "tag", - "name": "Tag", + "key": "splitTag", + "name": "Split Tag", "type": "string", - "description": "A tag to apply to all flags imported from Split. Defaults to 'imported'", + "description": "Provide a tag to only import a subset of your flags from split based on the tag. Leave blank to import all flags.", + "isOptional": true, + "defaultValue": "" + }, + { + "key": "launchdarklyTag", + "name": "LaunchDarkly Tag", + "type": "string", + "description": "A tag to apply to all flags imported from Split. Defaults to 'imported-from-split'", "isOptional": false, "placeholder": "imported-from-split" } diff --git a/integrations/statsig/LICENSE.md b/integrations/statsig/LICENSE.md new file mode 100644 index 00000000..4e686505 --- /dev/null +++ b/integrations/statsig/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2024 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/statsig/assets/images/horizontal.svg b/integrations/statsig/assets/images/horizontal.svg new file mode 100644 index 00000000..1ea91fb4 --- /dev/null +++ b/integrations/statsig/assets/images/horizontal.svg @@ -0,0 +1,446 @@ + + + + +Created by potrace 1.10, written by Peter Selinger 2001-2011 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/statsig/assets/images/square.svg b/integrations/statsig/assets/images/square.svg new file mode 100644 index 00000000..1ea91fb4 --- /dev/null +++ b/integrations/statsig/assets/images/square.svg @@ -0,0 +1,446 @@ + + + + +Created by potrace 1.10, written by Peter Selinger 2001-2011 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/statsig/manifest.json b/integrations/statsig/manifest.json new file mode 100644 index 00000000..5f4f5547 --- /dev/null +++ b/integrations/statsig/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "Statsig", + "version": "1.0.0", + "overview": "Say goodbye to your flags @vijayeraji.", + "description": "Give us all your flags. You know they'll feel better here", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://statsig.com", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["automation", "import"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "statsigApiKey", + "name": "Statsig API Key", + "type": "string", + "isSecret": true, + "description": "An API key with read permissions on your Statsig account", + "isOptional": false + }, + { + "key": "tag", + "name": "Tag", + "type": "string", + "description": "A tag to apply to all flags imported from Statsig. Defaults to 'imported'", + "isOptional": false, + "placeholder": "imported-from-Statsig" + } + ], + "capabilities": { + "flagImport": { + "templates": {}, + "includeErrorResponseBody": true + } + } +} From c7af3049eab2bda23a2497b880112afda9acce1a Mon Sep 17 00:00:00 2001 From: Ember Stevens Date: Wed, 3 Jul 2024 13:19:52 -0700 Subject: [PATCH 765/936] Updates readme --- integrations/appdynamics/README.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/integrations/appdynamics/README.md b/integrations/appdynamics/README.md index 1ee7d7ad..ce70a5d8 100644 --- a/integrations/appdynamics/README.md +++ b/integrations/appdynamics/README.md @@ -1,19 +1,21 @@ # AppDynamics -[User documentation](https://docs.launchdarkly.com/integrations/appdynamics) +[LaunchDarkly documentation](https://docs.launchdarkly.com/integrations/appdynamics) ## Setup -1. Create a new OAuth API client within AppDynamics following the documentation outlined [here](https://docs.appdynamics.com/display/PRO45/API+Clients). Your client will need the **Create Events** permission. +1. Create a new OAuth API client within AppDynamics following the instructions outlined [in the AppDynamics documentation](https://docs.appdynamics.com/display/PRO45/API+Clients). Your client needs the **Create Events** permission. -2. Navigate the the integrations page within LaunchDarkly and configure new AppDynamics integration. You will be prompted to connect via OAuth. At this point, input you will be prompted to enter your **base URL**, **client_id**, and **client_secret**. +2. Navigate the the integrations page within LaunchDarkly and configure new AppDynamics integration. You are prompted to connect using OAuth. -- **base URL**: something like https://launchdarkly-nfr.saas.appdynamics.com -- **client_id**: this will be your AppDynamics account name and name of your newly created API client in the format: `@` -- **client_secret**: This will be the secret generated in step 1. +3. You are prompted to enter your **base URL**, **client_id**, and **client_secret**: + +- **base URL**: this is something similar to https://launchdarkly-nfr.saas.appdynamics.com +- **client_id**: this is your AppDynamics account name and the name of your newly created API client in the format: `@` +- **client_secret**: this is the secret generated in step 1 [API documentation](https://docs.appdynamics.com/display/PRO45/Events+and+Action+Suppression+API) -App dynamics requires the client credentials OAuth 2.0 flow and event information be sent as query parameters. Ensure all query parameters utilize the `queryEncode` helper to avoid 400s. +AppDynamics requires that you send the client credentials OAuth 2.0 flow and event information as query parameters. Ensure all query parameters utilize the `queryEncode` helper to avoid 400s. -Run `npm run curl appdynamics` in the root repository directory to generate a `curl` command to send data to AppDynamics. +Run `npm run curl appdynamics` in the root repository directory to generate a `curl` command to send data to AppDynamics. \ No newline at end of file From 77ff9b6d2c46b3cbe38dad1cca110acbc9d3593d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 17 Jul 2024 11:56:13 +0100 Subject: [PATCH 766/936] [sc-249572] Transfer code ownership to ecosystem team (#530) * Transfore codeowner to ecosystem team * lint --- CODEOWNERS | 2 +- integrations/appdynamics/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index ac1f3570..ef844b72 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,3 @@ # These owners will be the default owners for everything in the repo. -- @launchdarkly/team-app-platform-product +- @launchdarkly/team-ecosystem diff --git a/integrations/appdynamics/README.md b/integrations/appdynamics/README.md index ce70a5d8..19e20e1b 100644 --- a/integrations/appdynamics/README.md +++ b/integrations/appdynamics/README.md @@ -18,4 +18,4 @@ AppDynamics requires that you send the client credentials OAuth 2.0 flow and event information as query parameters. Ensure all query parameters utilize the `queryEncode` helper to avoid 400s. -Run `npm run curl appdynamics` in the root repository directory to generate a `curl` command to send data to AppDynamics. \ No newline at end of file +Run `npm run curl appdynamics` in the root repository directory to generate a `curl` command to send data to AppDynamics. From cc378ca796c5f96c417a70b813f1dd95382f97ff Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 22 Jul 2024 11:07:37 +0100 Subject: [PATCH 767/936] Add release BE (#531) --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index ef844b72..20eabaa5 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,3 @@ # These owners will be the default owners for everything in the repo. -- @launchdarkly/team-ecosystem +- @launchdarkly/team-ecosystem @launchdarkly/team-release-backend From 832c99c4728d53ab5f64a9bd65fdf906f1490bfb Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 22 Jul 2024 12:27:12 +0200 Subject: [PATCH 768/936] remove all references to import for release (#532) --- integrations/homegrown/LICENSE.md | 13 - .../homegrown/assets/images/horizontal.svg | 1 - .../homegrown/assets/images/square.svg | 1 - integrations/homegrown/manifest.json | 41 -- integrations/split/LICENSE.md | 13 - .../split/assets/images/horizontal.svg | 63 --- integrations/split/assets/images/square.svg | 50 -- integrations/split/manifest.json | 68 --- .../split/templates/flagList.json.hbs | 6 - .../split/templates/flagListEnv.json.hbs | 9 - integrations/statsig/LICENSE.md | 13 - .../statsig/assets/images/horizontal.svg | 446 ------------------ integrations/statsig/assets/images/square.svg | 446 ------------------ integrations/statsig/manifest.json | 41 -- manifest.schema.d.ts | 34 -- manifest.schema.json | 60 +-- schemas/base.json | 6 +- schemas/capabilities/flagImport.json | 51 -- 18 files changed, 2 insertions(+), 1360 deletions(-) delete mode 100644 integrations/homegrown/LICENSE.md delete mode 100644 integrations/homegrown/assets/images/horizontal.svg delete mode 100644 integrations/homegrown/assets/images/square.svg delete mode 100644 integrations/homegrown/manifest.json delete mode 100644 integrations/split/LICENSE.md delete mode 100644 integrations/split/assets/images/horizontal.svg delete mode 100644 integrations/split/assets/images/square.svg delete mode 100644 integrations/split/manifest.json delete mode 100644 integrations/split/templates/flagList.json.hbs delete mode 100644 integrations/split/templates/flagListEnv.json.hbs delete mode 100644 integrations/statsig/LICENSE.md delete mode 100644 integrations/statsig/assets/images/horizontal.svg delete mode 100644 integrations/statsig/assets/images/square.svg delete mode 100644 integrations/statsig/manifest.json delete mode 100644 schemas/capabilities/flagImport.json diff --git a/integrations/homegrown/LICENSE.md b/integrations/homegrown/LICENSE.md deleted file mode 100644 index 4e686505..00000000 --- a/integrations/homegrown/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2024 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/homegrown/assets/images/horizontal.svg b/integrations/homegrown/assets/images/horizontal.svg deleted file mode 100644 index 47fb4cde..00000000 --- a/integrations/homegrown/assets/images/horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/homegrown/assets/images/square.svg b/integrations/homegrown/assets/images/square.svg deleted file mode 100644 index 47fb4cde..00000000 --- a/integrations/homegrown/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/homegrown/manifest.json b/integrations/homegrown/manifest.json deleted file mode 100644 index b511708c..00000000 --- a/integrations/homegrown/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "Homegrown", - "version": "1.0.0", - "overview": "Bring your flags with you to their new home.", - "description": "Let us do the hard work of moving you in. We'll take care of your flags and make sure they're comfortable in their new home.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://launchdarkly.com", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["automation", "import"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - "formVariables": [ - { - "key": "jsonLink", - "name": "JSON Link", - "type": "string", - "isSecret": true, - "description": "A link to a JSON representation of your flags", - "isOptional": false - }, - { - "key": "map", - "name": "JSON Map", - "type": "string", - "description": "Dynamic JSON map of your flag data to LD format", - "isOptional": false, - "placeholder": "TBD" - } - ], - "capabilities": { - "flagImport": { - "templates": {}, - "includeErrorResponseBody": true - } - } -} diff --git a/integrations/split/LICENSE.md b/integrations/split/LICENSE.md deleted file mode 100644 index 4e686505..00000000 --- a/integrations/split/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2024 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/split/assets/images/horizontal.svg b/integrations/split/assets/images/horizontal.svg deleted file mode 100644 index 46bdf1ae..00000000 --- a/integrations/split/assets/images/horizontal.svg +++ /dev/null @@ -1,63 +0,0 @@ - diff --git a/integrations/split/assets/images/square.svg b/integrations/split/assets/images/square.svg deleted file mode 100644 index dbc7302d..00000000 --- a/integrations/split/assets/images/square.svg +++ /dev/null @@ -1,50 +0,0 @@ - diff --git a/integrations/split/manifest.json b/integrations/split/manifest.json deleted file mode 100644 index 1269b43e..00000000 --- a/integrations/split/manifest.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "Split", - "version": "1.0.0", - "overview": "Import feature flags from Split to LaunchDarkly.", - "description": "Import feature flags from Split to LaunchDarkly. Customize a tag to be assigned to each flag imported.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://split.com", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["automation", "import"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - "formVariables": [ - { - "key": "workspaceApiKey", - "name": "Split API Key", - "type": "string", - "isSecret": true, - "description": "An API key with read permissions on your Split workspace", - "isOptional": false - }, - { - "key": "workspaceId", - "name": "Split Workspace ID", - "type": "string", - "isSecret": true, - "description": "The ID of the Split Workspace to import from", - "isOptional": false - }, - { - "key": "environmentId", - "name": "Split Environment ID", - "type": "string", - "isSecret": true, - "description": "The ID of the Split environment to import from", - "isOptional": false - }, - { - "key": "splitTag", - "name": "Split Tag", - "type": "string", - "description": "Provide a tag to only import a subset of your flags from split based on the tag. Leave blank to import all flags.", - "isOptional": true, - "defaultValue": "" - }, - { - "key": "launchdarklyTag", - "name": "LaunchDarkly Tag", - "type": "string", - "description": "A tag to apply to all flags imported from Split. Defaults to 'imported-from-split'", - "isOptional": false, - "placeholder": "imported-from-split" - } - ], - "capabilities": { - "flagImport": { - "templates": { - "splitOverview": "templates/flagList.json.hbs", - "splitDetails": "templates/flagListEnv.json.hbs" - }, - "includeErrorResponseBody": true - } - } -} diff --git a/integrations/split/templates/flagList.json.hbs b/integrations/split/templates/flagList.json.hbs deleted file mode 100644 index 3a911fd9..00000000 --- a/integrations/split/templates/flagList.json.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "version": "1.0", - "name": "name", - "description": "description", - "tags": "tags", -} diff --git a/integrations/split/templates/flagListEnv.json.hbs b/integrations/split/templates/flagListEnv.json.hbs deleted file mode 100644 index 380c06bf..00000000 --- a/integrations/split/templates/flagListEnv.json.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{ - "version": "1.0", - "name": "name", - "variations": "treatments", - "defaults": { - "onVariation": 0, - "offVariation": 0 - } -} diff --git a/integrations/statsig/LICENSE.md b/integrations/statsig/LICENSE.md deleted file mode 100644 index 4e686505..00000000 --- a/integrations/statsig/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2024 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/statsig/assets/images/horizontal.svg b/integrations/statsig/assets/images/horizontal.svg deleted file mode 100644 index 1ea91fb4..00000000 --- a/integrations/statsig/assets/images/horizontal.svg +++ /dev/null @@ -1,446 +0,0 @@ - - - - -Created by potrace 1.10, written by Peter Selinger 2001-2011 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/statsig/assets/images/square.svg b/integrations/statsig/assets/images/square.svg deleted file mode 100644 index 1ea91fb4..00000000 --- a/integrations/statsig/assets/images/square.svg +++ /dev/null @@ -1,446 +0,0 @@ - - - - -Created by potrace 1.10, written by Peter Selinger 2001-2011 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/statsig/manifest.json b/integrations/statsig/manifest.json deleted file mode 100644 index 5f4f5547..00000000 --- a/integrations/statsig/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "Statsig", - "version": "1.0.0", - "overview": "Say goodbye to your flags @vijayeraji.", - "description": "Give us all your flags. You know they'll feel better here", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://statsig.com", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["automation", "import"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - "formVariables": [ - { - "key": "statsigApiKey", - "name": "Statsig API Key", - "type": "string", - "isSecret": true, - "description": "An API key with read permissions on your Statsig account", - "isOptional": false - }, - { - "key": "tag", - "name": "Tag", - "type": "string", - "description": "A tag to apply to all flags imported from Statsig. Defaults to 'imported'", - "isOptional": false, - "placeholder": "imported-from-Statsig" - } - ], - "capabilities": { - "flagImport": { - "templates": {}, - "includeErrorResponseBody": true - } - } -} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 5baa8b27..ba65b5ec 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -648,22 +648,6 @@ export type CohortIdPath1 = string; * Describes what type of database LaunchDarkly will sync big segments to */ export type DatabaseStyle = "redis" | "dynamoDB"; -/** - * Template to use for imports from Split - */ -export type SplitTemplate = string; -/** - * Template to use for imports from Split - */ -export type SplitDetailsTemplate = string; -/** - * Template to use for imports from StatSig - */ -export type StatSigTemplate = string; -/** - * Whether errors received while importing should be displayed in the error log in LaunchDarkly UI - */ -export type IncludeErrorResponseBody1 = boolean; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -797,7 +781,6 @@ export interface Capabilities { externalConfigurationPages?: ExternalConfigurationPages; syncedSegment?: SyncedSegment; bigSegmentStore?: BigSegmentStore; - flagImport?: FlagImport; [k: string]: unknown; } /** @@ -1102,20 +1085,3 @@ export interface BigSegmentStore { dbStyle: DatabaseStyle; [k: string]: unknown; } -/** - * This capability enables importing feature flags to LaunchDarkly - */ -export interface FlagImport { - templates: FlagImportBodyTemplate; - includeErrorResponseBody?: IncludeErrorResponseBody1; - [k: string]: unknown; -} -/** - * Templates to use for parsing of the flag import body - */ -export interface FlagImportBodyTemplate { - splitOverview?: SplitTemplate; - splitDetails?: SplitDetailsTemplate; - statsig?: StatSigTemplate; - [k: string]: unknown; -} diff --git a/manifest.schema.json b/manifest.schema.json index 9003504a..ed4cb088 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -692,8 +692,7 @@ "externalConfigurationURL", "externalConfigurationPages", "syncedSegment", - "bigSegmentStore", - "flagImport" + "bigSegmentStore" ] }, "properties": { @@ -4278,63 +4277,6 @@ "description": "Describes what type of database LaunchDarkly will sync big segments to" } } - }, - "flagImport": { - "$id": "#/capability/flagImport", - "title": "Flag Import", - "description": "This capability enables importing feature flags to LaunchDarkly", - "type": "object", - "propertyNames": { - "enum": [ - "includeErrorResponseBody", - "templates" - ] - }, - "required": [ - "templates" - ], - "properties": { - "templates": { - "$id": "#/capability/flagImport/templates", - "title": "Flag import body template", - "description": "Templates to use for parsing of the flag import body", - "type": "object", - "propertyNames": { - "enum": [ - "splitDetails", - "splitOverview", - "statsig" - ] - }, - "properties": { - "splitOverview": { - "$id": "#/capability/flagImport/templates/splitOverview", - "title": "Split template", - "description": "Template to use for imports from Split", - "type": "string" - }, - "splitDetails": { - "$id": "#/capability/flagImport/templates/splitDetails", - "title": "Split Details template", - "description": "Template to use for imports from Split", - "type": "string" - }, - "statsig": { - "$id": "#/capability/flagImport/templates/statsig", - "title": "StatSig template", - "description": "Template to use for imports from StatSig", - "type": "string" - } - } - }, - "includeErrorResponseBody": { - "$id": "#/properties/include-error-response-body", - "title": "Include error response body", - "type": "boolean", - "description": "Whether errors received while importing should be displayed in the error log in LaunchDarkly UI", - "default": true - } - } } } }, diff --git a/schemas/base.json b/schemas/base.json index 86878460..8b1311d8 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -265,8 +265,7 @@ "externalConfigurationURL", "externalConfigurationPages", "syncedSegment", - "bigSegmentStore", - "flagImport" + "bigSegmentStore" ] }, "properties": { @@ -302,9 +301,6 @@ }, "bigSegmentStore": { "$ref": "schemas/capabilities/bigSegmentStore.json#/bigSegmentStore" - }, - "flagImport": { - "$ref": "schemas/capabilities/flagImport.json#/flagImport" } } }, diff --git a/schemas/capabilities/flagImport.json b/schemas/capabilities/flagImport.json deleted file mode 100644 index 5af2a744..00000000 --- a/schemas/capabilities/flagImport.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "flagImport": { - "$id": "#/capability/flagImport", - "title": "Flag Import", - "description": "This capability enables importing feature flags to LaunchDarkly", - "type": "object", - "propertyNames": { - "enum": ["includeErrorResponseBody", "templates"] - }, - "required": ["templates"], - "properties": { - "templates": { - "$id": "#/capability/flagImport/templates", - "title": "Flag import body template", - "description": "Templates to use for parsing of the flag import body", - "type": "object", - "propertyNames": { - "enum": ["splitDetails", "splitOverview", "statsig"] - }, - "properties": { - "splitOverview": { - "$id": "#/capability/flagImport/templates/splitOverview", - "title": "Split template", - "description": "Template to use for imports from Split", - "type": "string" - }, - "splitDetails": { - "$id": "#/capability/flagImport/templates/splitDetails", - "title": "Split Details template", - "description": "Template to use for imports from Split", - "type": "string" - }, - "statsig": { - "$id": "#/capability/flagImport/templates/statsig", - "title": "StatSig template", - "description": "Template to use for imports from StatSig", - "type": "string" - } - } - }, - "includeErrorResponseBody": { - "$id": "#/properties/include-error-response-body", - "title": "Include error response body", - "type": "boolean", - "description": "Whether errors received while importing should be displayed in the error log in LaunchDarkly UI", - "default": true - } - } - } -} From e9a9fae79f9af47d08b7d2fa929cc0247447cd82 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 22 Jul 2024 11:33:34 +0100 Subject: [PATCH 769/936] Revert "remove all references to import for release (#532)" (#533) This reverts commit 832c99c4728d53ab5f64a9bd65fdf906f1490bfb. --- integrations/homegrown/LICENSE.md | 13 + .../homegrown/assets/images/horizontal.svg | 1 + .../homegrown/assets/images/square.svg | 1 + integrations/homegrown/manifest.json | 41 ++ integrations/split/LICENSE.md | 13 + .../split/assets/images/horizontal.svg | 63 +++ integrations/split/assets/images/square.svg | 50 ++ integrations/split/manifest.json | 68 +++ .../split/templates/flagList.json.hbs | 6 + .../split/templates/flagListEnv.json.hbs | 9 + integrations/statsig/LICENSE.md | 13 + .../statsig/assets/images/horizontal.svg | 446 ++++++++++++++++++ integrations/statsig/assets/images/square.svg | 446 ++++++++++++++++++ integrations/statsig/manifest.json | 41 ++ manifest.schema.d.ts | 34 ++ manifest.schema.json | 60 ++- schemas/base.json | 6 +- schemas/capabilities/flagImport.json | 51 ++ 18 files changed, 1360 insertions(+), 2 deletions(-) create mode 100644 integrations/homegrown/LICENSE.md create mode 100644 integrations/homegrown/assets/images/horizontal.svg create mode 100644 integrations/homegrown/assets/images/square.svg create mode 100644 integrations/homegrown/manifest.json create mode 100644 integrations/split/LICENSE.md create mode 100644 integrations/split/assets/images/horizontal.svg create mode 100644 integrations/split/assets/images/square.svg create mode 100644 integrations/split/manifest.json create mode 100644 integrations/split/templates/flagList.json.hbs create mode 100644 integrations/split/templates/flagListEnv.json.hbs create mode 100644 integrations/statsig/LICENSE.md create mode 100644 integrations/statsig/assets/images/horizontal.svg create mode 100644 integrations/statsig/assets/images/square.svg create mode 100644 integrations/statsig/manifest.json create mode 100644 schemas/capabilities/flagImport.json diff --git a/integrations/homegrown/LICENSE.md b/integrations/homegrown/LICENSE.md new file mode 100644 index 00000000..4e686505 --- /dev/null +++ b/integrations/homegrown/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2024 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/homegrown/assets/images/horizontal.svg b/integrations/homegrown/assets/images/horizontal.svg new file mode 100644 index 00000000..47fb4cde --- /dev/null +++ b/integrations/homegrown/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/homegrown/assets/images/square.svg b/integrations/homegrown/assets/images/square.svg new file mode 100644 index 00000000..47fb4cde --- /dev/null +++ b/integrations/homegrown/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/homegrown/manifest.json b/integrations/homegrown/manifest.json new file mode 100644 index 00000000..b511708c --- /dev/null +++ b/integrations/homegrown/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "Homegrown", + "version": "1.0.0", + "overview": "Bring your flags with you to their new home.", + "description": "Let us do the hard work of moving you in. We'll take care of your flags and make sure they're comfortable in their new home.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://launchdarkly.com", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["automation", "import"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "jsonLink", + "name": "JSON Link", + "type": "string", + "isSecret": true, + "description": "A link to a JSON representation of your flags", + "isOptional": false + }, + { + "key": "map", + "name": "JSON Map", + "type": "string", + "description": "Dynamic JSON map of your flag data to LD format", + "isOptional": false, + "placeholder": "TBD" + } + ], + "capabilities": { + "flagImport": { + "templates": {}, + "includeErrorResponseBody": true + } + } +} diff --git a/integrations/split/LICENSE.md b/integrations/split/LICENSE.md new file mode 100644 index 00000000..4e686505 --- /dev/null +++ b/integrations/split/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2024 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/split/assets/images/horizontal.svg b/integrations/split/assets/images/horizontal.svg new file mode 100644 index 00000000..46bdf1ae --- /dev/null +++ b/integrations/split/assets/images/horizontal.svg @@ -0,0 +1,63 @@ + diff --git a/integrations/split/assets/images/square.svg b/integrations/split/assets/images/square.svg new file mode 100644 index 00000000..dbc7302d --- /dev/null +++ b/integrations/split/assets/images/square.svg @@ -0,0 +1,50 @@ + diff --git a/integrations/split/manifest.json b/integrations/split/manifest.json new file mode 100644 index 00000000..1269b43e --- /dev/null +++ b/integrations/split/manifest.json @@ -0,0 +1,68 @@ +{ + "name": "Split", + "version": "1.0.0", + "overview": "Import feature flags from Split to LaunchDarkly.", + "description": "Import feature flags from Split to LaunchDarkly. Customize a tag to be assigned to each flag imported.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://split.com", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["automation", "import"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "workspaceApiKey", + "name": "Split API Key", + "type": "string", + "isSecret": true, + "description": "An API key with read permissions on your Split workspace", + "isOptional": false + }, + { + "key": "workspaceId", + "name": "Split Workspace ID", + "type": "string", + "isSecret": true, + "description": "The ID of the Split Workspace to import from", + "isOptional": false + }, + { + "key": "environmentId", + "name": "Split Environment ID", + "type": "string", + "isSecret": true, + "description": "The ID of the Split environment to import from", + "isOptional": false + }, + { + "key": "splitTag", + "name": "Split Tag", + "type": "string", + "description": "Provide a tag to only import a subset of your flags from split based on the tag. Leave blank to import all flags.", + "isOptional": true, + "defaultValue": "" + }, + { + "key": "launchdarklyTag", + "name": "LaunchDarkly Tag", + "type": "string", + "description": "A tag to apply to all flags imported from Split. Defaults to 'imported-from-split'", + "isOptional": false, + "placeholder": "imported-from-split" + } + ], + "capabilities": { + "flagImport": { + "templates": { + "splitOverview": "templates/flagList.json.hbs", + "splitDetails": "templates/flagListEnv.json.hbs" + }, + "includeErrorResponseBody": true + } + } +} diff --git a/integrations/split/templates/flagList.json.hbs b/integrations/split/templates/flagList.json.hbs new file mode 100644 index 00000000..3a911fd9 --- /dev/null +++ b/integrations/split/templates/flagList.json.hbs @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "name": "name", + "description": "description", + "tags": "tags", +} diff --git a/integrations/split/templates/flagListEnv.json.hbs b/integrations/split/templates/flagListEnv.json.hbs new file mode 100644 index 00000000..380c06bf --- /dev/null +++ b/integrations/split/templates/flagListEnv.json.hbs @@ -0,0 +1,9 @@ +{ + "version": "1.0", + "name": "name", + "variations": "treatments", + "defaults": { + "onVariation": 0, + "offVariation": 0 + } +} diff --git a/integrations/statsig/LICENSE.md b/integrations/statsig/LICENSE.md new file mode 100644 index 00000000..4e686505 --- /dev/null +++ b/integrations/statsig/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2024 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/statsig/assets/images/horizontal.svg b/integrations/statsig/assets/images/horizontal.svg new file mode 100644 index 00000000..1ea91fb4 --- /dev/null +++ b/integrations/statsig/assets/images/horizontal.svg @@ -0,0 +1,446 @@ + + + + +Created by potrace 1.10, written by Peter Selinger 2001-2011 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/statsig/assets/images/square.svg b/integrations/statsig/assets/images/square.svg new file mode 100644 index 00000000..1ea91fb4 --- /dev/null +++ b/integrations/statsig/assets/images/square.svg @@ -0,0 +1,446 @@ + + + + +Created by potrace 1.10, written by Peter Selinger 2001-2011 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/statsig/manifest.json b/integrations/statsig/manifest.json new file mode 100644 index 00000000..5f4f5547 --- /dev/null +++ b/integrations/statsig/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "Statsig", + "version": "1.0.0", + "overview": "Say goodbye to your flags @vijayeraji.", + "description": "Give us all your flags. You know they'll feel better here", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://statsig.com", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["automation", "import"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "statsigApiKey", + "name": "Statsig API Key", + "type": "string", + "isSecret": true, + "description": "An API key with read permissions on your Statsig account", + "isOptional": false + }, + { + "key": "tag", + "name": "Tag", + "type": "string", + "description": "A tag to apply to all flags imported from Statsig. Defaults to 'imported'", + "isOptional": false, + "placeholder": "imported-from-Statsig" + } + ], + "capabilities": { + "flagImport": { + "templates": {}, + "includeErrorResponseBody": true + } + } +} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index ba65b5ec..5baa8b27 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -648,6 +648,22 @@ export type CohortIdPath1 = string; * Describes what type of database LaunchDarkly will sync big segments to */ export type DatabaseStyle = "redis" | "dynamoDB"; +/** + * Template to use for imports from Split + */ +export type SplitTemplate = string; +/** + * Template to use for imports from Split + */ +export type SplitDetailsTemplate = string; +/** + * Template to use for imports from StatSig + */ +export type StatSigTemplate = string; +/** + * Whether errors received while importing should be displayed in the error log in LaunchDarkly UI + */ +export type IncludeErrorResponseBody1 = boolean; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -781,6 +797,7 @@ export interface Capabilities { externalConfigurationPages?: ExternalConfigurationPages; syncedSegment?: SyncedSegment; bigSegmentStore?: BigSegmentStore; + flagImport?: FlagImport; [k: string]: unknown; } /** @@ -1085,3 +1102,20 @@ export interface BigSegmentStore { dbStyle: DatabaseStyle; [k: string]: unknown; } +/** + * This capability enables importing feature flags to LaunchDarkly + */ +export interface FlagImport { + templates: FlagImportBodyTemplate; + includeErrorResponseBody?: IncludeErrorResponseBody1; + [k: string]: unknown; +} +/** + * Templates to use for parsing of the flag import body + */ +export interface FlagImportBodyTemplate { + splitOverview?: SplitTemplate; + splitDetails?: SplitDetailsTemplate; + statsig?: StatSigTemplate; + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index ed4cb088..9003504a 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -692,7 +692,8 @@ "externalConfigurationURL", "externalConfigurationPages", "syncedSegment", - "bigSegmentStore" + "bigSegmentStore", + "flagImport" ] }, "properties": { @@ -4277,6 +4278,63 @@ "description": "Describes what type of database LaunchDarkly will sync big segments to" } } + }, + "flagImport": { + "$id": "#/capability/flagImport", + "title": "Flag Import", + "description": "This capability enables importing feature flags to LaunchDarkly", + "type": "object", + "propertyNames": { + "enum": [ + "includeErrorResponseBody", + "templates" + ] + }, + "required": [ + "templates" + ], + "properties": { + "templates": { + "$id": "#/capability/flagImport/templates", + "title": "Flag import body template", + "description": "Templates to use for parsing of the flag import body", + "type": "object", + "propertyNames": { + "enum": [ + "splitDetails", + "splitOverview", + "statsig" + ] + }, + "properties": { + "splitOverview": { + "$id": "#/capability/flagImport/templates/splitOverview", + "title": "Split template", + "description": "Template to use for imports from Split", + "type": "string" + }, + "splitDetails": { + "$id": "#/capability/flagImport/templates/splitDetails", + "title": "Split Details template", + "description": "Template to use for imports from Split", + "type": "string" + }, + "statsig": { + "$id": "#/capability/flagImport/templates/statsig", + "title": "StatSig template", + "description": "Template to use for imports from StatSig", + "type": "string" + } + } + }, + "includeErrorResponseBody": { + "$id": "#/properties/include-error-response-body", + "title": "Include error response body", + "type": "boolean", + "description": "Whether errors received while importing should be displayed in the error log in LaunchDarkly UI", + "default": true + } + } } } }, diff --git a/schemas/base.json b/schemas/base.json index 8b1311d8..86878460 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -265,7 +265,8 @@ "externalConfigurationURL", "externalConfigurationPages", "syncedSegment", - "bigSegmentStore" + "bigSegmentStore", + "flagImport" ] }, "properties": { @@ -301,6 +302,9 @@ }, "bigSegmentStore": { "$ref": "schemas/capabilities/bigSegmentStore.json#/bigSegmentStore" + }, + "flagImport": { + "$ref": "schemas/capabilities/flagImport.json#/flagImport" } } }, diff --git a/schemas/capabilities/flagImport.json b/schemas/capabilities/flagImport.json new file mode 100644 index 00000000..5af2a744 --- /dev/null +++ b/schemas/capabilities/flagImport.json @@ -0,0 +1,51 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "flagImport": { + "$id": "#/capability/flagImport", + "title": "Flag Import", + "description": "This capability enables importing feature flags to LaunchDarkly", + "type": "object", + "propertyNames": { + "enum": ["includeErrorResponseBody", "templates"] + }, + "required": ["templates"], + "properties": { + "templates": { + "$id": "#/capability/flagImport/templates", + "title": "Flag import body template", + "description": "Templates to use for parsing of the flag import body", + "type": "object", + "propertyNames": { + "enum": ["splitDetails", "splitOverview", "statsig"] + }, + "properties": { + "splitOverview": { + "$id": "#/capability/flagImport/templates/splitOverview", + "title": "Split template", + "description": "Template to use for imports from Split", + "type": "string" + }, + "splitDetails": { + "$id": "#/capability/flagImport/templates/splitDetails", + "title": "Split Details template", + "description": "Template to use for imports from Split", + "type": "string" + }, + "statsig": { + "$id": "#/capability/flagImport/templates/statsig", + "title": "StatSig template", + "description": "Template to use for imports from StatSig", + "type": "string" + } + } + }, + "includeErrorResponseBody": { + "$id": "#/properties/include-error-response-body", + "title": "Include error response body", + "type": "boolean", + "description": "Whether errors received while importing should be displayed in the error log in LaunchDarkly UI", + "default": true + } + } + } +} From abea72b8354c155f8cbeb9b445ece5dea753d0b3 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 24 Jul 2024 15:03:18 +0200 Subject: [PATCH 770/936] add a few fields (#534) --- integrations/split/manifest.json | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/integrations/split/manifest.json b/integrations/split/manifest.json index 1269b43e..0420938f 100644 --- a/integrations/split/manifest.json +++ b/integrations/split/manifest.json @@ -27,7 +27,6 @@ "key": "workspaceId", "name": "Split Workspace ID", "type": "string", - "isSecret": true, "description": "The ID of the Split Workspace to import from", "isOptional": false }, @@ -35,7 +34,6 @@ "key": "environmentId", "name": "Split Environment ID", "type": "string", - "isSecret": true, "description": "The ID of the Split environment to import from", "isOptional": false }, @@ -48,12 +46,29 @@ "defaultValue": "" }, { - "key": "launchdarklyTag", + "key": "ldApiKey", + "name": "Launchdarkly API Key", + "type": "string", + "isSecret": true, + "description": "An API key with create flag permissions on your LaunchDarkly account", + "isOptional": false + }, + { + "key": "ldTag", "name": "LaunchDarkly Tag", "type": "string", "description": "A tag to apply to all flags imported from Split. Defaults to 'imported-from-split'", "isOptional": false, "placeholder": "imported-from-split" + }, + { + "key": "ldMaintainer", + "name": "LaunchDarkly Maintainer", + "type": "string", + "description": "The member id of the LaunchDarkly user who will be the maintainer of the imported flags - defaults to the user who created the integration", + "isOptional": true, + "defaultValue": "", + "isHidden": true } ], "capabilities": { From f09c45e474b7ac6d484b66e9349767ff555c455d Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 25 Jul 2024 19:46:08 +0200 Subject: [PATCH 771/936] remove statsig and homegrown placeholders (#536) --- integrations/homegrown/LICENSE.md | 13 - .../homegrown/assets/images/horizontal.svg | 1 - .../homegrown/assets/images/square.svg | 1 - integrations/homegrown/manifest.json | 41 -- integrations/statsig/LICENSE.md | 13 - .../statsig/assets/images/horizontal.svg | 446 ------------------ integrations/statsig/assets/images/square.svg | 446 ------------------ integrations/statsig/manifest.json | 41 -- 8 files changed, 1002 deletions(-) delete mode 100644 integrations/homegrown/LICENSE.md delete mode 100644 integrations/homegrown/assets/images/horizontal.svg delete mode 100644 integrations/homegrown/assets/images/square.svg delete mode 100644 integrations/homegrown/manifest.json delete mode 100644 integrations/statsig/LICENSE.md delete mode 100644 integrations/statsig/assets/images/horizontal.svg delete mode 100644 integrations/statsig/assets/images/square.svg delete mode 100644 integrations/statsig/manifest.json diff --git a/integrations/homegrown/LICENSE.md b/integrations/homegrown/LICENSE.md deleted file mode 100644 index 4e686505..00000000 --- a/integrations/homegrown/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2024 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/homegrown/assets/images/horizontal.svg b/integrations/homegrown/assets/images/horizontal.svg deleted file mode 100644 index 47fb4cde..00000000 --- a/integrations/homegrown/assets/images/horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/homegrown/assets/images/square.svg b/integrations/homegrown/assets/images/square.svg deleted file mode 100644 index 47fb4cde..00000000 --- a/integrations/homegrown/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/homegrown/manifest.json b/integrations/homegrown/manifest.json deleted file mode 100644 index b511708c..00000000 --- a/integrations/homegrown/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "Homegrown", - "version": "1.0.0", - "overview": "Bring your flags with you to their new home.", - "description": "Let us do the hard work of moving you in. We'll take care of your flags and make sure they're comfortable in their new home.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://launchdarkly.com", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["automation", "import"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - "formVariables": [ - { - "key": "jsonLink", - "name": "JSON Link", - "type": "string", - "isSecret": true, - "description": "A link to a JSON representation of your flags", - "isOptional": false - }, - { - "key": "map", - "name": "JSON Map", - "type": "string", - "description": "Dynamic JSON map of your flag data to LD format", - "isOptional": false, - "placeholder": "TBD" - } - ], - "capabilities": { - "flagImport": { - "templates": {}, - "includeErrorResponseBody": true - } - } -} diff --git a/integrations/statsig/LICENSE.md b/integrations/statsig/LICENSE.md deleted file mode 100644 index 4e686505..00000000 --- a/integrations/statsig/LICENSE.md +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2024 Catamorphic Co. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/integrations/statsig/assets/images/horizontal.svg b/integrations/statsig/assets/images/horizontal.svg deleted file mode 100644 index 1ea91fb4..00000000 --- a/integrations/statsig/assets/images/horizontal.svg +++ /dev/null @@ -1,446 +0,0 @@ - - - - -Created by potrace 1.10, written by Peter Selinger 2001-2011 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/statsig/assets/images/square.svg b/integrations/statsig/assets/images/square.svg deleted file mode 100644 index 1ea91fb4..00000000 --- a/integrations/statsig/assets/images/square.svg +++ /dev/null @@ -1,446 +0,0 @@ - - - - -Created by potrace 1.10, written by Peter Selinger 2001-2011 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/statsig/manifest.json b/integrations/statsig/manifest.json deleted file mode 100644 index 5f4f5547..00000000 --- a/integrations/statsig/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "Statsig", - "version": "1.0.0", - "overview": "Say goodbye to your flags @vijayeraji.", - "description": "Give us all your flags. You know they'll feel better here", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://statsig.com", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "categories": ["automation", "import"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - "formVariables": [ - { - "key": "statsigApiKey", - "name": "Statsig API Key", - "type": "string", - "isSecret": true, - "description": "An API key with read permissions on your Statsig account", - "isOptional": false - }, - { - "key": "tag", - "name": "Tag", - "type": "string", - "description": "A tag to apply to all flags imported from Statsig. Defaults to 'imported'", - "isOptional": false, - "placeholder": "imported-from-Statsig" - } - ], - "capabilities": { - "flagImport": { - "templates": {}, - "includeErrorResponseBody": true - } - } -} From de69d22252afebbff93f9c304cd54c62379a558f Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 29 Jul 2024 15:56:30 +0200 Subject: [PATCH 772/936] update split manifest (#537) --- integrations/split/manifest.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/integrations/split/manifest.json b/integrations/split/manifest.json index 0420938f..5010b4ea 100644 --- a/integrations/split/manifest.json +++ b/integrations/split/manifest.json @@ -57,18 +57,18 @@ "key": "ldTag", "name": "LaunchDarkly Tag", "type": "string", - "description": "A tag to apply to all flags imported from Split. Defaults to 'imported-from-split'", - "isOptional": false, - "placeholder": "imported-from-split" + "description": "A tag to apply to all flags imported from Split to LaunchDarkly.", + "isOptional": true, + "defaultValue": "imported-from-split" }, { "key": "ldMaintainer", "name": "LaunchDarkly Maintainer", "type": "string", - "description": "The member id of the LaunchDarkly user who will be the maintainer of the imported flags - defaults to the user who created the integration", + "description": "The member id of the LaunchDarkly user who will be the maintainer of the imported flags.", "isOptional": true, - "defaultValue": "", - "isHidden": true + "isHidden": true, + "defaultValue": "" } ], "capabilities": { From 01791ad696b552e0218750bbc12098e62644ab14 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 30 Jul 2024 13:22:00 +0200 Subject: [PATCH 773/936] fix casing (#539) --- integrations/split/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/split/manifest.json b/integrations/split/manifest.json index 5010b4ea..982a0109 100644 --- a/integrations/split/manifest.json +++ b/integrations/split/manifest.json @@ -47,7 +47,7 @@ }, { "key": "ldApiKey", - "name": "Launchdarkly API Key", + "name": "LaunchDarkly API Key", "type": "string", "isSecret": true, "description": "An API key with create flag permissions on your LaunchDarkly account", From c3e671519993d7510b14cb68cf4ab19df7959abb Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 31 Jul 2024 16:27:28 +0200 Subject: [PATCH 774/936] [sc-251044] add preliminary custom approvals manifest (#535) * add icons to avoid test failures * updates to manifest * fix spacing * update approve & reject matchers * update jsonBody for create request * oops now update jsonBody for create * udpate copy * fix typo * pr feedback * Forgot to save * render array of strings * change _links and _id to links and id * change to patch for post apply and delete * correctly pull baseURL and apiKey from env vars * make urlTemplate a URL for redirect * remove context. * fix timestamp * only show comment if there is one * fix tags * fix environment * missing } * Switch out comment for details --- .../assets/images/servicenow-horizontal.svg | 1 + .../assets/images/servicenow-icon.svg | 3 + integrations/custom-approvals/manifest.json | 149 ++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 integrations/custom-approvals/assets/images/servicenow-horizontal.svg create mode 100644 integrations/custom-approvals/assets/images/servicenow-icon.svg create mode 100644 integrations/custom-approvals/manifest.json diff --git a/integrations/custom-approvals/assets/images/servicenow-horizontal.svg b/integrations/custom-approvals/assets/images/servicenow-horizontal.svg new file mode 100644 index 00000000..4c76a79d --- /dev/null +++ b/integrations/custom-approvals/assets/images/servicenow-horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/custom-approvals/assets/images/servicenow-icon.svg b/integrations/custom-approvals/assets/images/servicenow-icon.svg new file mode 100644 index 00000000..f676f2c1 --- /dev/null +++ b/integrations/custom-approvals/assets/images/servicenow-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json new file mode 100644 index 00000000..094e9c93 --- /dev/null +++ b/integrations/custom-approvals/manifest.json @@ -0,0 +1,149 @@ +{ + "name": "Custom Approvals", + "version": "1.0.0", + "overview": "Integrate LaunchDarkly approvals with an application of your own design.", + "description": "Integrate LaunchDarkly approvals with an application of your own design.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://launchdarkly.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "icons": { + "square": "assets/images/servicenow-icon.svg", + "horizontal": "assets/images/servicenow-horizontal.svg" + }, + "categories": ["approval"], + "requiresOAuth": false, + "formVariables": [], + "capabilities": { + "approval": { + "name": "Custom Approval Integration", + "flagFormVariables": [], + "environmentFormVariables": [ + { + "key": "apiKey", + "name": "API Token", + "description": "Enter the API your custom service will use to authenticate.", + "placeholder": "e.g. 8M7wS6hCpXVc-DoRnPPY_UCWPgy8aea4Wy6kCe5T", + "type": "string", + "isSecret": true + }, + { + "key": "baseURL", + "name": "Custom approval service base URL", + "description": "The base URL of your custom approval service. This is where all of the API handlers should be set up.", + "type": "string", + "placeholder": "e.g. https://mycustomapprovalservice.com" + } + ], + "creationRequest": { + "endpoint": { + "url": "{{ environment.baseURL }}/api/approvals", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{ environment.apiKey }}" + } + ] + }, + "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\" }", + "parser": { + "approvalId": "/id", + "statusValue": "/result/status", + "statusDisplay": "/result/displayStatus", + "approvalMatcher": "approved", + "rejectionMatcher": "declined", + "urlTemplate": "{{ environment.baseURL }}/approvals?approvalID={{ context.approvalId }}" + } + }, + "statusRequest": { + "endpoint": { + "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/status", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{ environment.apiKey }}" + } + ] + }, + "parser": { + "statusValue": "/result/value", + "statusDisplay": "/result/displayStatus", + "approvalMatcher": "approved", + "rejectionMatcher": "declined" + } + }, + "postApplyRequest": { + "endpoint": { + "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/applied", + "method": "PATCH", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{ environment.apiKey }}" + } + ] + }, + "parser": { + "statusValue": "/result/value", + "statusDisplay": "/result/displayStatus", + "approvalMatcher": "approved", + "rejectionMatcher": "declined" + } + }, + "deletionRequest": { + "endpoint": { + "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/cancel", + "method": "PATCH", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{ environment.apiKey }}" + } + ] + }, + "parser": { + "statusValue": "/result/value", + "statusDisplay": "/result/displayStatus", + "approvalMatcher": "approved", + "rejectionMatcher": "declined" + } + }, + "memberListRequest": { + "endpoint": { + "url": "{{baseURI}}/api/members", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, + "parser": { + "memberArrayPath": "/result", + "memberItems": { + "memberId": "/name", + "email": "/email" + } + } + } + } + } +} From d586d09651772a1e92892eb6ea4535b5bd053ec2 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 1 Aug 2024 12:15:13 +0100 Subject: [PATCH 775/936] Use /result/status as the expected JSON path for Custom Approvals statuses (#540) --- integrations/custom-approvals/manifest.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 094e9c93..fbb97c94 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -1,5 +1,5 @@ { - "name": "Custom Approvals", + "name": "Custom Approvals (alpha)", "version": "1.0.0", "overview": "Integrate LaunchDarkly approvals with an application of your own design.", "description": "Integrate LaunchDarkly approvals with an application of your own design.", @@ -19,7 +19,7 @@ "formVariables": [], "capabilities": { "approval": { - "name": "Custom Approval Integration", + "name": "Custom Approvals (alpha)", "flagFormVariables": [], "environmentFormVariables": [ { @@ -75,7 +75,7 @@ ] }, "parser": { - "statusValue": "/result/value", + "statusValue": "/result/status", "statusDisplay": "/result/displayStatus", "approvalMatcher": "approved", "rejectionMatcher": "declined" @@ -97,7 +97,7 @@ ] }, "parser": { - "statusValue": "/result/value", + "statusValue": "/result/status", "statusDisplay": "/result/displayStatus", "approvalMatcher": "approved", "rejectionMatcher": "declined" @@ -119,7 +119,7 @@ ] }, "parser": { - "statusValue": "/result/value", + "statusValue": "/result/status", "statusDisplay": "/result/displayStatus", "approvalMatcher": "approved", "rejectionMatcher": "declined" From 9747e027361601912c640be86a7e4afad17220f8 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 2 Aug 2024 17:47:29 +0100 Subject: [PATCH 776/936] Tealium: fix regex in inclusion matcher --- integrations/tealium-synced-segments/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/tealium-synced-segments/manifest.json b/integrations/tealium-synced-segments/manifest.json index 3345d1fa..3462b8f0 100644 --- a/integrations/tealium-synced-segments/manifest.json +++ b/integrations/tealium-synced-segments/manifest.json @@ -22,7 +22,7 @@ "cohortNamePath": "/parameters/tealium_cohort_name", "arrayInclusion": { "path": "/action", - "matcher": "^(add_member | remove_member)$" + "matcher": "^(add_member|remove_member)$" }, "memberArrayPath": "/parameters/members", "memberArrayParser": { From 8399357e58feba20fc87976ebf701db50acdfc80 Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 5 Aug 2024 14:52:16 +0200 Subject: [PATCH 777/936] add docs link for split, add new category for split (#543) --- integrations/split/manifest.json | 5 +++-- manifest.schema.d.ts | 6 ++++++ manifest.schema.json | 1 + schemas/base.json | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/integrations/split/manifest.json b/integrations/split/manifest.json index 982a0109..c621bad8 100644 --- a/integrations/split/manifest.json +++ b/integrations/split/manifest.json @@ -6,10 +6,11 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://split.com", + "site": "https://app.split.io", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/flags/import", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["automation", "import"], + "categories": ["automation", "import", "migration"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 5baa8b27..833b79bf 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -68,6 +68,7 @@ export type Categories = | "issue-tracking" | "log-management" | "messaging" + | "migration" | "monitoring" | "synced-segments" | "notifications" @@ -88,6 +89,7 @@ export type Categories = | "issue-tracking" | "log-management" | "messaging" + | "migration" | "monitoring" | "synced-segments" | "notifications" @@ -107,6 +109,7 @@ export type Categories = | "issue-tracking" | "log-management" | "messaging" + | "migration" | "monitoring" | "synced-segments" | "notifications" @@ -128,6 +131,7 @@ export type Categories = | "issue-tracking" | "log-management" | "messaging" + | "migration" | "monitoring" | "synced-segments" | "notifications" @@ -147,6 +151,7 @@ export type Categories = | "issue-tracking" | "log-management" | "messaging" + | "migration" | "monitoring" | "synced-segments" | "notifications" @@ -166,6 +171,7 @@ export type Categories = | "issue-tracking" | "log-management" | "messaging" + | "migration" | "monitoring" | "synced-segments" | "notifications" diff --git a/manifest.schema.json b/manifest.schema.json index 9003504a..1b784560 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -168,6 +168,7 @@ "issue-tracking", "log-management", "messaging", + "migration", "monitoring", "synced-segments", "notifications" diff --git a/schemas/base.json b/schemas/base.json index 86878460..db8609f3 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -156,6 +156,7 @@ "issue-tracking", "log-management", "messaging", + "migration", "monitoring", "synced-segments", "notifications" From 49735380d13c923dc06e21958087aa0a35f9e4ee Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 5 Aug 2024 15:23:29 +0100 Subject: [PATCH 778/936] Add generic icons to custom-approvals integration (#544) --- .../assets/images/horizontal.svg | 655 ++++++++++++++++++ .../assets/images/servicenow-horizontal.svg | 1 - .../assets/images/servicenow-icon.svg | 3 - .../custom-approvals/assets/images/square.svg | 61 ++ integrations/custom-approvals/manifest.json | 4 +- 5 files changed, 718 insertions(+), 6 deletions(-) create mode 100644 integrations/custom-approvals/assets/images/horizontal.svg delete mode 100644 integrations/custom-approvals/assets/images/servicenow-horizontal.svg delete mode 100644 integrations/custom-approvals/assets/images/servicenow-icon.svg create mode 100644 integrations/custom-approvals/assets/images/square.svg diff --git a/integrations/custom-approvals/assets/images/horizontal.svg b/integrations/custom-approvals/assets/images/horizontal.svg new file mode 100644 index 00000000..53c278d5 --- /dev/null +++ b/integrations/custom-approvals/assets/images/horizontal.svg @@ -0,0 +1,655 @@ + + + + +Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/custom-approvals/assets/images/servicenow-horizontal.svg b/integrations/custom-approvals/assets/images/servicenow-horizontal.svg deleted file mode 100644 index 4c76a79d..00000000 --- a/integrations/custom-approvals/assets/images/servicenow-horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/custom-approvals/assets/images/servicenow-icon.svg b/integrations/custom-approvals/assets/images/servicenow-icon.svg deleted file mode 100644 index f676f2c1..00000000 --- a/integrations/custom-approvals/assets/images/servicenow-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/integrations/custom-approvals/assets/images/square.svg b/integrations/custom-approvals/assets/images/square.svg new file mode 100644 index 00000000..e97215d6 --- /dev/null +++ b/integrations/custom-approvals/assets/images/square.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index fbb97c94..e0ee4f78 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -11,8 +11,8 @@ "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "icons": { - "square": "assets/images/servicenow-icon.svg", - "horizontal": "assets/images/servicenow-horizontal.svg" + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" }, "categories": ["approval"], "requiresOAuth": false, From 6ebbeb4980b3ba6293b767d74881e5bfbf8640c5 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 6 Aug 2024 15:40:18 +0200 Subject: [PATCH 779/936] add (#545) --- integrations/custom-approvals/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index e0ee4f78..bea91899 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -53,7 +53,7 @@ } ] }, - "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\" }", + "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\" {{#if comment}}\"comment\": \"{{comment}}\"{{/if}}} }", "parser": { "approvalId": "/id", "statusValue": "/result/status", From 0d8d21011c2c9912f278e137a2c9efe27ec19736 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 6 Aug 2024 15:58:36 +0200 Subject: [PATCH 780/936] [sc-252253] Add comment field to custom approvals 2 (#546) * add * i broke it, fixing --- integrations/custom-approvals/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index bea91899..6dcdd6f9 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -53,7 +53,7 @@ } ] }, - "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\" {{#if comment}}\"comment\": \"{{comment}}\"{{/if}}} }", + "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", {{#if comment}}\"comment\": \"{{comment}}\"{{/if}}} }", "parser": { "approvalId": "/id", "statusValue": "/result/status", From 37ad0822dcc27f641cc13e0639531f0723a6fe88 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 6 Aug 2024 16:21:09 +0200 Subject: [PATCH 781/936] fix again (#547) --- integrations/custom-approvals/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 6dcdd6f9..7aacd511 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -53,7 +53,7 @@ } ] }, - "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", {{#if comment}}\"comment\": \"{{comment}}\"{{/if}}} }", + "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\"{{#if comment}}, \"comment\": \"{{comment}}\"{{/if}}} }", "parser": { "approvalId": "/id", "statusValue": "/result/status", From 9d921a636f553b70228a0027859ddc7dfa679437 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 6 Aug 2024 16:35:16 +0200 Subject: [PATCH 782/936] extra curly brace (#548) --- integrations/custom-approvals/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 7aacd511..f87c5185 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -53,7 +53,7 @@ } ] }, - "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\"{{#if comment}}, \"comment\": \"{{comment}}\"{{/if}}} }", + "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\"{{#if comment}}, \"comment\": \"{{comment}}\"{{/if}} }", "parser": { "approvalId": "/id", "statusValue": "/result/status", From a2fb1435f9a5d2e833f6905a2171bedf0f68c756 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 6 Aug 2024 17:57:45 +0100 Subject: [PATCH 783/936] [sc-251044] Add sample approval form variables to Custom Approvals manfiest. (#549) * Add flagFormVariables * Clean up manifest --- integrations/custom-approvals/manifest.json | 23 ++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index f87c5185..4b1b8c6b 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -19,8 +19,25 @@ "formVariables": [], "capabilities": { "approval": { - "name": "Custom Approvals (alpha)", - "flagFormVariables": [], + "name": "Custom Approvals", + "flagFormVariables": [ + { + "key": "additionalInfo", + "name": "Additional information", + "description": "Add some additional context and it will be passed to the creation request.", + "type": "string", + "isOptional": true + }, + { + "key": "impact", + "name": "Impact", + "description": "What is the impact of this change?", + "type": "enum", + "allowedValues": ["Low", "Medium", "High"], + "defaultValue": "Low", + "isOptional": true + } + ], "environmentFormVariables": [ { "key": "apiKey", @@ -53,7 +70,7 @@ } ] }, - "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\"{{#if comment}}, \"comment\": \"{{comment}}\"{{/if}} }", + "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", \"approvalFormVariables\": { {{#each flagFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{comment}}\" }", "parser": { "approvalId": "/id", "statusValue": "/result/status", From 180b0f16d8a13d4a08b84ce0536b14040d475e9f Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 7 Aug 2024 11:59:18 +0200 Subject: [PATCH 784/936] make template field optional for flag import integrations (#551) --- manifest.schema.d.ts | 2 +- manifest.schema.json | 4 +--- schemas/capabilities/flagImport.json | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 833b79bf..ba8c1684 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -1112,7 +1112,7 @@ export interface BigSegmentStore { * This capability enables importing feature flags to LaunchDarkly */ export interface FlagImport { - templates: FlagImportBodyTemplate; + templates?: FlagImportBodyTemplate; includeErrorResponseBody?: IncludeErrorResponseBody1; [k: string]: unknown; } diff --git a/manifest.schema.json b/manifest.schema.json index 1b784560..cd8a17d7 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -4291,9 +4291,7 @@ "templates" ] }, - "required": [ - "templates" - ], + "required": [], "properties": { "templates": { "$id": "#/capability/flagImport/templates", diff --git a/schemas/capabilities/flagImport.json b/schemas/capabilities/flagImport.json index 5af2a744..e3b7d699 100644 --- a/schemas/capabilities/flagImport.json +++ b/schemas/capabilities/flagImport.json @@ -8,7 +8,7 @@ "propertyNames": { "enum": ["includeErrorResponseBody", "templates"] }, - "required": ["templates"], + "required": [], "properties": { "templates": { "$id": "#/capability/flagImport/templates", From b8d6565eee517c16ac116045ac48806ad9682c61 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 7 Aug 2024 12:02:19 +0200 Subject: [PATCH 785/936] [sc-251520] Add unleash import manifest (#550) * update manifest to remove unused templates * update split manifest to remove unused templates * add unleash manifest * Revert "update manifest to remove unused templates" This reverts commit 288edc57c1c8bd81e5bd3c0f73dbd9c1ebeda137. * Revert "update split manifest to remove unused templates" This reverts commit 58fc01f196543596da4d329b63649257f587ad15. * make template field optional for flag import integrations --- integrations/unleash/LICENSE.md | 13 +++ .../unleash/assets/images/horizontal.svg | 1 + integrations/unleash/assets/images/square.svg | 1 + integrations/unleash/manifest.json | 80 +++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 integrations/unleash/LICENSE.md create mode 100644 integrations/unleash/assets/images/horizontal.svg create mode 100644 integrations/unleash/assets/images/square.svg create mode 100644 integrations/unleash/manifest.json diff --git a/integrations/unleash/LICENSE.md b/integrations/unleash/LICENSE.md new file mode 100644 index 00000000..4e686505 --- /dev/null +++ b/integrations/unleash/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2024 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/unleash/assets/images/horizontal.svg b/integrations/unleash/assets/images/horizontal.svg new file mode 100644 index 00000000..94b9f2bb --- /dev/null +++ b/integrations/unleash/assets/images/horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/unleash/assets/images/square.svg b/integrations/unleash/assets/images/square.svg new file mode 100644 index 00000000..029bec61 --- /dev/null +++ b/integrations/unleash/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/unleash/manifest.json b/integrations/unleash/manifest.json new file mode 100644 index 00000000..21cbc3f7 --- /dev/null +++ b/integrations/unleash/manifest.json @@ -0,0 +1,80 @@ +{ + "name": "Unleash", + "version": "1.0.0", + "overview": "Import feature flags from Unleash to LaunchDarkly.", + "description": "Import feature flags from Unleash to LaunchDarkly. Customize a tag to be assigned to each flag imported.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.getunleash.io", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/flags/import", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["automation", "import", "migration"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "formVariables": [ + { + "key": "sourceApiKey", + "name": "Unleash API Key", + "type": "string", + "isSecret": true, + "description": "An API key with read permissions on your Unleash project", + "isOptional": false + }, + { + "key": "sourceProjectId", + "name": "Unleash Project ID", + "type": "string", + "description": "The ID of the Unleash project to import from", + "isOptional": false + }, + { + "key": "sourceEnvironmentId", + "name": "Unleash Environment ID", + "type": "string", + "description": "The ID of the Unleash environment to import variants from", + "isOptional": false + }, + { + "key": "sourceTag", + "name": "Unleash Tag", + "type": "string", + "description": "Provide a tag to only import a subset of your flags from Unleash based on the tag. Leave blank to import all flags.", + "isOptional": true, + "defaultValue": "" + }, + { + "key": "ldApiKey", + "name": "LaunchDarkly API Key", + "type": "string", + "isSecret": true, + "description": "An API key with create flag permissions on your LaunchDarkly account", + "isOptional": false + }, + { + "key": "ldTag", + "name": "LaunchDarkly Tag", + "type": "string", + "description": "A tag to apply to all flags imported from Unleash to LaunchDarkly.", + "isOptional": true, + "defaultValue": "imported-from-unleash" + }, + { + "key": "ldMaintainer", + "name": "LaunchDarkly Maintainer", + "type": "string", + "description": "The member id of the LaunchDarkly user who will be the maintainer of the imported flags.", + "isOptional": true, + "isHidden": true, + "defaultValue": "" + } + ], + "capabilities": { + "flagImport": { + "includeErrorResponseBody": true + } + } +} From 523153219a76495f7a375c8c09e30fc05cbc020d Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 7 Aug 2024 12:58:07 +0200 Subject: [PATCH 786/936] mark includeErrorResponseBody as required (#554) --- manifest.schema.d.ts | 2 +- manifest.schema.json | 4 +++- schemas/capabilities/flagImport.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index ba8c1684..563ebcad 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -1113,7 +1113,7 @@ export interface BigSegmentStore { */ export interface FlagImport { templates?: FlagImportBodyTemplate; - includeErrorResponseBody?: IncludeErrorResponseBody1; + includeErrorResponseBody: IncludeErrorResponseBody1; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index cd8a17d7..71683af9 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -4291,7 +4291,9 @@ "templates" ] }, - "required": [], + "required": [ + "includeErrorResponseBody" + ], "properties": { "templates": { "$id": "#/capability/flagImport/templates", diff --git a/schemas/capabilities/flagImport.json b/schemas/capabilities/flagImport.json index e3b7d699..b6744a46 100644 --- a/schemas/capabilities/flagImport.json +++ b/schemas/capabilities/flagImport.json @@ -8,7 +8,7 @@ "propertyNames": { "enum": ["includeErrorResponseBody", "templates"] }, - "required": [], + "required": ["includeErrorResponseBody"], "properties": { "templates": { "$id": "#/capability/flagImport/templates", From 467e1d4fff9ac9ef5d7eb42869f2b92eebf83fa2 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 7 Aug 2024 13:06:37 +0200 Subject: [PATCH 787/936] make memberListRequest optional (#555) --- manifest.schema.d.ts | 2 +- manifest.schema.json | 3 +-- schemas/capabilities/approval.json | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 563ebcad..80a0a673 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -866,7 +866,7 @@ export interface TriggerParser { */ export interface Approval { name?: ApprovalSystemName; - memberListRequest: MemberListRequest; + memberListRequest?: MemberListRequest; environmentFormVariables?: EnvironmentFormVariables; flagFormVariables?: FlagFormVariables; creationRequest: CreationRequest; diff --git a/manifest.schema.json b/manifest.schema.json index 71683af9..760d6d46 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1167,8 +1167,7 @@ "creationRequest", "statusRequest", "postApplyRequest", - "deletionRequest", - "memberListRequest" + "deletionRequest" ], "properties": { "name": { diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index b4cfdfb3..c3964bdb 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -21,8 +21,7 @@ "creationRequest", "statusRequest", "postApplyRequest", - "deletionRequest", - "memberListRequest" + "deletionRequest" ], "properties": { "name": { From 9f98ed011cf84568505764d6250b92fe3a3b5875 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 7 Aug 2024 13:07:33 +0200 Subject: [PATCH 788/936] [sc-251540] Add approvalFormVariables to replace flagFormVariables (#552) * add a new approvalFormVariables * update manifests --- integrations/custom-approvals/manifest.json | 20 +- integrations/servicenow-c0/manifest.json | 11 +- integrations/servicenow-normal/manifest.json | 46 ++- manifest.schema.d.ts | 11 +- manifest.schema.json | 414 +++++++++++++++++++ schemas/capabilities/approval.json | 11 + schemas/definitions.json | 1 + 7 files changed, 510 insertions(+), 4 deletions(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 4b1b8c6b..70750383 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -38,6 +38,24 @@ "isOptional": true } ], + "approvalFormVariables": [ + { + "key": "additionalInfo", + "name": "Additional information", + "description": "Add some additional context and it will be passed to the creation request.", + "type": "string", + "isOptional": true + }, + { + "key": "impact", + "name": "Impact", + "description": "What is the impact of this change?", + "type": "enum", + "allowedValues": ["Low", "Medium", "High"], + "defaultValue": "Low", + "isOptional": true + } + ], "environmentFormVariables": [ { "key": "apiKey", @@ -70,7 +88,7 @@ } ] }, - "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", \"approvalFormVariables\": { {{#each flagFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{comment}}\" }", + "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", \"approvalFormVariables\": { {{#if flagFormVariables}}{{#each flagFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}{{else}}{{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}{{/if}} },\"comment\": \"{{comment}}\" }", "parser": { "approvalId": "/id", "statusValue": "/result/status", diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 120b9d94..c5425466 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -37,6 +37,15 @@ "isOptional": true } ], + "approvalFormVariables": [ + { + "key": "assignmentGroup", + "name": "ServiceNow assignment group (override)", + "description": "Your ServiceNow assignment group. This value will override the flag's ServiceNow assignment group custom property.", + "type": "string", + "isOptional": true + } + ], "environmentFormVariables": [ { "key": "username", @@ -79,7 +88,7 @@ } ] }, - "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", + "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}}{{#if approvalFormVariables.assignmentGroup}} \"assignment_group\": \"{{{approvalFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{approvalFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{approvalFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}}{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", diff --git a/integrations/servicenow-normal/manifest.json b/integrations/servicenow-normal/manifest.json index 14e3c4b3..54d7bfde 100644 --- a/integrations/servicenow-normal/manifest.json +++ b/integrations/servicenow-normal/manifest.json @@ -66,6 +66,50 @@ ] } ], + "approvalFormVariables": [ + { + "key": "configurationItem", + "name": "Configuration Item", + "description": "System id of the configuration item associated with the change request.", + "isHidden": true, + "isOptional": true, + "type": "string", + "dependsOn": [ + { + "variableKey": "configItemFlag", + "variableLocation": "environmentFormVariables", + "action": "showField", + "conditions": [ + { + "operator": "equalTo", + "value": "true" + } + ] + } + ] + }, + { + "key": "implementationPlan", + "name": "Implementation Plan", + "description": "Sequential steps to execute to implement this change.", + "isHidden": true, + "isOptional": true, + "type": "string", + "dependsOn": [ + { + "variableKey": "implPlanFlag", + "variableLocation": "environmentFormVariables", + "action": "showField", + "conditions": [ + { + "operator": "equalTo", + "value": "true" + } + ] + } + ] + } + ], "environmentFormVariables": [ { "key": "detail_column", @@ -104,7 +148,7 @@ } ] }, - "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", {{#if flagFormVariables.implementationPlan}}\"implementation_plan\": \"{{{flagFormVariables.implementationPlan}}}\",{{/if}} {{#if flagFormVariables.configurationItem}}\"cmdb_ci\": \"{{{flagFormVariables.configurationItem}}}\",{{/if}} \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\"}", + "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", {{#if flagFormVariables.implementationPlan}}\"implementation_plan\": \"{{{flagFormVariables.implementationPlan}}}\",{{else}}{{#if approvalFormVariables.implementationPlan}}\"implementation_plan\": \"{{{approvalFormVariables.implementationPlan}}}\",{{/if}}{{/if}} {{#if flagFormVariables.configurationItem}}\"cmdb_ci\": \"{{{flagFormVariables.configurationItem}}}\",{{else}}{{#if approvalFormVariables.configurationItem}}\"cmdb_ci\": \"{{{approvalFormVariables.configurationItem}}}\",{{/if}}{{/if}} \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\"}", "parser": { "approvalId": "/result/sys_id/value", "statusValue": "/result/state/value", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 80a0a673..96979d27 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -291,7 +291,11 @@ export type VariableKey = string; /** * Which form variable type is the variable key defined or located in? */ -export type VariableLocation = "flagFormVariables" | "environmentFormVariables" | "formVariables"; +export type VariableLocation = + | "flagFormVariables" + | "approvalFormVariables" + | "environmentFormVariables" + | "formVariables"; /** * Action to be taken when your defined conditions evaluates to true */ @@ -472,6 +476,10 @@ export type EnvironmentFormVariables = FormVariable[]; * Flag-specific form variables that render on the approval request creation modal */ export type FlagFormVariables = FormVariable[]; +/** + * Approval-specific form variables that render on the approval request creation modal + */ +export type ApprovalFormVariables = FormVariable[]; /** * Externally-created approval entity ID */ @@ -869,6 +877,7 @@ export interface Approval { memberListRequest?: MemberListRequest; environmentFormVariables?: EnvironmentFormVariables; flagFormVariables?: FlagFormVariables; + approvalFormVariables?: ApprovalFormVariables; creationRequest: CreationRequest; statusRequest: StatusRequest; postApplyRequest: PostApplyRequest; diff --git a/manifest.schema.json b/manifest.schema.json index 760d6d46..68abd73b 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -604,6 +604,7 @@ "description": "Which form variable type is the variable key defined or located in?", "enum": [ "flagFormVariables", + "approvalFormVariables", "environmentFormVariables", "formVariables" ] @@ -1156,6 +1157,7 @@ "name", "environmentFormVariables", "flagFormVariables", + "approvalFormVariables", "creationRequest", "statusRequest", "postApplyRequest", @@ -1710,6 +1712,7 @@ "description": "Which form variable type is the variable key defined or located in?", "enum": [ "flagFormVariables", + "approvalFormVariables", "environmentFormVariables", "formVariables" ] @@ -2118,6 +2121,416 @@ "description": "Which form variable type is the variable key defined or located in?", "enum": [ "flagFormVariables", + "approvalFormVariables", + "environmentFormVariables", + "formVariables" + ] + }, + "action": { + "$id": "#/definitions/form-variable/depends-on/action", + "title": "Action", + "type": "string", + "enum": [ + "hideField", + "showField" + ], + "description": "Action to be taken when your defined conditions evaluates to true" + }, + "conditions": { + "$id": "#/definitions/form-variable/depends-on/conditions", + "title": "Conditions", + "type": "array", + "description": "Conditional configurations to be evaluated to decide whether an action should taken for the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "operator", + "value" + ] + }, + "required": [ + "operator", + "value" + ], + "properties": { + "operator": { + "$id": "#/definitions/form-variable/depends-on/conditions/operator", + "title": "Operator", + "type": "string", + "description": "Name of the operator for evaluating a condition.", + "enum": [ + "lessThan", + "lessThanOrEqualTo", + "greaterThan", + "greaterThanOrEqualTo", + "equalTo", + "notEqual", + "contains", + "startsWith", + "endsWith" + ] + }, + "value": { + "$id": "#/definitions/form-variable/depends-on/conditions/value", + "title": "Value", + "type": "string", + "maxLength": 250, + "description": "Target value that conditions are evaluated against" + } + } + } + } + } + } + } + }, + "required": [ + "key", + "name", + "type", + "description" + ] + }, + "default": [] + }, + "approvalFormVariables": { + "$id": "#/capabilities/approval/approval-form-variables", + "title": "Approval form variables", + "description": "Approval-specific form variables that render on the approval request creation modal", + "type": "array", + "items": { + "$id": "#/definitions/form-variable", + "title": "Form variable", + "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "description", + "placeholder", + "isSecret", + "isHidden", + "isOptional", + "defaultValue", + "allowedValues", + "dynamicOptions", + "dependsOn" + ] + }, + "properties": { + "key": { + "$id": "#/definitions/form-variable/key", + "title": "Key", + "type": "string", + "description": "A key will be used as the token name when the variable is substituted", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "name": { + "$id": "#/definitions/form-variable/name", + "title": "Name", + "type": "string", + "description": "A descriptive name that will be used as the form label on the UI", + "maxLength": 50 + }, + "type": { + "$id": "#/definitions/form-variable/type", + "title": "Type", + "type": "string", + "description": "The type of the variable", + "enum": [ + "string", + "boolean", + "uri", + "enum", + "oauth", + "dynamicEnum", + "generated" + ] + }, + "description": { + "$id": "#/definitions/form-variable/description", + "title": "Description", + "type": "string", + "description": "Describes the variable in the UI. Markdown links allowed.", + "maxLength": 250 + }, + "placeholder": { + "$id": "#/definitions/form-variable/placeholder", + "title": "Description", + "type": "string", + "description": "Placeholder value to use in the form element if applicable" + }, + "isSecret": { + "$id": "#/definitions/form-variable/is-secret", + "title": "Is this variable a secret?", + "type": "boolean", + "description": "Secret variables will be masked in the UI", + "default": false + }, + "isOptional": { + "$id": "#/definitions/form-variable/is-optional", + "title": "Is this variable optional?", + "type": "boolean", + "description": "Variables marked as optional won't be required on the UI", + "default": false + }, + "isHidden": { + "$id": "#/definitions/form-variable/is-hidden", + "title": "Hide variable in the UI", + "type": "boolean", + "description": "Variables marked as hidden won't be displayed on the UI", + "default": false + }, + "defaultValue": { + "$id": "#/definitions/form-variable/default-value", + "title": "Default value", + "type": [ + "boolean", + "string" + ], + "description": "Default value for variable. Can be overridden by the user in the UI" + }, + "allowedValues": { + "$id": "#/definitions/form-variable/allowed-values", + "title": "Allowed values", + "type": "array", + "description": "Allowed string values for enum-type formVariables", + "items": { + "type": "string" + } + }, + "dynamicOptions": { + "$id": "#/definitions/form-variable/dynamic-options", + "title": "Dynamic options", + "type": "object", + "description": "Parser and endpoint for handling dynamicEnum", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers", + "hmacSignature" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/definitions/form-variable/dynamic-options/parser", + "title": "Dynamic options parser", + "description": "Mapping of property names to location in JSON response", + "type": "object", + "required": [ + "optionsPath", + "optionsItems" + ], + "propertyNames": { + "enum": [ + "optionsPath", + "optionsItems" + ] + }, + "properties": { + "optionsPath": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-path", + "title": "Options array path", + "description": "JSON path to the array containing options for parsing", + "type": "string" + }, + "optionsItems": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items", + "title": "Options array", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/label", + "title": "Label", + "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", + "type": "string" + }, + "value": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/value", + "title": "Value", + "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", + "type": "string" + } + } + } + } + } + } + }, + "dependsOn": { + "$id": "#/definitions/form-variable/depends-on", + "title": "Depends on", + "type": "array", + "description": "Dependency configuration to control the state and visibility of the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "variableKey", + "variableLocation", + "conditions", + "action" + ] + }, + "required": [ + "variableKey", + "variableLocation", + "conditions", + "action" + ], + "properties": { + "variableKey": { + "$id": "#/definitions/form-variable/depends-on/dependee-key", + "title": "Variable key", + "type": "string", + "description": "Key for the form variable that this form field depends on", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "variableLocation": { + "$id": "#/definitions/form-variable/depends-on/dependee-key-location", + "title": "Variable Location", + "type": "string", + "description": "Which form variable type is the variable key defined or located in?", + "enum": [ + "flagFormVariables", + "approvalFormVariables", "environmentFormVariables", "formVariables" ] @@ -3352,6 +3765,7 @@ "description": "Which form variable type is the variable key defined or located in?", "enum": [ "flagFormVariables", + "approvalFormVariables", "environmentFormVariables", "formVariables" ] diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index c3964bdb..c8163da3 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -10,6 +10,7 @@ "name", "environmentFormVariables", "flagFormVariables", + "approvalFormVariables", "creationRequest", "statusRequest", "postApplyRequest", @@ -72,6 +73,16 @@ }, "default": [] }, + "approvalFormVariables": { + "$id": "#/capabilities/approval/approval-form-variables", + "title": "Approval form variables", + "description": "Approval-specific form variables that render on the approval request creation modal", + "type": "array", + "items": { + "$ref": "../definitions.json#/formVariable" + }, + "default": [] + }, "creationRequest": { "$id": "#/capabilities/approval/creation-request", "title": "Creation request", diff --git a/schemas/definitions.json b/schemas/definitions.json index 3d8718de..ce21249c 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -314,6 +314,7 @@ "description": "Which form variable type is the variable key defined or located in?", "enum": [ "flagFormVariables", + "approvalFormVariables", "environmentFormVariables", "formVariables" ] From 74397f06a33fe42b4ffa1e408ab921c084159c36 Mon Sep 17 00:00:00 2001 From: Fabian Date: Wed, 7 Aug 2024 15:53:09 +0200 Subject: [PATCH 789/936] add baseurl field for unleash (#556) --- integrations/unleash/manifest.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/integrations/unleash/manifest.json b/integrations/unleash/manifest.json index 21cbc3f7..81a7aa82 100644 --- a/integrations/unleash/manifest.json +++ b/integrations/unleash/manifest.json @@ -16,6 +16,15 @@ "horizontal": "assets/images/horizontal.svg" }, "formVariables": [ + { + "key": "sourceBaseUrl", + "name": "Unleash Base URL", + "type": "string", + "isSecret": false, + "description": "The base URL used to connect to your Unleash instance", + "isOptional": false, + "placeholder": "https://unleash.mysite.com" + }, { "key": "sourceApiKey", "name": "Unleash API Key", @@ -74,7 +83,7 @@ ], "capabilities": { "flagImport": { - "includeErrorResponseBody": true + "includeErrorResponseBody": false } } } From 216922ad75d3bb49baed511f341b4e7f915ab92f Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 13 Aug 2024 11:56:28 +0100 Subject: [PATCH 790/936] Fix typo in CODEOWNERS files (#557) --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 20eabaa5..f32e2bbc 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,3 @@ # These owners will be the default owners for everything in the repo. -- @launchdarkly/team-ecosystem @launchdarkly/team-release-backend +* @launchdarkly/team-ecosystem @launchdarkly/team-release-backend From 4f0e76ebba36df4cbc14a6cbf8b58724fce1b239 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 20 Aug 2024 15:31:00 +0200 Subject: [PATCH 791/936] remove flag form variables (#559) --- integrations/custom-approvals/manifest.json | 20 +- integrations/servicenow-c0/manifest.json | 11 +- integrations/servicenow-normal/manifest.json | 46 +-- manifest.schema.d.ts | 11 +- manifest.schema.json | 414 ------------------- schemas/capabilities/approval.json | 11 - schemas/definitions.json | 1 - 7 files changed, 4 insertions(+), 510 deletions(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 70750383..44193551 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -20,24 +20,6 @@ "capabilities": { "approval": { "name": "Custom Approvals", - "flagFormVariables": [ - { - "key": "additionalInfo", - "name": "Additional information", - "description": "Add some additional context and it will be passed to the creation request.", - "type": "string", - "isOptional": true - }, - { - "key": "impact", - "name": "Impact", - "description": "What is the impact of this change?", - "type": "enum", - "allowedValues": ["Low", "Medium", "High"], - "defaultValue": "Low", - "isOptional": true - } - ], "approvalFormVariables": [ { "key": "additionalInfo", @@ -88,7 +70,7 @@ } ] }, - "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", \"approvalFormVariables\": { {{#if flagFormVariables}}{{#each flagFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}{{else}}{{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}{{/if}} },\"comment\": \"{{comment}}\" }", + "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{comment}}\" }", "parser": { "approvalId": "/id", "statusValue": "/result/status", diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index c5425466..9e7ddf9c 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -28,15 +28,6 @@ } ], "approval": { - "flagFormVariables": [ - { - "key": "assignmentGroup", - "name": "ServiceNow assignment group (override)", - "description": "Your ServiceNow assignment group. This value will override the flag's ServiceNow assignment group custom property.", - "type": "string", - "isOptional": true - } - ], "approvalFormVariables": [ { "key": "assignmentGroup", @@ -88,7 +79,7 @@ } ] }, - "jsonBody": "{ {{#if flagFormVariables.assignmentGroup}} \"assignment_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{flagFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{flagFormVariables.assignmentGroup}}}\",{{else}}{{#if approvalFormVariables.assignmentGroup}} \"assignment_group\": \"{{{approvalFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{approvalFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{approvalFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}}{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", + "jsonBody": "{ {{#if approvalFormVariables.assignmentGroup}} \"assignment_group\": \"{{{approvalFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{approvalFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{approvalFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", diff --git a/integrations/servicenow-normal/manifest.json b/integrations/servicenow-normal/manifest.json index 54d7bfde..3d0a7600 100644 --- a/integrations/servicenow-normal/manifest.json +++ b/integrations/servicenow-normal/manifest.json @@ -22,50 +22,6 @@ "capabilities": { "approval": { "name": "ServiceNow (Normal Change Request)", - "flagFormVariables": [ - { - "key": "configurationItem", - "name": "Configuration Item", - "description": "System id of the configuration item associated with the change request.", - "isHidden": true, - "isOptional": true, - "type": "string", - "dependsOn": [ - { - "variableKey": "configItemFlag", - "variableLocation": "environmentFormVariables", - "action": "showField", - "conditions": [ - { - "operator": "equalTo", - "value": "true" - } - ] - } - ] - }, - { - "key": "implementationPlan", - "name": "Implementation Plan", - "description": "Sequential steps to execute to implement this change.", - "isHidden": true, - "isOptional": true, - "type": "string", - "dependsOn": [ - { - "variableKey": "implPlanFlag", - "variableLocation": "environmentFormVariables", - "action": "showField", - "conditions": [ - { - "operator": "equalTo", - "value": "true" - } - ] - } - ] - } - ], "approvalFormVariables": [ { "key": "configurationItem", @@ -148,7 +104,7 @@ } ] }, - "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", {{#if flagFormVariables.implementationPlan}}\"implementation_plan\": \"{{{flagFormVariables.implementationPlan}}}\",{{else}}{{#if approvalFormVariables.implementationPlan}}\"implementation_plan\": \"{{{approvalFormVariables.implementationPlan}}}\",{{/if}}{{/if}} {{#if flagFormVariables.configurationItem}}\"cmdb_ci\": \"{{{flagFormVariables.configurationItem}}}\",{{else}}{{#if approvalFormVariables.configurationItem}}\"cmdb_ci\": \"{{{approvalFormVariables.configurationItem}}}\",{{/if}}{{/if}} \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\"}", + "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", {{#if approvalFormVariables.implementationPlan}}\"implementation_plan\": \"{{{approvalFormVariables.implementationPlan}}}\",{{/if}} {{#if approvalFormVariables.configurationItem}}\"cmdb_ci\": \"{{{approvalFormVariables.configurationItem}}}\",{{/if}} \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\"}", "parser": { "approvalId": "/result/sys_id/value", "statusValue": "/result/state/value", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 96979d27..650964b9 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -291,11 +291,7 @@ export type VariableKey = string; /** * Which form variable type is the variable key defined or located in? */ -export type VariableLocation = - | "flagFormVariables" - | "approvalFormVariables" - | "environmentFormVariables" - | "formVariables"; +export type VariableLocation = "approvalFormVariables" | "environmentFormVariables" | "formVariables"; /** * Action to be taken when your defined conditions evaluates to true */ @@ -472,10 +468,6 @@ export type MemberID = string; * Environment-specific form variables that render on the environment approval settings modal */ export type EnvironmentFormVariables = FormVariable[]; -/** - * Flag-specific form variables that render on the approval request creation modal - */ -export type FlagFormVariables = FormVariable[]; /** * Approval-specific form variables that render on the approval request creation modal */ @@ -876,7 +868,6 @@ export interface Approval { name?: ApprovalSystemName; memberListRequest?: MemberListRequest; environmentFormVariables?: EnvironmentFormVariables; - flagFormVariables?: FlagFormVariables; approvalFormVariables?: ApprovalFormVariables; creationRequest: CreationRequest; statusRequest: StatusRequest; diff --git a/manifest.schema.json b/manifest.schema.json index 68abd73b..8130c5a3 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -603,7 +603,6 @@ "type": "string", "description": "Which form variable type is the variable key defined or located in?", "enum": [ - "flagFormVariables", "approvalFormVariables", "environmentFormVariables", "formVariables" @@ -1156,7 +1155,6 @@ "enum": [ "name", "environmentFormVariables", - "flagFormVariables", "approvalFormVariables", "creationRequest", "statusRequest", @@ -1711,416 +1709,6 @@ "type": "string", "description": "Which form variable type is the variable key defined or located in?", "enum": [ - "flagFormVariables", - "approvalFormVariables", - "environmentFormVariables", - "formVariables" - ] - }, - "action": { - "$id": "#/definitions/form-variable/depends-on/action", - "title": "Action", - "type": "string", - "enum": [ - "hideField", - "showField" - ], - "description": "Action to be taken when your defined conditions evaluates to true" - }, - "conditions": { - "$id": "#/definitions/form-variable/depends-on/conditions", - "title": "Conditions", - "type": "array", - "description": "Conditional configurations to be evaluated to decide whether an action should taken for the form field.", - "items": { - "type": "object", - "propertyNames": { - "enum": [ - "operator", - "value" - ] - }, - "required": [ - "operator", - "value" - ], - "properties": { - "operator": { - "$id": "#/definitions/form-variable/depends-on/conditions/operator", - "title": "Operator", - "type": "string", - "description": "Name of the operator for evaluating a condition.", - "enum": [ - "lessThan", - "lessThanOrEqualTo", - "greaterThan", - "greaterThanOrEqualTo", - "equalTo", - "notEqual", - "contains", - "startsWith", - "endsWith" - ] - }, - "value": { - "$id": "#/definitions/form-variable/depends-on/conditions/value", - "title": "Value", - "type": "string", - "maxLength": 250, - "description": "Target value that conditions are evaluated against" - } - } - } - } - } - } - } - }, - "required": [ - "key", - "name", - "type", - "description" - ] - }, - "default": [] - }, - "flagFormVariables": { - "$id": "#/capabilities/approval/flag-form-variables", - "title": "Flag form variables", - "description": "Flag-specific form variables that render on the approval request creation modal", - "type": "array", - "items": { - "$id": "#/definitions/form-variable", - "title": "Form variable", - "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", - "type": "object", - "propertyNames": { - "enum": [ - "key", - "name", - "type", - "description", - "placeholder", - "isSecret", - "isHidden", - "isOptional", - "defaultValue", - "allowedValues", - "dynamicOptions", - "dependsOn" - ] - }, - "properties": { - "key": { - "$id": "#/definitions/form-variable/key", - "title": "Key", - "type": "string", - "description": "A key will be used as the token name when the variable is substituted", - "maxLength": 20, - "pattern": "^[^\\s]*$" - }, - "name": { - "$id": "#/definitions/form-variable/name", - "title": "Name", - "type": "string", - "description": "A descriptive name that will be used as the form label on the UI", - "maxLength": 50 - }, - "type": { - "$id": "#/definitions/form-variable/type", - "title": "Type", - "type": "string", - "description": "The type of the variable", - "enum": [ - "string", - "boolean", - "uri", - "enum", - "oauth", - "dynamicEnum", - "generated" - ] - }, - "description": { - "$id": "#/definitions/form-variable/description", - "title": "Description", - "type": "string", - "description": "Describes the variable in the UI. Markdown links allowed.", - "maxLength": 250 - }, - "placeholder": { - "$id": "#/definitions/form-variable/placeholder", - "title": "Description", - "type": "string", - "description": "Placeholder value to use in the form element if applicable" - }, - "isSecret": { - "$id": "#/definitions/form-variable/is-secret", - "title": "Is this variable a secret?", - "type": "boolean", - "description": "Secret variables will be masked in the UI", - "default": false - }, - "isOptional": { - "$id": "#/definitions/form-variable/is-optional", - "title": "Is this variable optional?", - "type": "boolean", - "description": "Variables marked as optional won't be required on the UI", - "default": false - }, - "isHidden": { - "$id": "#/definitions/form-variable/is-hidden", - "title": "Hide variable in the UI", - "type": "boolean", - "description": "Variables marked as hidden won't be displayed on the UI", - "default": false - }, - "defaultValue": { - "$id": "#/definitions/form-variable/default-value", - "title": "Default value", - "type": [ - "boolean", - "string" - ], - "description": "Default value for variable. Can be overridden by the user in the UI" - }, - "allowedValues": { - "$id": "#/definitions/form-variable/allowed-values", - "title": "Allowed values", - "type": "array", - "description": "Allowed string values for enum-type formVariables", - "items": { - "type": "string" - } - }, - "dynamicOptions": { - "$id": "#/definitions/form-variable/dynamic-options", - "title": "Dynamic options", - "type": "object", - "description": "Parser and endpoint for handling dynamicEnum", - "propertyNames": { - "enum": [ - "endpoint", - "parser" - ] - }, - "required": [ - "endpoint", - "parser" - ], - "properties": { - "endpoint": { - "$id": "#/definitions/endpoint", - "title": "Endpoint", - "description": "Properties that describe an HTTP request to an external endpoint", - "type": "object", - "propertyNames": { - "enum": [ - "url", - "method", - "headers", - "hmacSignature" - ] - }, - "properties": { - "url": { - "$id": "#/definitions/endpoint/url", - "title": "URL", - "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." - }, - "method": { - "$id": "#/definitions/endpoint/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": [ - "POST", - "PUT", - "PATCH", - "GET", - "DELETE" - ], - "type": "string" - }, - "headers": { - "$id": "#/definitions/endpoint/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/definitions/endpoint/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": [ - "name", - "value" - ] - }, - "properties": { - "name": { - "$id": "#/definitions/endpoint/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/definitions/endpoint/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": [ - "name", - "value" - ] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 - }, - "hmacSignature": { - "$id": "#/definitions/endpoint/hmac-signature", - "title": "HMAC signature", - "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", - "type": "object", - "propertyNames": { - "enum": [ - "headerName", - "hmacSecretFormVariableKey" - ] - }, - "properties": { - "headerName": { - "$id": "#/definitions/endpoint/hmac-signature/header-name", - "title": "HMAC signature header name", - "description": "The name of the HMAC signature header", - "type": "string" - }, - "hmacSecretFormVariableKey": { - "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", - "title": "HMAC secret form variable key", - "description": "The name of the form variable field that corresponds to the HMAC encryption secret", - "type": "string" - } - } - } - }, - "required": [ - "url", - "method" - ] - }, - "parser": { - "$id": "#/definitions/form-variable/dynamic-options/parser", - "title": "Dynamic options parser", - "description": "Mapping of property names to location in JSON response", - "type": "object", - "required": [ - "optionsPath", - "optionsItems" - ], - "propertyNames": { - "enum": [ - "optionsPath", - "optionsItems" - ] - }, - "properties": { - "optionsPath": { - "$id": "#/definitions/form-variable/dynamic-options/parser/options-path", - "title": "Options array path", - "description": "JSON path to the array containing options for parsing", - "type": "string" - }, - "optionsItems": { - "$id": "#/definitions/form-variable/dynamic-options/parser/options-items", - "title": "Options array", - "propertyNames": { - "enum": [ - "label", - "value" - ] - }, - "required": [ - "label", - "value" - ], - "properties": { - "label": { - "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/label", - "title": "Label", - "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", - "type": "string" - }, - "value": { - "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/value", - "title": "Value", - "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", - "type": "string" - } - } - } - } - } - } - }, - "dependsOn": { - "$id": "#/definitions/form-variable/depends-on", - "title": "Depends on", - "type": "array", - "description": "Dependency configuration to control the state and visibility of the form field.", - "items": { - "type": "object", - "propertyNames": { - "enum": [ - "variableKey", - "variableLocation", - "conditions", - "action" - ] - }, - "required": [ - "variableKey", - "variableLocation", - "conditions", - "action" - ], - "properties": { - "variableKey": { - "$id": "#/definitions/form-variable/depends-on/dependee-key", - "title": "Variable key", - "type": "string", - "description": "Key for the form variable that this form field depends on", - "maxLength": 20, - "pattern": "^[^\\s]*$" - }, - "variableLocation": { - "$id": "#/definitions/form-variable/depends-on/dependee-key-location", - "title": "Variable Location", - "type": "string", - "description": "Which form variable type is the variable key defined or located in?", - "enum": [ - "flagFormVariables", "approvalFormVariables", "environmentFormVariables", "formVariables" @@ -2529,7 +2117,6 @@ "type": "string", "description": "Which form variable type is the variable key defined or located in?", "enum": [ - "flagFormVariables", "approvalFormVariables", "environmentFormVariables", "formVariables" @@ -3764,7 +3351,6 @@ "type": "string", "description": "Which form variable type is the variable key defined or located in?", "enum": [ - "flagFormVariables", "approvalFormVariables", "environmentFormVariables", "formVariables" diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index c8163da3..b337e9aa 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -9,7 +9,6 @@ "enum": [ "name", "environmentFormVariables", - "flagFormVariables", "approvalFormVariables", "creationRequest", "statusRequest", @@ -63,16 +62,6 @@ }, "default": [] }, - "flagFormVariables": { - "$id": "#/capabilities/approval/flag-form-variables", - "title": "Flag form variables", - "description": "Flag-specific form variables that render on the approval request creation modal", - "type": "array", - "items": { - "$ref": "../definitions.json#/formVariable" - }, - "default": [] - }, "approvalFormVariables": { "$id": "#/capabilities/approval/approval-form-variables", "title": "Approval form variables", diff --git a/schemas/definitions.json b/schemas/definitions.json index ce21249c..1c336140 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -313,7 +313,6 @@ "type": "string", "description": "Which form variable type is the variable key defined or located in?", "enum": [ - "flagFormVariables", "approvalFormVariables", "environmentFormVariables", "formVariables" From 5db9a781f81e7078091ca39fa52c5bcffeecad13 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 20 Aug 2024 14:59:11 +0100 Subject: [PATCH 792/936] update description for unleash key (#558) --- integrations/unleash/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/unleash/manifest.json b/integrations/unleash/manifest.json index 81a7aa82..4e812daf 100644 --- a/integrations/unleash/manifest.json +++ b/integrations/unleash/manifest.json @@ -27,10 +27,10 @@ }, { "key": "sourceApiKey", - "name": "Unleash API Key", + "name": "Unleash SDK Key", "type": "string", "isSecret": true, - "description": "An API key with read permissions on your Unleash project", + "description": "An SDK key for your selected environment.", "isOptional": false }, { From f694a8a16f3dc2de2253077c243afe9bf198c21d Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 21 Aug 2024 15:45:40 +0200 Subject: [PATCH 793/936] [sc-253947] Add new allowadditionalapprovalformvariables (#560) * add new allowAdditionalApprovalFormVariables field to approval capability schema * add allowAdditionalApprovalFormVariables = true to custom approvals --- integrations/custom-approvals/manifest.json | 1 + manifest.schema.d.ts | 83 ++-- manifest.schema.json | 400 ++++++++++---------- schemas/capabilities/approval.json | 48 ++- 4 files changed, 277 insertions(+), 255 deletions(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 44193551..193c27f5 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -38,6 +38,7 @@ "isOptional": true } ], + "allowAdditionalApprovalFormVariables": true, "environmentFormVariables": [ { "key": "apiKey", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 650964b9..5679dd39 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -448,22 +448,6 @@ export type URLPointer = string; * Name of the approval system. Default's to the integration's name if not specified. */ export type ApprovalSystemName = string; -/** - * Template string used to render the JSON request body - */ -export type JSONBody = string; -/** - * JSON path to the array containing integration member details - */ -export type MemberArrayPath = string; -/** - * Relative JSON path to the email field in each member item in the array - */ -export type Email = string; -/** - * Relative JSON path to the integration member ID field in each member item in the array - */ -export type MemberID = string; /** * Environment-specific form variables that render on the environment approval settings modal */ @@ -472,6 +456,14 @@ export type EnvironmentFormVariables = FormVariable[]; * Approval-specific form variables that render on the approval request creation modal */ export type ApprovalFormVariables = FormVariable[]; +/** + * If true, the user can define additional approval form variable fields with which to populate the approval creation request + */ +export type AllowAdditionalApprovalFormVariablesForCreationRequestModal = boolean; +/** + * Template string used to render the JSON request body + */ +export type JSONBody = string; /** * Externally-created approval entity ID */ @@ -496,6 +488,18 @@ export type RejectionMatcher = string; * expected format for the external creation request URL. Values can be substituted in using {{value}} */ export type URLTemplate = string; +/** + * JSON path to the array containing integration member details + */ +export type MemberArrayPath = string; +/** + * Relative JSON path to the email field in each member item in the array + */ +export type Email = string; +/** + * Relative JSON path to the integration member ID field in each member item in the array + */ +export type MemberID = string; /** * Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store */ @@ -866,35 +870,14 @@ export interface TriggerParser { */ export interface Approval { name?: ApprovalSystemName; - memberListRequest?: MemberListRequest; environmentFormVariables?: EnvironmentFormVariables; approvalFormVariables?: ApprovalFormVariables; + allowAdditionalApprovalFormVariables?: AllowAdditionalApprovalFormVariablesForCreationRequestModal; creationRequest: CreationRequest; statusRequest: StatusRequest; postApplyRequest: PostApplyRequest; deletionRequest: DeletionRequest; - [k: string]: unknown; -} -/** - * Describes the HTTP request to get integration users for mapping to Launchdarkly users - */ -export interface MemberListRequest { - endpoint: Endpoint; - jsonBody?: JSONBody; - parser: MemberListParser; - [k: string]: unknown; -} -/** - * Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer - */ -export interface MemberListParser { - memberArrayPath: MemberArrayPath; - memberItems: MemberItemsArray; - [k: string]: unknown; -} -export interface MemberItemsArray { - email: Email; - memberId: MemberID; + memberListRequest?: MemberListRequest; [k: string]: unknown; } /** @@ -945,6 +928,28 @@ export interface DeletionRequest { parser: ApprovalParser; [k: string]: unknown; } +/** + * Describes the HTTP request to get integration users for mapping to Launchdarkly users + */ +export interface MemberListRequest { + endpoint: Endpoint; + jsonBody?: JSONBody; + parser: MemberListParser; + [k: string]: unknown; +} +/** + * Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer + */ +export interface MemberListParser { + memberArrayPath: MemberArrayPath; + memberItems: MemberItemsArray; + [k: string]: unknown; +} +export interface MemberItemsArray { + email: Email; + memberId: MemberID; + [k: string]: unknown; +} /** * This capability allows LaunchDarkly to write feature flag data to a given provider */ diff --git a/manifest.schema.json b/manifest.schema.json index 8130c5a3..4fe7d688 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1156,6 +1156,7 @@ "name", "environmentFormVariables", "approvalFormVariables", + "allowAdditionalApprovalFormVariables", "creationRequest", "statusRequest", "postApplyRequest", @@ -1178,202 +1179,6 @@ "minLength": 1, "maxLength": 100 }, - "memberListRequest": { - "$id": "#/capabilities/approval/member-list-request", - "title": "Member List Request", - "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", - "propertyNames": { - "enum": [ - "endpoint", - "jsonBody", - "parser" - ] - }, - "required": [ - "endpoint", - "parser" - ], - "properties": { - "endpoint": { - "$id": "#/definitions/endpoint", - "title": "Endpoint", - "description": "Properties that describe an HTTP request to an external endpoint", - "type": "object", - "propertyNames": { - "enum": [ - "url", - "method", - "headers", - "hmacSignature" - ] - }, - "properties": { - "url": { - "$id": "#/definitions/endpoint/url", - "title": "URL", - "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." - }, - "method": { - "$id": "#/definitions/endpoint/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": [ - "POST", - "PUT", - "PATCH", - "GET", - "DELETE" - ], - "type": "string" - }, - "headers": { - "$id": "#/definitions/endpoint/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/definitions/endpoint/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": [ - "name", - "value" - ] - }, - "properties": { - "name": { - "$id": "#/definitions/endpoint/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/definitions/endpoint/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": [ - "name", - "value" - ] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 - }, - "hmacSignature": { - "$id": "#/definitions/endpoint/hmac-signature", - "title": "HMAC signature", - "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", - "type": "object", - "propertyNames": { - "enum": [ - "headerName", - "hmacSecretFormVariableKey" - ] - }, - "properties": { - "headerName": { - "$id": "#/definitions/endpoint/hmac-signature/header-name", - "title": "HMAC signature header name", - "description": "The name of the HMAC signature header", - "type": "string" - }, - "hmacSecretFormVariableKey": { - "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", - "title": "HMAC secret form variable key", - "description": "The name of the form variable field that corresponds to the HMAC encryption secret", - "type": "string" - } - } - } - }, - "required": [ - "url", - "method" - ] - }, - "jsonBody": { - "$id": "#/definitions/json-body", - "title": "JSON Body", - "description": "Template string used to render the JSON request body", - "type": "string" - }, - "parser": { - "$id": "#/member-list-parser", - "title": "Member list parser", - "description": "Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer", - "type": "object", - "required": [ - "memberArrayPath", - "memberItems" - ], - "propertyNames": { - "enum": [ - "memberArrayPath", - "memberItems" - ] - }, - "properties": { - "memberArrayPath": { - "$id": "#/member-list-parser/member-array-path", - "title": "Member array path", - "description": "JSON path to the array containing integration member details", - "type": "string" - }, - "memberItems": { - "$id": "#/member-list-parser/member-items", - "title": "Member items array", - "propertyNames": { - "enum": [ - "email", - "memberId" - ] - }, - "required": [ - "email", - "memberId" - ], - "properties": { - "email": { - "$id": "#/member-list-parser/member-items/email", - "title": "Email", - "description": "Relative JSON path to the email field in each member item in the array", - "type": "string" - }, - "memberId": { - "$id": "#/member-list-parser/member-items/member-id", - "title": "Member ID", - "description": "Relative JSON path to the integration member ID field in each member item in the array", - "type": "string" - } - } - } - } - } - } - }, "environmentFormVariables": { "$id": "#/capabilities/approval/environment-form-variables", "title": "Environment form variables", @@ -2190,6 +1995,13 @@ }, "default": [] }, + "allowAdditionalApprovalFormVariables": { + "$id": "#/capabilities/approval/allow-additional-approval-form-variables", + "title": "Allow additional approval form variables for creation request modal", + "description": "If true, the user can define additional approval form variable fields with which to populate the approval creation request", + "type": "boolean", + "default": false + }, "creationRequest": { "$id": "#/capabilities/approval/creation-request", "title": "Creation request", @@ -2996,6 +2808,202 @@ } } } + }, + "memberListRequest": { + "$id": "#/capabilities/approval/member-list-request", + "title": "Member List Request", + "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", + "propertyNames": { + "enum": [ + "endpoint", + "jsonBody", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers", + "hmacSignature" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } + } + }, + "required": [ + "url", + "method" + ] + }, + "jsonBody": { + "$id": "#/definitions/json-body", + "title": "JSON Body", + "description": "Template string used to render the JSON request body", + "type": "string" + }, + "parser": { + "$id": "#/member-list-parser", + "title": "Member list parser", + "description": "Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer", + "type": "object", + "required": [ + "memberArrayPath", + "memberItems" + ], + "propertyNames": { + "enum": [ + "memberArrayPath", + "memberItems" + ] + }, + "properties": { + "memberArrayPath": { + "$id": "#/member-list-parser/member-array-path", + "title": "Member array path", + "description": "JSON path to the array containing integration member details", + "type": "string" + }, + "memberItems": { + "$id": "#/member-list-parser/member-items", + "title": "Member items array", + "propertyNames": { + "enum": [ + "email", + "memberId" + ] + }, + "required": [ + "email", + "memberId" + ], + "properties": { + "email": { + "$id": "#/member-list-parser/member-items/email", + "title": "Email", + "description": "Relative JSON path to the email field in each member item in the array", + "type": "string" + }, + "memberId": { + "$id": "#/member-list-parser/member-items/member-id", + "title": "Member ID", + "description": "Relative JSON path to the integration member ID field in each member item in the array", + "type": "string" + } + } + } + } + } + } } } }, diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index b337e9aa..c600824e 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -10,6 +10,7 @@ "name", "environmentFormVariables", "approvalFormVariables", + "allowAdditionalApprovalFormVariables", "creationRequest", "statusRequest", "postApplyRequest", @@ -32,26 +33,6 @@ "minLength": 1, "maxLength": 100 }, - "memberListRequest": { - "$id": "#/capabilities/approval/member-list-request", - "title": "Member List Request", - "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", - "propertyNames": { - "enum": ["endpoint", "jsonBody", "parser"] - }, - "required": ["endpoint", "parser"], - "properties": { - "endpoint": { - "$ref": "../definitions.json#/endpoint" - }, - "jsonBody": { - "$ref": "../definitions.json#/jsonBody" - }, - "parser": { - "$ref": "parser/parser.json#/memberListParser" - } - } - }, "environmentFormVariables": { "$id": "#/capabilities/approval/environment-form-variables", "title": "Environment form variables", @@ -72,6 +53,13 @@ }, "default": [] }, + "allowAdditionalApprovalFormVariables": { + "$id": "#/capabilities/approval/allow-additional-approval-form-variables", + "title": "Allow additional approval form variables for creation request modal", + "description": "If true, the user can define additional approval form variable fields with which to populate the approval creation request", + "type": "boolean", + "default": false + }, "creationRequest": { "$id": "#/capabilities/approval/creation-request", "title": "Creation request", @@ -151,6 +139,26 @@ "$ref": "parser/parser.json#/approvalParser" } } + }, + "memberListRequest": { + "$id": "#/capabilities/approval/member-list-request", + "title": "Member List Request", + "description": "Describes the HTTP request to get integration users for mapping to Launchdarkly users", + "propertyNames": { + "enum": ["endpoint", "jsonBody", "parser"] + }, + "required": ["endpoint", "parser"], + "properties": { + "endpoint": { + "$ref": "../definitions.json#/endpoint" + }, + "jsonBody": { + "$ref": "../definitions.json#/jsonBody" + }, + "parser": { + "$ref": "parser/parser.json#/memberListParser" + } + } } } } From 10fec1289b3686e2015ba0a33a56b3b17747b618 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 21 Aug 2024 15:24:11 +0100 Subject: [PATCH 794/936] Update MS Teams templates to support new Adaptive card format (#561) --- .../msteams/templates/default.json.hbs | 34 ++++++++++++++----- .../msteams/templates/environment.json.hbs | 34 ++++++++++++++----- .../msteams/templates/project.json.hbs | 28 ++++++++++----- 3 files changed, 70 insertions(+), 26 deletions(-) diff --git a/integrations/msteams/templates/default.json.hbs b/integrations/msteams/templates/default.json.hbs index 74891314..75fbbc4f 100644 --- a/integrations/msteams/templates/default.json.hbs +++ b/integrations/msteams/templates/default.json.hbs @@ -1,14 +1,30 @@ { - "@type": "MessageCard", - "@context": "http://schema.org/extensions", - "themeColor": "0076D7", - "summary": "{{{title.plainText}}}", - "sections": [ + "type":"message", + "attachments":[ { - "activityTitle": "{{{title.html}}}{{#equal project.environment.key '~'}} in all environments{{/equal}}", - "activitySubtitle": "{{#if project.name}}{{project.name}}{{#if project.environment.name}} / {{project.environment.name}}{{/if}} / {{name}}{{/if}}", - "text": "{{#if details}}{{{details.html}}}{{/if}}{{#if comment}}\nComment: {{{comment}}}\n{{/if}}", - "xml": true + "contentType":"application/vnd.microsoft.card.adaptive", + "contentUrl":null, + "content":{ + "$schema":"http://adaptivecards.io/schemas/adaptive-card.json", + "type":"AdaptiveCard", + "version":"1.2", + "body":[ + { + "type": "TextBlock", + "text": "{{{title.markdown}}}{{#equal project.environment.key '~'}} in all environments{{/equal}}", + "weight": "bolder" + }, + { + "type": "TextBlock", + "text": "{{#if project.name}}{{project.name}}{{#if project.environment.name}} / {{project.environment.name}}{{/if}} / {{name}}{{/if}}", + "isSubtle": true + }, + { + "type": "TextBlock", + "text": "{{#if details}}{{{details.markdown}}}{{/if}}{{#if comment}}\n**Comment:** {{{comment}}}\n{{/if}}" + } + ] + } } ] } diff --git a/integrations/msteams/templates/environment.json.hbs b/integrations/msteams/templates/environment.json.hbs index 9c49a57e..75aa7387 100644 --- a/integrations/msteams/templates/environment.json.hbs +++ b/integrations/msteams/templates/environment.json.hbs @@ -1,14 +1,30 @@ { - "@type": "MessageCard", - "@context": "http://schema.org/extensions", - "themeColor": "0076D7", - "summary": "{{{title.plainText}}}", - "sections": [ + "type":"message", + "attachments":[ { - "activityTitle": "{{{title.html}}}", - "activitySubtitle": "{{project.name}} / {{name}}", - "text": "{{#if details}}{{{details.html}}}{{/if}}{{#if comment}}\nComment: {{{comment}}}\n{{/if}}", - "xml": true + "contentType":"application/vnd.microsoft.card.adaptive", + "contentUrl":null, + "content":{ + "$schema":"http://adaptivecards.io/schemas/adaptive-card.json", + "type":"AdaptiveCard", + "version":"1.2", + "body":[ + { + "type": "TextBlock", + "text": "{{{title.markdown}}}", + "weight": "bolder" + }, + { + "type": "TextBlock", + "text": "{{project.name}} / {{name}}", + "isSubtle": true + }, + { + "type": "TextBlock", + "text": "{{#if details}}{{{details.markdown}}}{{/if}}{{#if comment}}\n**Comment:** {{{comment}}}\n{{/if}}" + } + ] + } } ] } diff --git a/integrations/msteams/templates/project.json.hbs b/integrations/msteams/templates/project.json.hbs index f59567c0..d17d231d 100644 --- a/integrations/msteams/templates/project.json.hbs +++ b/integrations/msteams/templates/project.json.hbs @@ -1,13 +1,25 @@ { - "@type": "MessageCard", - "@context": "http://schema.org/extensions", - "themeColor": "0076D7", - "summary": "{{{title.plainText}}}", - "sections": [ + "type":"message", + "attachments":[ { - "activityTitle": "{{{title.html}}}", - "text": "{{#if details}}{{{details.html}}}{{/if}}{{#if comment}}\nComment: {{{comment}}}\n{{/if}}", - "xml": true + "contentType":"application/vnd.microsoft.card.adaptive", + "contentUrl":null, + "content":{ + "$schema":"http://adaptivecards.io/schemas/adaptive-card.json", + "type":"AdaptiveCard", + "version":"1.2", + "body":[ + { + "type": "TextBlock", + "text": "{{{title.markdown}}}", + "weight": "bolder" + }, + { + "type": "TextBlock", + "text": "{{#if details}}{{{details.markdown}}}{{/if}}{{#if comment}}\n**Comment:** {{{comment}}}\n{{/if}}" + } + ] + } } ] } From 6e5dc85218f820613156c4a23134d910af093048 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 21 Aug 2024 16:00:13 +0100 Subject: [PATCH 795/936] [sc-253948] MS Teams: don't HTML escape URI and wrap all text blocks (#562) * MS Teams: don't HTML escape URI and wrap all text blocks * MS Teams: don't HTML escape URI and wrap all text blocks --- integrations/msteams/manifest.json | 2 +- integrations/msteams/templates/default.json.hbs | 9 ++++++--- integrations/msteams/templates/environment.json.hbs | 9 ++++++--- integrations/msteams/templates/project.json.hbs | 6 ++++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index e943afc1..b2c92b3b 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -27,7 +27,7 @@ "capabilities": { "auditLogEventsHook": { "endpoint": { - "url": "{{url}}", + "url": "{{{url}}}", "method": "POST", "headers": [ { diff --git a/integrations/msteams/templates/default.json.hbs b/integrations/msteams/templates/default.json.hbs index 75fbbc4f..125aa1d9 100644 --- a/integrations/msteams/templates/default.json.hbs +++ b/integrations/msteams/templates/default.json.hbs @@ -12,16 +12,19 @@ { "type": "TextBlock", "text": "{{{title.markdown}}}{{#equal project.environment.key '~'}} in all environments{{/equal}}", - "weight": "bolder" + "weight": "bolder", + "wrap": true }, { "type": "TextBlock", "text": "{{#if project.name}}{{project.name}}{{#if project.environment.name}} / {{project.environment.name}}{{/if}} / {{name}}{{/if}}", - "isSubtle": true + "isSubtle": true, + "wrap": true }, { "type": "TextBlock", - "text": "{{#if details}}{{{details.markdown}}}{{/if}}{{#if comment}}\n**Comment:** {{{comment}}}\n{{/if}}" + "text": "{{#if details}}{{{details.markdown}}}{{/if}}{{#if comment}}\n**Comment:** {{{comment}}}\n{{/if}}", + "wrap": true } ] } diff --git a/integrations/msteams/templates/environment.json.hbs b/integrations/msteams/templates/environment.json.hbs index 75aa7387..128a876d 100644 --- a/integrations/msteams/templates/environment.json.hbs +++ b/integrations/msteams/templates/environment.json.hbs @@ -12,16 +12,19 @@ { "type": "TextBlock", "text": "{{{title.markdown}}}", - "weight": "bolder" + "weight": "bolder", + "wrap": true }, { "type": "TextBlock", "text": "{{project.name}} / {{name}}", - "isSubtle": true + "isSubtle": true, + "wrap": true }, { "type": "TextBlock", - "text": "{{#if details}}{{{details.markdown}}}{{/if}}{{#if comment}}\n**Comment:** {{{comment}}}\n{{/if}}" + "text": "{{#if details}}{{{details.markdown}}}{{/if}}{{#if comment}}\n**Comment:** {{{comment}}}\n{{/if}}", + "wrap": true } ] } diff --git a/integrations/msteams/templates/project.json.hbs b/integrations/msteams/templates/project.json.hbs index d17d231d..32f60abc 100644 --- a/integrations/msteams/templates/project.json.hbs +++ b/integrations/msteams/templates/project.json.hbs @@ -12,11 +12,13 @@ { "type": "TextBlock", "text": "{{{title.markdown}}}", - "weight": "bolder" + "weight": "bolder", + "wrap": true }, { "type": "TextBlock", - "text": "{{#if details}}{{{details.markdown}}}{{/if}}{{#if comment}}\n**Comment:** {{{comment}}}\n{{/if}}" + "text": "{{#if details}}{{{details.markdown}}}{{/if}}{{#if comment}}\n**Comment:** {{{comment}}}\n{{/if}}", + "wrap": true } ] } From 313527743a7311744afb01973a5114806fce2b59 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 26 Aug 2024 17:22:10 +0200 Subject: [PATCH 796/936] comment is actually approvalDescription (#564) --- integrations/custom-approvals/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 193c27f5..59500b3e 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -71,7 +71,7 @@ } ] }, - "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{comment}}\" }", + "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{approvalDescription}}\" }", "parser": { "approvalId": "/id", "statusValue": "/result/status", From 9ad896cbc0a83156c5b22639b8aa8f88554fd251 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 27 Aug 2024 16:43:15 +0200 Subject: [PATCH 797/936] [sc-254510] Change allowAdditionalApprovalFormVariables to allowApprovalIntegrationConfigurations (#565) * add custom-approvals-v2 manifest to circumvent cba * add allowApprovalIntegrationConfigurations --- .../assets/images/horizontal.svg | 655 ++++++++++++++++++ .../assets/images/square.svg | 61 ++ .../custom-approvals-v2/manifest.json | 166 +++++ integrations/custom-approvals/manifest.json | 1 + manifest.schema.d.ts | 5 + manifest.schema.json | 8 + schemas/capabilities/approval.json | 8 + 7 files changed, 904 insertions(+) create mode 100644 integrations/custom-approvals-v2/assets/images/horizontal.svg create mode 100644 integrations/custom-approvals-v2/assets/images/square.svg create mode 100644 integrations/custom-approvals-v2/manifest.json diff --git a/integrations/custom-approvals-v2/assets/images/horizontal.svg b/integrations/custom-approvals-v2/assets/images/horizontal.svg new file mode 100644 index 00000000..53c278d5 --- /dev/null +++ b/integrations/custom-approvals-v2/assets/images/horizontal.svg @@ -0,0 +1,655 @@ + + + + +Created by potrace 1.15, written by Peter Selinger 2001-2017 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/custom-approvals-v2/assets/images/square.svg b/integrations/custom-approvals-v2/assets/images/square.svg new file mode 100644 index 00000000..e97215d6 --- /dev/null +++ b/integrations/custom-approvals-v2/assets/images/square.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + diff --git a/integrations/custom-approvals-v2/manifest.json b/integrations/custom-approvals-v2/manifest.json new file mode 100644 index 00000000..bb58a0c2 --- /dev/null +++ b/integrations/custom-approvals-v2/manifest.json @@ -0,0 +1,166 @@ +{ + "name": "Custom Approvals (alpha)", + "version": "1.0.0", + "overview": "Integrate LaunchDarkly approvals with an application of your own design.", + "description": "Integrate LaunchDarkly approvals with an application of your own design.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://launchdarkly.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "categories": ["approval"], + "requiresOAuth": false, + "formVariables": [ + { + "key": "apiKey", + "name": "API Token", + "description": "Enter the API your custom service will use to authenticate.", + "placeholder": "e.g. 8M7wS6hCpXVc-DoRnPPY_UCWPgy8aea4Wy6kCe5T", + "type": "string", + "isSecret": true + }, + { + "key": "baseURL", + "name": "Custom approval service base URL", + "description": "The base URL of your custom approval service. This is where all of the API handlers should be set up.", + "type": "string", + "placeholder": "e.g. https://mycustomapprovalservice.com" + } + ], + "capabilities": { + "approval": { + "name": "Custom Approvals", + "approvalFormVariables": [ + { + "key": "additionalInfo", + "name": "Additional information", + "description": "Add some additional context and it will be passed to the creation request.", + "type": "string", + "isOptional": true + }, + { + "key": "impact", + "name": "Impact", + "description": "What is the impact of this change?", + "type": "enum", + "allowedValues": ["Low", "Medium", "High"], + "defaultValue": "Low", + "isOptional": true + } + ], + "allowApprovalIntegrationConfigurations": true, + "creationRequest": { + "endpoint": { + "url": "{{ environment.baseURL }}/api/approvals", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{ environment.apiKey }}" + } + ] + }, + "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{approvalDescription}}\" }", + "parser": { + "approvalId": "/id", + "statusValue": "/result/status", + "statusDisplay": "/result/displayStatus", + "approvalMatcher": "approved", + "rejectionMatcher": "declined", + "urlTemplate": "{{ environment.baseURL }}/approvals?approvalID={{ context.approvalId }}" + } + }, + "statusRequest": { + "endpoint": { + "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/status", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{ environment.apiKey }}" + } + ] + }, + "parser": { + "statusValue": "/result/status", + "statusDisplay": "/result/displayStatus", + "approvalMatcher": "approved", + "rejectionMatcher": "declined" + } + }, + "postApplyRequest": { + "endpoint": { + "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/applied", + "method": "PATCH", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{ environment.apiKey }}" + } + ] + }, + "parser": { + "statusValue": "/result/status", + "statusDisplay": "/result/displayStatus", + "approvalMatcher": "approved", + "rejectionMatcher": "declined" + } + }, + "deletionRequest": { + "endpoint": { + "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/cancel", + "method": "PATCH", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{ environment.apiKey }}" + } + ] + }, + "parser": { + "statusValue": "/result/status", + "statusDisplay": "/result/displayStatus", + "approvalMatcher": "approved", + "rejectionMatcher": "declined" + } + }, + "memberListRequest": { + "endpoint": { + "url": "{{baseURI}}/api/members", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, + "parser": { + "memberArrayPath": "/result", + "memberItems": { + "memberId": "/name", + "email": "/email" + } + } + } + } + } +} diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 59500b3e..10be7963 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -39,6 +39,7 @@ } ], "allowAdditionalApprovalFormVariables": true, + "allowApprovalIntegrationConfigurations": true, "environmentFormVariables": [ { "key": "apiKey", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 5679dd39..d823a577 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -460,6 +460,10 @@ export type ApprovalFormVariables = FormVariable[]; * If true, the user can define additional approval form variable fields with which to populate the approval creation request */ export type AllowAdditionalApprovalFormVariablesForCreationRequestModal = boolean; +/** + * If true, the user can create integration configurations associated with this integration's approval capability. Requires formVariables to be defined + */ +export type AllowUsersToConfigureIntegrationConfigurationsForApprovals = boolean; /** * Template string used to render the JSON request body */ @@ -873,6 +877,7 @@ export interface Approval { environmentFormVariables?: EnvironmentFormVariables; approvalFormVariables?: ApprovalFormVariables; allowAdditionalApprovalFormVariables?: AllowAdditionalApprovalFormVariablesForCreationRequestModal; + allowApprovalIntegrationConfigurations?: AllowUsersToConfigureIntegrationConfigurationsForApprovals; creationRequest: CreationRequest; statusRequest: StatusRequest; postApplyRequest: PostApplyRequest; diff --git a/manifest.schema.json b/manifest.schema.json index 4fe7d688..6768b059 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1157,6 +1157,7 @@ "environmentFormVariables", "approvalFormVariables", "allowAdditionalApprovalFormVariables", + "allowApprovalIntegrationConfigurations", "creationRequest", "statusRequest", "postApplyRequest", @@ -2002,6 +2003,13 @@ "type": "boolean", "default": false }, + "allowApprovalIntegrationConfigurations": { + "$id": "#/capabilities/approval/allow-approval-integration-configurations", + "title": "Allow users to configure integration configurations for approvals", + "description": "If true, the user can create integration configurations associated with this integration's approval capability. Requires formVariables to be defined", + "type": "boolean", + "default": false + }, "creationRequest": { "$id": "#/capabilities/approval/creation-request", "title": "Creation request", diff --git a/schemas/capabilities/approval.json b/schemas/capabilities/approval.json index c600824e..7f2b8464 100644 --- a/schemas/capabilities/approval.json +++ b/schemas/capabilities/approval.json @@ -11,6 +11,7 @@ "environmentFormVariables", "approvalFormVariables", "allowAdditionalApprovalFormVariables", + "allowApprovalIntegrationConfigurations", "creationRequest", "statusRequest", "postApplyRequest", @@ -60,6 +61,13 @@ "type": "boolean", "default": false }, + "allowApprovalIntegrationConfigurations": { + "$id": "#/capabilities/approval/allow-approval-integration-configurations", + "title": "Allow users to configure integration configurations for approvals", + "description": "If true, the user can create integration configurations associated with this integration's approval capability. Requires formVariables to be defined", + "type": "boolean", + "default": false + }, "creationRequest": { "$id": "#/capabilities/approval/creation-request", "title": "Creation request", From b780eb1b02adaed34ebba508f77477e66387fb04 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 2 Sep 2024 15:06:38 +0200 Subject: [PATCH 798/936] pull from regular form variables (#566) --- integrations/custom-approvals-v2/manifest.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/integrations/custom-approvals-v2/manifest.json b/integrations/custom-approvals-v2/manifest.json index bb58a0c2..b82931bc 100644 --- a/integrations/custom-approvals-v2/manifest.json +++ b/integrations/custom-approvals-v2/manifest.json @@ -57,7 +57,7 @@ "allowApprovalIntegrationConfigurations": true, "creationRequest": { "endpoint": { - "url": "{{ environment.baseURL }}/api/approvals", + "url": "{{ formVariables.baseURL }}/api/approvals", "method": "POST", "headers": [ { @@ -66,7 +66,7 @@ }, { "name": "Authorization", - "value": "Bearer {{ environment.apiKey }}" + "value": "Bearer {{ formVariables.apiKey }}" } ] }, @@ -77,12 +77,12 @@ "statusDisplay": "/result/displayStatus", "approvalMatcher": "approved", "rejectionMatcher": "declined", - "urlTemplate": "{{ environment.baseURL }}/approvals?approvalID={{ context.approvalId }}" + "urlTemplate": "{{ formVariables.baseURL }}/approvals?approvalID={{ context.approvalId }}" } }, "statusRequest": { "endpoint": { - "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/status", + "url": "{{ formVariables.baseURL }}/api/approvals/{{ context.approvalId }}/status", "method": "GET", "headers": [ { @@ -100,7 +100,7 @@ }, "postApplyRequest": { "endpoint": { - "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/applied", + "url": "{{ formVariables.baseURL }}/api/approvals/{{ context.approvalId }}/applied", "method": "PATCH", "headers": [ { @@ -122,7 +122,7 @@ }, "deletionRequest": { "endpoint": { - "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/cancel", + "url": "{{ formVariables.baseURL }}/api/approvals/{{ context.approvalId }}/cancel", "method": "PATCH", "headers": [ { From ad9a31affe05000de081bd5016300f45aa33f95e Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 2 Sep 2024 17:44:57 +0200 Subject: [PATCH 799/936] try again (#567) --- integrations/custom-approvals-v2/manifest.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/integrations/custom-approvals-v2/manifest.json b/integrations/custom-approvals-v2/manifest.json index b82931bc..a7655de6 100644 --- a/integrations/custom-approvals-v2/manifest.json +++ b/integrations/custom-approvals-v2/manifest.json @@ -57,7 +57,7 @@ "allowApprovalIntegrationConfigurations": true, "creationRequest": { "endpoint": { - "url": "{{ formVariables.baseURL }}/api/approvals", + "url": "{{ baseURL }}/api/approvals", "method": "POST", "headers": [ { @@ -66,7 +66,7 @@ }, { "name": "Authorization", - "value": "Bearer {{ formVariables.apiKey }}" + "value": "Bearer {{ apiKey }}" } ] }, @@ -77,17 +77,17 @@ "statusDisplay": "/result/displayStatus", "approvalMatcher": "approved", "rejectionMatcher": "declined", - "urlTemplate": "{{ formVariables.baseURL }}/approvals?approvalID={{ context.approvalId }}" + "urlTemplate": "{{ baseURL }}/approvals?approvalID={{ context.approvalId }}" } }, "statusRequest": { "endpoint": { - "url": "{{ formVariables.baseURL }}/api/approvals/{{ context.approvalId }}/status", + "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/status", "method": "GET", "headers": [ { "name": "Authorization", - "value": "Bearer {{ environment.apiKey }}" + "value": "Bearer {{ apiKey }}" } ] }, @@ -100,7 +100,7 @@ }, "postApplyRequest": { "endpoint": { - "url": "{{ formVariables.baseURL }}/api/approvals/{{ context.approvalId }}/applied", + "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/applied", "method": "PATCH", "headers": [ { @@ -109,7 +109,7 @@ }, { "name": "Authorization", - "value": "Bearer {{ environment.apiKey }}" + "value": "Bearer {{ apiKey }}" } ] }, @@ -122,7 +122,7 @@ }, "deletionRequest": { "endpoint": { - "url": "{{ formVariables.baseURL }}/api/approvals/{{ context.approvalId }}/cancel", + "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/cancel", "method": "PATCH", "headers": [ { @@ -131,7 +131,7 @@ }, { "name": "Authorization", - "value": "Bearer {{ environment.apiKey }}" + "value": "Bearer {{ apiKey }}" } ] }, From 9948edff89bd3ef64805cf9847a74f40e970a432 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Thu, 5 Sep 2024 10:19:19 -0400 Subject: [PATCH 800/936] Updated custom approvals name and enabled additional form vars --- integrations/custom-approvals-v2/manifest.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/integrations/custom-approvals-v2/manifest.json b/integrations/custom-approvals-v2/manifest.json index a7655de6..0d7a1d0b 100644 --- a/integrations/custom-approvals-v2/manifest.json +++ b/integrations/custom-approvals-v2/manifest.json @@ -1,5 +1,5 @@ { - "name": "Custom Approvals (alpha)", + "name": "Custom Approvals v2", "version": "1.0.0", "overview": "Integrate LaunchDarkly approvals with an application of your own design.", "description": "Integrate LaunchDarkly approvals with an application of your own design.", @@ -55,6 +55,7 @@ } ], "allowApprovalIntegrationConfigurations": true, + "allowAdditionalApprovalFormVariables": true, "creationRequest": { "endpoint": { "url": "{{ baseURL }}/api/approvals", From fd95cab470dbf379e85283c52154f9127bd270d6 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 5 Sep 2024 18:47:19 +0100 Subject: [PATCH 801/936] [sc-255286] Pull in Kosli and Convex integrations from public mirror (#569) * Pull in convex integration from main * clean up merge * Fix trailing whitespace --- .../convex/assets/images/horizontal.svg | 29 ++++++++ integrations/convex/assets/images/square.svg | 17 +++++ integrations/convex/manifest.json | 74 +++++++++++++++++++ .../kosli/assets/images/horizontal.svg | 39 ++++++++++ integrations/kosli/assets/images/square.svg | 6 ++ integrations/kosli/manifest.json | 57 ++++++++++++++ 6 files changed, 222 insertions(+) create mode 100644 integrations/convex/assets/images/horizontal.svg create mode 100644 integrations/convex/assets/images/square.svg create mode 100644 integrations/convex/manifest.json create mode 100644 integrations/kosli/assets/images/horizontal.svg create mode 100644 integrations/kosli/assets/images/square.svg create mode 100644 integrations/kosli/manifest.json diff --git a/integrations/convex/assets/images/horizontal.svg b/integrations/convex/assets/images/horizontal.svg new file mode 100644 index 00000000..da1fb733 --- /dev/null +++ b/integrations/convex/assets/images/horizontal.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + diff --git a/integrations/convex/assets/images/square.svg b/integrations/convex/assets/images/square.svg new file mode 100644 index 00000000..7d70c4de --- /dev/null +++ b/integrations/convex/assets/images/square.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/integrations/convex/manifest.json b/integrations/convex/manifest.json new file mode 100644 index 00000000..0ffb12b6 --- /dev/null +++ b/integrations/convex/manifest.json @@ -0,0 +1,74 @@ +{ + "name": "Convex", + "version": "0.0.1", + "overview": "Sync your LaunchDarkly feature flags to your Convex deployment.", + "description": "Convex is the open-source backend for application builders. An all-in-one platform with thoughtful, product-centric APIs.", + "author": "Convex", + "supportEmail": "support@convex.dev", + "links": { + "site": "https://convex.dev", + "privacyPolicy": "https://convex.dev/privacy" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "capabilities": { + "featureStore": { + "formVariables": [ + { + "key": "deploymentPayloadUrl", + "name": "Webhook URL", + "description": "The url to the webhook URL exposed by the LaunchDarkly component for Convex.", + "type": "uri", + "placeholder": "e.g. https://wonderful-capybara-515.convex.site/api/launchdarkly-webhook", + "isSecret": false + }, + { + "key": "componentApiToken", + "name": "Component API Token", + "description": "The API token generated by the LaunchDarkly component for Convex.", + "type": "string", + "isSecret": true + } + ], + "validationRequest": { + "endpoint": { + "url": "{{deploymentPayloadUrl}}", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{componentApiToken}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "parser": { + "success": "/success", + "errors": "/errors" + } + }, + "featureStoreRequest": { + "endpoint": { + "url": "{{deploymentPayloadUrl}}", + "method": "PUT", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{componentApiToken}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + } + } + } + } +} diff --git a/integrations/kosli/assets/images/horizontal.svg b/integrations/kosli/assets/images/horizontal.svg new file mode 100644 index 00000000..3d92dd39 --- /dev/null +++ b/integrations/kosli/assets/images/horizontal.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + diff --git a/integrations/kosli/assets/images/square.svg b/integrations/kosli/assets/images/square.svg new file mode 100644 index 00000000..6c79c795 --- /dev/null +++ b/integrations/kosli/assets/images/square.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/integrations/kosli/manifest.json b/integrations/kosli/manifest.json new file mode 100644 index 00000000..23e39f64 --- /dev/null +++ b/integrations/kosli/manifest.json @@ -0,0 +1,57 @@ +{ + "name": "Kosli", + "version": "1.0.0", + "overview": "Use Kosli to keep a record of all the changes made to your feature flags.", + "description": "Kosli records all of the changes in your software delivery process to give you the easy buttons for audit, compliance, security and incident response. Integrate Kosli with LaunchDarkly to record all the changes made to feature flags. Get a versioned history of how they changed, when they changed, and who changed them.", + "author": "Kosli", + "supportEmail": "support@kosli.com", + "links": { + "site": "https://www.kosli.com", + "privacyPolicy": "https://www.kosli.com/privacy-policy/", + "supportWebsite": "https://www.kosli.com/community/" + }, + "categories": ["developer-tools", "monitoring"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "otherCapabilities": ["external"], + "formVariables": [ + { + "key": "webhookUrl", + "name": "Kosli Webhook URL", + "type": "string", + "description": "Enter your Kosli webhook URL" + }, + { + "key": "secret", + "name": "Kosli secret", + "type": "string", + "description": "Enter your Kosli secret", + "isSecret": true + } + ], + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{webhookUrl}}", + "method": "POST", + "headers": [ + { + "name": "x-ld-signature", + "value": "{{secret}}" + } + ] + }, + "templates": {}, + "defaultPolicy": [ + { + "effect": "allow", + "actions": ["createFlag", "updateOn"], + "resources": ["proj/*:env/*:flag/*"] + } + ], + "useStandardWebhookPayload": true + } + } +} From 1257859d18aa854eeeab642c8b33ae506c867f70 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 10 Sep 2024 16:43:22 +0200 Subject: [PATCH 802/936] upload sruthy's logo (#570) --- .../assets/images/square.svg | 62 +------------------ 1 file changed, 2 insertions(+), 60 deletions(-) diff --git a/integrations/custom-approvals-v2/assets/images/square.svg b/integrations/custom-approvals-v2/assets/images/square.svg index e97215d6..2c338d9f 100644 --- a/integrations/custom-approvals-v2/assets/images/square.svg +++ b/integrations/custom-approvals-v2/assets/images/square.svg @@ -1,61 +1,3 @@ - - - - - - - - - - - - - - - - - + + From fd857bc6315416736dcb30efa0c154e5e4521b3c Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 11 Sep 2024 13:29:22 +0200 Subject: [PATCH 803/936] [sc-255824] Clean up redundant custom approvals manifest (#571) * remove custom-approvals * rename custom-approvals-v2 to custom-approvals * remove the custom approvals approvalFormVariables * scrap v2 in name --- .../assets/images/horizontal.svg | 655 ------------------ .../assets/images/square.svg | 3 - .../custom-approvals-v2/manifest.json | 167 ----- .../custom-approvals/assets/images/square.svg | 62 +- integrations/custom-approvals/manifest.json | 76 +- 5 files changed, 31 insertions(+), 932 deletions(-) delete mode 100644 integrations/custom-approvals-v2/assets/images/horizontal.svg delete mode 100644 integrations/custom-approvals-v2/assets/images/square.svg delete mode 100644 integrations/custom-approvals-v2/manifest.json diff --git a/integrations/custom-approvals-v2/assets/images/horizontal.svg b/integrations/custom-approvals-v2/assets/images/horizontal.svg deleted file mode 100644 index 53c278d5..00000000 --- a/integrations/custom-approvals-v2/assets/images/horizontal.svg +++ /dev/null @@ -1,655 +0,0 @@ - - - - -Created by potrace 1.15, written by Peter Selinger 2001-2017 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/custom-approvals-v2/assets/images/square.svg b/integrations/custom-approvals-v2/assets/images/square.svg deleted file mode 100644 index 2c338d9f..00000000 --- a/integrations/custom-approvals-v2/assets/images/square.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/integrations/custom-approvals-v2/manifest.json b/integrations/custom-approvals-v2/manifest.json deleted file mode 100644 index 0d7a1d0b..00000000 --- a/integrations/custom-approvals-v2/manifest.json +++ /dev/null @@ -1,167 +0,0 @@ -{ - "name": "Custom Approvals v2", - "version": "1.0.0", - "overview": "Integrate LaunchDarkly approvals with an application of your own design.", - "description": "Integrate LaunchDarkly approvals with an application of your own design.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://launchdarkly.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/", - "privacyPolicy": "https://launchdarkly.com/policies/privacy/" - }, - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - "categories": ["approval"], - "requiresOAuth": false, - "formVariables": [ - { - "key": "apiKey", - "name": "API Token", - "description": "Enter the API your custom service will use to authenticate.", - "placeholder": "e.g. 8M7wS6hCpXVc-DoRnPPY_UCWPgy8aea4Wy6kCe5T", - "type": "string", - "isSecret": true - }, - { - "key": "baseURL", - "name": "Custom approval service base URL", - "description": "The base URL of your custom approval service. This is where all of the API handlers should be set up.", - "type": "string", - "placeholder": "e.g. https://mycustomapprovalservice.com" - } - ], - "capabilities": { - "approval": { - "name": "Custom Approvals", - "approvalFormVariables": [ - { - "key": "additionalInfo", - "name": "Additional information", - "description": "Add some additional context and it will be passed to the creation request.", - "type": "string", - "isOptional": true - }, - { - "key": "impact", - "name": "Impact", - "description": "What is the impact of this change?", - "type": "enum", - "allowedValues": ["Low", "Medium", "High"], - "defaultValue": "Low", - "isOptional": true - } - ], - "allowApprovalIntegrationConfigurations": true, - "allowAdditionalApprovalFormVariables": true, - "creationRequest": { - "endpoint": { - "url": "{{ baseURL }}/api/approvals", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{ apiKey }}" - } - ] - }, - "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{approvalDescription}}\" }", - "parser": { - "approvalId": "/id", - "statusValue": "/result/status", - "statusDisplay": "/result/displayStatus", - "approvalMatcher": "approved", - "rejectionMatcher": "declined", - "urlTemplate": "{{ baseURL }}/approvals?approvalID={{ context.approvalId }}" - } - }, - "statusRequest": { - "endpoint": { - "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/status", - "method": "GET", - "headers": [ - { - "name": "Authorization", - "value": "Bearer {{ apiKey }}" - } - ] - }, - "parser": { - "statusValue": "/result/status", - "statusDisplay": "/result/displayStatus", - "approvalMatcher": "approved", - "rejectionMatcher": "declined" - } - }, - "postApplyRequest": { - "endpoint": { - "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/applied", - "method": "PATCH", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{ apiKey }}" - } - ] - }, - "parser": { - "statusValue": "/result/status", - "statusDisplay": "/result/displayStatus", - "approvalMatcher": "approved", - "rejectionMatcher": "declined" - } - }, - "deletionRequest": { - "endpoint": { - "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/cancel", - "method": "PATCH", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{ apiKey }}" - } - ] - }, - "parser": { - "statusValue": "/result/status", - "statusDisplay": "/result/displayStatus", - "approvalMatcher": "approved", - "rejectionMatcher": "declined" - } - }, - "memberListRequest": { - "endpoint": { - "url": "{{baseURI}}/api/members", - "method": "GET", - "headers": [ - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ] - }, - "parser": { - "memberArrayPath": "/result", - "memberItems": { - "memberId": "/name", - "email": "/email" - } - } - } - } - } -} diff --git a/integrations/custom-approvals/assets/images/square.svg b/integrations/custom-approvals/assets/images/square.svg index e97215d6..2c338d9f 100644 --- a/integrations/custom-approvals/assets/images/square.svg +++ b/integrations/custom-approvals/assets/images/square.svg @@ -1,61 +1,3 @@ - - - - - - - - - - - - - - - - - + + diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 10be7963..2df5ab8c 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -1,5 +1,5 @@ { - "name": "Custom Approvals (alpha)", + "name": "Custom Approvals", "version": "1.0.0", "overview": "Integrate LaunchDarkly approvals with an application of your own design.", "description": "Integrate LaunchDarkly approvals with an application of your own design.", @@ -16,50 +16,32 @@ }, "categories": ["approval"], "requiresOAuth": false, - "formVariables": [], + "formVariables": [ + { + "key": "apiKey", + "name": "API Token", + "description": "Enter the API your custom service will use to authenticate.", + "placeholder": "e.g. 8M7wS6hCpXVc-DoRnPPY_UCWPgy8aea4Wy6kCe5T", + "type": "string", + "isSecret": true + }, + { + "key": "baseURL", + "name": "Custom approval service base URL", + "description": "The base URL of your custom approval service. This is where all of the API handlers should be set up.", + "type": "string", + "placeholder": "e.g. https://mycustomapprovalservice.com" + } + ], "capabilities": { "approval": { "name": "Custom Approvals", - "approvalFormVariables": [ - { - "key": "additionalInfo", - "name": "Additional information", - "description": "Add some additional context and it will be passed to the creation request.", - "type": "string", - "isOptional": true - }, - { - "key": "impact", - "name": "Impact", - "description": "What is the impact of this change?", - "type": "enum", - "allowedValues": ["Low", "Medium", "High"], - "defaultValue": "Low", - "isOptional": true - } - ], - "allowAdditionalApprovalFormVariables": true, + "approvalFormVariables": [], "allowApprovalIntegrationConfigurations": true, - "environmentFormVariables": [ - { - "key": "apiKey", - "name": "API Token", - "description": "Enter the API your custom service will use to authenticate.", - "placeholder": "e.g. 8M7wS6hCpXVc-DoRnPPY_UCWPgy8aea4Wy6kCe5T", - "type": "string", - "isSecret": true - }, - { - "key": "baseURL", - "name": "Custom approval service base URL", - "description": "The base URL of your custom approval service. This is where all of the API handlers should be set up.", - "type": "string", - "placeholder": "e.g. https://mycustomapprovalservice.com" - } - ], + "allowAdditionalApprovalFormVariables": true, "creationRequest": { "endpoint": { - "url": "{{ environment.baseURL }}/api/approvals", + "url": "{{ baseURL }}/api/approvals", "method": "POST", "headers": [ { @@ -68,7 +50,7 @@ }, { "name": "Authorization", - "value": "Bearer {{ environment.apiKey }}" + "value": "Bearer {{ apiKey }}" } ] }, @@ -79,17 +61,17 @@ "statusDisplay": "/result/displayStatus", "approvalMatcher": "approved", "rejectionMatcher": "declined", - "urlTemplate": "{{ environment.baseURL }}/approvals?approvalID={{ context.approvalId }}" + "urlTemplate": "{{ baseURL }}/approvals?approvalID={{ context.approvalId }}" } }, "statusRequest": { "endpoint": { - "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/status", + "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/status", "method": "GET", "headers": [ { "name": "Authorization", - "value": "Bearer {{ environment.apiKey }}" + "value": "Bearer {{ apiKey }}" } ] }, @@ -102,7 +84,7 @@ }, "postApplyRequest": { "endpoint": { - "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/applied", + "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/applied", "method": "PATCH", "headers": [ { @@ -111,7 +93,7 @@ }, { "name": "Authorization", - "value": "Bearer {{ environment.apiKey }}" + "value": "Bearer {{ apiKey }}" } ] }, @@ -124,7 +106,7 @@ }, "deletionRequest": { "endpoint": { - "url": "{{ environment.baseURL }}/api/approvals/{{ context.approvalId }}/cancel", + "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/cancel", "method": "PATCH", "headers": [ { @@ -133,7 +115,7 @@ }, { "name": "Authorization", - "value": "Bearer {{ environment.apiKey }}" + "value": "Bearer {{ apiKey }}" } ] }, From 1a333f8195838363557a529ab7f46e1a2cebab1b Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 17 Sep 2024 13:46:04 +0100 Subject: [PATCH 804/936] Update PagerDuty POC (#573) * Update PagerDuty POC * Revert change to square logo * Try updating square logo * Update integrations/pagerduty/manifest.json Co-authored-by: Isabelle Miller --------- Co-authored-by: Isabelle Miller --- .../pagerduty/assets/pagerduty-rectangle.svg | 38 ++++++++++- .../pagerduty/assets/pagerduty-square.svg | 65 ++++++++++++++++++- integrations/pagerduty/manifest.json | 7 ++ .../pagerduty/templates/default.json.hbs | 7 +- 4 files changed, 113 insertions(+), 4 deletions(-) diff --git a/integrations/pagerduty/assets/pagerduty-rectangle.svg b/integrations/pagerduty/assets/pagerduty-rectangle.svg index 705e9698..696e1705 100644 --- a/integrations/pagerduty/assets/pagerduty-rectangle.svg +++ b/integrations/pagerduty/assets/pagerduty-rectangle.svg @@ -1 +1,37 @@ - + + + + + + + + + + + + + + + + + + + diff --git a/integrations/pagerduty/assets/pagerduty-square.svg b/integrations/pagerduty/assets/pagerduty-square.svg index e2e75a8e..ce397c63 100644 --- a/integrations/pagerduty/assets/pagerduty-square.svg +++ b/integrations/pagerduty/assets/pagerduty-square.svg @@ -1 +1,64 @@ - + + + + + + + + + + + + + + + diff --git a/integrations/pagerduty/manifest.json b/integrations/pagerduty/manifest.json index 63cc6197..6cd6814d 100644 --- a/integrations/pagerduty/manifest.json +++ b/integrations/pagerduty/manifest.json @@ -25,6 +25,13 @@ } ], "capabilities": { + "reservedCustomProperties": [ + { + "name": "PagerDuy", + "description": "PagerDuty Change integration key (only first one will be used)", + "key": "changeKey" + } + ], "auditLogEventsHook": { "endpoint": { "url": "https://events.pagerduty.com/v2/change/enqueue", diff --git a/integrations/pagerduty/templates/default.json.hbs b/integrations/pagerduty/templates/default.json.hbs index dcb5a8de..e3112293 100644 --- a/integrations/pagerduty/templates/default.json.hbs +++ b/integrations/pagerduty/templates/default.json.hbs @@ -1,5 +1,8 @@ { - "routing_key": "{{{formVariables.routingKey}}}", + "routing_key": {{#if customProperties}} {{#if customProperties.changeKey}}{{#if customProperties.changeKey.values}}{{#with customProperties}}{{#each changeKey.values}}{{#if @first}}"{{{this}}}",{{/if}} + {{/each}} + {{/with}} +{{/if}}{{else}}"{{{formVariables.routingKey}}}",{{/if}}{{/if}} "payload": { "summary" : "{{{title.plainText}}}", "timestamp": "{{{timestamp.simple}}}", @@ -13,7 +16,7 @@ "href": "{{{_links.details.href}}}", "text": "View audit log entry in LaunchDarkly" }, { - "href": "{{{_links.site.href}}}", "text": "View resource in LaunchDarkly" + "href": "{{{_links.site.href}}}", "text": "View changed resource in LaunchDarkly" } ] } From 60f1399445452f0a1af763cf45bcf599e2282ce1 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 17 Sep 2024 17:13:51 +0100 Subject: [PATCH 805/936] Backmerge public (#572) --- .../convex/assets/images/horizontal.svg | 56 +++++++++---------- integrations/convex/manifest.json | 6 +- integrations/kosli/manifest.json | 10 +++- 3 files changed, 38 insertions(+), 34 deletions(-) diff --git a/integrations/convex/assets/images/horizontal.svg b/integrations/convex/assets/images/horizontal.svg index da1fb733..1f4e7ce6 100644 --- a/integrations/convex/assets/images/horizontal.svg +++ b/integrations/convex/assets/images/horizontal.svg @@ -1,29 +1,29 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/integrations/convex/manifest.json b/integrations/convex/manifest.json index 0ffb12b6..3905b987 100644 --- a/integrations/convex/manifest.json +++ b/integrations/convex/manifest.json @@ -20,15 +20,15 @@ { "key": "deploymentPayloadUrl", "name": "Webhook URL", - "description": "The url to the webhook URL exposed by the LaunchDarkly component for Convex.", + "description": "Enter the URL to the webhook exposed by the LaunchDarkly component for Convex.", "type": "uri", - "placeholder": "e.g. https://wonderful-capybara-515.convex.site/api/launchdarkly-webhook", + "placeholder": "https://techno-kitten-138.convex.site/ld/webhook", "isSecret": false }, { "key": "componentApiToken", "name": "Component API Token", - "description": "The API token generated by the LaunchDarkly component for Convex.", + "description": "Enter the API token generated by the LaunchDarkly component for Convex.", "type": "string", "isSecret": true } diff --git a/integrations/kosli/manifest.json b/integrations/kosli/manifest.json index 23e39f64..8ff30464 100644 --- a/integrations/kosli/manifest.json +++ b/integrations/kosli/manifest.json @@ -38,10 +38,14 @@ "method": "POST", "headers": [ { - "name": "x-ld-signature", - "value": "{{secret}}" + "name": "Content-Type", + "value": "application/json" } - ] + ], + "hmacSignature": { + "headerName": "X-LD-Signature", + "hmacSecretFormVariableKey": "secret" + } }, "templates": {}, "defaultPolicy": [ From c1bd33aa7fa073d9532a451ee56e568902ed9557 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 18 Sep 2024 13:28:03 +0100 Subject: [PATCH 806/936] Add includeErrorResponseBody to PagerDuty manfiest (#574) --- integrations/pagerduty/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/pagerduty/manifest.json b/integrations/pagerduty/manifest.json index 6cd6814d..676a324c 100644 --- a/integrations/pagerduty/manifest.json +++ b/integrations/pagerduty/manifest.json @@ -33,6 +33,7 @@ } ], "auditLogEventsHook": { + "includeErrorResponseBody": true, "endpoint": { "url": "https://events.pagerduty.com/v2/change/enqueue", "method": "POST", From fb578522e299eb04c13d2924aed27ed212ff9fb6 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Wed, 18 Sep 2024 09:31:45 -0400 Subject: [PATCH 807/936] adding Netlify integration --- integrations/netlify/assets/horizontal.svg | 22 +++++++ integrations/netlify/assets/square.svg | 16 +++++ integrations/netlify/manifest.json | 71 ++++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 integrations/netlify/assets/horizontal.svg create mode 100644 integrations/netlify/assets/square.svg create mode 100644 integrations/netlify/manifest.json diff --git a/integrations/netlify/assets/horizontal.svg b/integrations/netlify/assets/horizontal.svg new file mode 100644 index 00000000..94ca9a09 --- /dev/null +++ b/integrations/netlify/assets/horizontal.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/netlify/assets/square.svg b/integrations/netlify/assets/square.svg new file mode 100644 index 00000000..8d4e9d77 --- /dev/null +++ b/integrations/netlify/assets/square.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/integrations/netlify/manifest.json b/integrations/netlify/manifest.json new file mode 100644 index 00000000..834f7e42 --- /dev/null +++ b/integrations/netlify/manifest.json @@ -0,0 +1,71 @@ +{ + "name": "Netlify", + "version": "1.0.0", + "overview": "Evaluate feature flags and bootstrap the LaunchDarkly Netlify SDK.", + "description": "Evaluate feature flags and bootstrap the LaunchDarkly Netlify SDK.", + "author": "Netlify", + "supportEmail": "support@netlify.com", + "links": { + "site": "https://www.netlify.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/netlify", + "privacyPolicy": "https://www.netlify.com/privacy/" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "featureStore": { + "formVariables": [ + { + "key": "siteId", + "name": "Site ID", + "description": "Enter your Netlify site ID. This can be found in the Netlify UI, at Site configuration > Build & deploy > LaunchDarkly.", + "type": "string", + "placeholder": "e.g. e0d5cce2-679b-425a-bf5a-a4b298327a15", + "isSecret": false + }, + { + "key": "syncToken", + "name": "Syncing Token", + "description": "Enter your Netlify site's LaunchDarkly syncing token. This can be found in the Netlify UI, at Site configuration > Build & deploy > LaunchDarkly.", + "placeholder": "e.g. 0ZWs3i3aHX66CVrrfaV7aQ", + "type": "string", + "isSecret": true + } + ], + "validationRequest": { + "endpoint": { + "url": "https://{{siteId}.netlify.app/.official-launchdarkly/edge-config-test", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{syncToken}}" + } + ] + }, + "parser": { + "success": "/success" + } + }, + "featureStoreRequest": { + "endpoint": { + "url": "https://{{siteId}.netlify.app/.official-launchdarkly/edge-config", + "method": "PUT", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{syncToken}}" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + } + } + } + } +} From 93cff6a1229375d3b3927cadfb7a476826fccfd3 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 18 Sep 2024 19:23:53 +0100 Subject: [PATCH 808/936] Update PagerDuty POC (#576) --- integrations/pagerduty/manifest.json | 7 ++++--- integrations/pagerduty/templates/default.json.hbs | 7 ++----- sample-context/flag/targeting-rule-update.json | 4 ++++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/integrations/pagerduty/manifest.json b/integrations/pagerduty/manifest.json index 676a324c..5e0f7088 100644 --- a/integrations/pagerduty/manifest.json +++ b/integrations/pagerduty/manifest.json @@ -27,9 +27,9 @@ "capabilities": { "reservedCustomProperties": [ { - "name": "PagerDuy", + "name": "PagerDuy Change Key", "description": "PagerDuty Change integration key (only first one will be used)", - "key": "changeKey" + "key": "pagerDutyChangeKey" } ], "auditLogEventsHook": { @@ -45,7 +45,8 @@ ] }, "templates": { - "default": "templates/default.json.hbs" + "default": "templates/default.json.hbs", + "validation": "templates/default.json.hbs" }, "defaultPolicy": [ { diff --git a/integrations/pagerduty/templates/default.json.hbs b/integrations/pagerduty/templates/default.json.hbs index e3112293..e18dc885 100644 --- a/integrations/pagerduty/templates/default.json.hbs +++ b/integrations/pagerduty/templates/default.json.hbs @@ -1,14 +1,11 @@ { - "routing_key": {{#if customProperties}} {{#if customProperties.changeKey}}{{#if customProperties.changeKey.values}}{{#with customProperties}}{{#each changeKey.values}}{{#if @first}}"{{{this}}}",{{/if}} - {{/each}} - {{/with}} -{{/if}}{{else}}"{{{formVariables.routingKey}}}",{{/if}}{{/if}} + "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyChangeKey}}{{#if customProperties.pagerDutyChangeKey.values}}{{#each customProperties.pagerDutyChangeKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.routingKey}}}",{{/if}}{{else}}"{{{formVariables.routingKey}}}",{{/if}} "payload": { "summary" : "{{{title.plainText}}}", "timestamp": "{{{timestamp.simple}}}", "custom_details":{ "details": "{{{details.plainText}}}", - "comment": "{{{comment}}}" + "comment": "{{#if comment}}{{{comment}}}{{/if}}" } }, "links": [ diff --git a/sample-context/flag/targeting-rule-update.json b/sample-context/flag/targeting-rule-update.json index 683248a0..a544bcf0 100644 --- a/sample-context/flag/targeting-rule-update.json +++ b/sample-context/flag/targeting-rule-update.json @@ -62,6 +62,10 @@ "jira": { "name": "Jira", "values": ["thing1", "thing2"] + }, + "pagerDutyChangeKey": { + "name": "PagerDuty", + "values": ["pd1"] } }, "member": { From be2a85eafb35e7790c530d57255045293d7d256e Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 19 Sep 2024 11:57:26 +0200 Subject: [PATCH 809/936] update link (#577) --- integrations/custom-approvals/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 2df5ab8c..55e1efaf 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://launchdarkly.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/custom-approvals", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "icons": { From 01be3a0a9118fc1d0e5ae414bb7d3583ca2e79b7 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 20 Sep 2024 11:01:53 +0100 Subject: [PATCH 810/936] Clean up PagerDuty manifest (#580) --- integrations/pagerduty/manifest.json | 54 +++++++++++++++---- .../pagerduty/templates/default.json.hbs | 2 +- integrations/servicenow-normal/manifest.json | 2 +- .../flag/targeting-rule-update.json | 2 +- 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/integrations/pagerduty/manifest.json b/integrations/pagerduty/manifest.json index 5e0f7088..38b43771 100644 --- a/integrations/pagerduty/manifest.json +++ b/integrations/pagerduty/manifest.json @@ -1,8 +1,8 @@ { "name": "PagerDuty", "version": "1.0.0", - "overview": "Send flag change events to Teams service pages.", - "description": "Send flag change events directly to PagerDuty’s Events API v2, ensuring flag change events appear on PagerDuty Service pages.", + "overview": "Send LaunchDarkly change events to PagerDuty services.", + "description": "Send LaunchDarkly change events to PagerDuty to correlate changes with operational health.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { @@ -17,19 +17,19 @@ }, "formVariables": [ { - "key": "routingKey", - "name": "PagerDuty Routing Key", + "key": "integrationKey", + "name": "PagerDuty integration key", "type": "string", - "description": "Enter your [PagerDuty Routing Key](https://support.pagerduty.com/docs/services-and-integrations).", + "description": "Enter your [PagerDuty integration key](https://support.pagerduty.com/main/docs/services-and-integrations#add-integrations-to-an-existing-service).", "isSecret": false } ], "capabilities": { "reservedCustomProperties": [ { - "name": "PagerDuy Change Key", - "description": "PagerDuty Change integration key (only first one will be used)", - "key": "pagerDutyChangeKey" + "name": "PagerDuy integration key override", + "description": "The PagerDuty integration key to use for all changes associated with this flag. Only the first key will be used.", + "key": "pagerDutyIntegrationKey" } ], "auditLogEventsHook": { @@ -52,7 +52,43 @@ { "effect": "allow", "resources": ["proj/*:env/production:flag/*"], - "actions": ["*"] + "actions": [ + "deleteFlag", + "updateOn", + "updateIncludeInSnippet", + "updateClientSideFlagAvailability", + "updatePrerequisites", + "updateTargets", + "updateRules", + "updateFallthrough", + "updateFlagVariations", + "updateOffVariation", + "updateAttachedGoals", + "updateExperimentActive", + "copyFlagConfigFrom", + "copyFlagConfigTo", + "updateFlagSalt", + "updateTrackEvents", + "updateExpiringTargets", + "bypassRequiredApproval", + "updateGlobalArchived", + "applyApprovalRequest", + "stopMeasuredRolloutOnFlagRule", + "updateRulesWithMeasuredRollout", + "updateMeasuredRolloutConfiguration", + "updateScheduledChanges" + ] + }, + { + "resources": ["proj/*:env/production:segment/*"], + "effect": "allow", + "actions": [ + "updateIncluded", + "updateExcluded", + "updateRules", + "updateExpiringTargets", + "updateScheduledChanges" + ] } ] } diff --git a/integrations/pagerduty/templates/default.json.hbs b/integrations/pagerduty/templates/default.json.hbs index e18dc885..71941448 100644 --- a/integrations/pagerduty/templates/default.json.hbs +++ b/integrations/pagerduty/templates/default.json.hbs @@ -1,5 +1,5 @@ { - "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyChangeKey}}{{#if customProperties.pagerDutyChangeKey.values}}{{#each customProperties.pagerDutyChangeKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.routingKey}}}",{{/if}}{{else}}"{{{formVariables.routingKey}}}",{{/if}} + "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyIntegrationKey}}{{#if customProperties.pagerDutyIntegrationKey.values}}{{#each customProperties.pagerDutyIntegrationKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}} "payload": { "summary" : "{{{title.plainText}}}", "timestamp": "{{{timestamp.simple}}}", diff --git a/integrations/servicenow-normal/manifest.json b/integrations/servicenow-normal/manifest.json index 3d0a7600..2560ede0 100644 --- a/integrations/servicenow-normal/manifest.json +++ b/integrations/servicenow-normal/manifest.json @@ -89,7 +89,7 @@ "name": "Implementation Plan", "description": "Request implementation plan in approval requests.", "type": "boolean", - "defaultValue": "false", + "defaultValue": false, "isOptional": true } ], diff --git a/sample-context/flag/targeting-rule-update.json b/sample-context/flag/targeting-rule-update.json index a544bcf0..1cb4af3b 100644 --- a/sample-context/flag/targeting-rule-update.json +++ b/sample-context/flag/targeting-rule-update.json @@ -63,7 +63,7 @@ "name": "Jira", "values": ["thing1", "thing2"] }, - "pagerDutyChangeKey": { + "pagerDutyIntegrationKey": { "name": "PagerDuty", "values": ["pd1"] } From 4ab0b2d73153b57b7022de59e7a2e061dc716664 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 20 Sep 2024 11:10:27 +0100 Subject: [PATCH 811/936] Fix incorrect defaultValue in servicenow-normal manifest (#581) --- __tests__/validateIntegrationManifests.js | 62 ++++++++++++++++++++ integrations/servicenow-normal/manifest.json | 2 +- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index a0f8f197..f3c1aa93 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -264,6 +264,68 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'defaultValue types match the type of the approvalFormVariable for %s', + (key, manifest) => { + const formVariables = _.get( + manifest, + 'capabilities.approval.approvalFormVariables', + null + ); + if (formVariables) { + formVariables.forEach(formVariable => { + if (!_.isUndefined(formVariable.defaultValue)) { + expect( + formVariable.isOptional, + '"defaultValue" is only valid if "isOptional" is true. Use "placeholder" if you do not want the variable to be optional.' + ).toBe(true); + if ( + formVariable.type === 'string' || + formVariable.type === 'uri' || + formVariable.type === 'enum' || + formVariable.type === 'dynamicEnum' + ) { + expect(_.isString(formVariable.defaultValue)).toBe(true); + } else if (formVariable.type === 'boolean') { + expect(_.isBoolean(formVariable.defaultValue)).toBe(true); + } + } + }); + } + } + ); + + test.each(manifests)( + 'defaultValue types match the type of the environmentFormVariable for %s', + (key, manifest) => { + const formVariables = _.get( + manifest, + 'capabilities.approval.environmentFormVariables', + null + ); + if (formVariables) { + formVariables.forEach(formVariable => { + if (!_.isUndefined(formVariable.defaultValue)) { + expect( + formVariable.isOptional, + '"defaultValue" is only valid if "isOptional" is true. Use "placeholder" if you do not want the variable to be optional.' + ).toBe(true); + if ( + formVariable.type === 'string' || + formVariable.type === 'uri' || + formVariable.type === 'enum' || + formVariable.type === 'dynamicEnum' + ) { + expect(_.isString(formVariable.defaultValue)).toBe(true); + } else if (formVariable.type === 'boolean') { + expect(_.isBoolean(formVariable.defaultValue)).toBe(true); + } + } + }); + } + } + ); + test.each(manifests)( 'defaultValue is always provided when isOptional true for %s', (key, manifest) => { diff --git a/integrations/servicenow-normal/manifest.json b/integrations/servicenow-normal/manifest.json index 2560ede0..9debad42 100644 --- a/integrations/servicenow-normal/manifest.json +++ b/integrations/servicenow-normal/manifest.json @@ -81,7 +81,7 @@ "name": "Configuration Item", "description": "Request configuration item in approval requests.", "type": "boolean", - "defaultValue": "false", + "defaultValue": false, "isOptional": true }, { From 1917db6b32626a83588662c3039ebe2318cb6cd2 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 20 Sep 2024 13:45:22 +0200 Subject: [PATCH 812/936] replace horizontal icon (#579) --- .../assets/images/horizontal.svg | 656 +----------------- 1 file changed, 2 insertions(+), 654 deletions(-) diff --git a/integrations/custom-approvals/assets/images/horizontal.svg b/integrations/custom-approvals/assets/images/horizontal.svg index 53c278d5..2c338d9f 100644 --- a/integrations/custom-approvals/assets/images/horizontal.svg +++ b/integrations/custom-approvals/assets/images/horizontal.svg @@ -1,655 +1,3 @@ - - - - -Created by potrace 1.15, written by Peter Selinger 2001-2017 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + From b11097df82669448745d441aed679a14c03e4123 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 20 Sep 2024 19:32:44 +0100 Subject: [PATCH 813/936] Add Jira issue linker (#578) --- .github/workflows/jira_linker.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/jira_linker.yml diff --git a/.github/workflows/jira_linker.yml b/.github/workflows/jira_linker.yml new file mode 100644 index 00000000..309a5195 --- /dev/null +++ b/.github/workflows/jira_linker.yml @@ -0,0 +1,17 @@ +name: Jira Issue Linker + +on: + pull_request: + types: [opened, edited, synchronize] + +jobs: + jira-issue-link: + runs-on: ubuntu-latest + if: github.repository == 'launchdarkly/integration-framework-private' + steps: + - uses: launchdarkly-labs/ld-gh-actions-jira@7d61c90e8fc29c3ce8e3f0fb55d963afd084a359 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + jira-base-url: https://launchdarkly.atlassian.net + jira-username: ${{ secrets.JIRA_USERNAME }} + jira-api-token: ${{ secrets.JIRA_API_TOKEN }} From 1d1ff2bfa67fcbc0114a5926d11ba7f7923eef55 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Thu, 26 Sep 2024 09:55:25 -0400 Subject: [PATCH 814/936] update Netlify integration string --- integrations/netlify/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/netlify/manifest.json b/integrations/netlify/manifest.json index 834f7e42..8161492a 100644 --- a/integrations/netlify/manifest.json +++ b/integrations/netlify/manifest.json @@ -37,7 +37,7 @@ ], "validationRequest": { "endpoint": { - "url": "https://{{siteId}.netlify.app/.official-launchdarkly/edge-config-test", + "url": "https://{{siteId}}.netlify.app/.official-launchdarkly/edge-config-test", "method": "GET", "headers": [ { @@ -52,7 +52,7 @@ }, "featureStoreRequest": { "endpoint": { - "url": "https://{{siteId}.netlify.app/.official-launchdarkly/edge-config", + "url": "https://{{siteId}}.netlify.app/.official-launchdarkly/edge-config", "method": "PUT", "headers": [ { From dc1e2a38b1f420fec940353030c6e3c7cd5d0407 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 3 Oct 2024 13:22:08 +0100 Subject: [PATCH 815/936] Increase ServiceNow member list limit to 100000 (#584) --- integrations/servicenow-normal/manifest.json | 2 +- integrations/servicenow/manifest.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/servicenow-normal/manifest.json b/integrations/servicenow-normal/manifest.json index 9debad42..f224abf1 100644 --- a/integrations/servicenow-normal/manifest.json +++ b/integrations/servicenow-normal/manifest.json @@ -170,7 +170,7 @@ }, "memberListRequest": { "endpoint": { - "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=email,user_name", + "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=email,user_name&sysparm_limit=100000", "method": "GET", "headers": [ { diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index a4cd7c39..25b50b72 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -134,7 +134,7 @@ }, "memberListRequest": { "endpoint": { - "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=email,user_name", + "url": "{{oauth.baseURI}}/api/now/table/sys_user?active=true&sysparm_fields=email,user_name&sysparm_limit=100000", "method": "GET", "headers": [ { From 2cf1dfcc7b65035e385e91bc00017906bb4bf70e Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 7 Oct 2024 11:55:46 +0200 Subject: [PATCH 816/936] add top-level property (#585) --- manifest.schema.json | 10 +++++++++- schemas/base.json | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/manifest.schema.json b/manifest.schema.json index 6768b059..d5444668 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -22,7 +22,8 @@ "otherCapabilities", "requiresOAuth", "hideOnIntegrationsPage", - "oauthIntegrationKey" + "oauthIntegrationKey", + "allowIntegrationConfigurations" ] }, "properties": { @@ -4363,6 +4364,13 @@ "type": "string" } }, + "allowIntegrationConfigurations": { + "$id": "#/properties/allow-integration-configurations", + "title": "Allow Integration Configurations", + "description": "Whether the integration allows integration configurations. Will apply to all capabilities on the manifest.", + "type": "boolean", + "default": false + }, "required": [ "name", "version", diff --git a/schemas/base.json b/schemas/base.json index db8609f3..b07171c6 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -22,7 +22,8 @@ "otherCapabilities", "requiresOAuth", "hideOnIntegrationsPage", - "oauthIntegrationKey" + "oauthIntegrationKey", + "allowIntegrationConfigurations" ] }, "properties": { @@ -318,6 +319,13 @@ "type": "string" } }, + "allowIntegrationConfigurations": { + "$id": "#/properties/allow-integration-configurations", + "title": "Allow Integration Configurations", + "description": "Whether the integration allows integration configurations. Will apply to all capabilities on the manifest.", + "type": "boolean", + "default": false + }, "required": [ "name", "version", From 003597fe0f46d1d0f269bbe313d6f956bb258a2f Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 7 Oct 2024 11:57:29 +0200 Subject: [PATCH 817/936] [REL-2888] finalize custom-approvals manifest (#583) * discussed changes * update post apply and delete to post and change url from applied to apply * allowIntegrationConfigurations top-level = true' --- integrations/custom-approvals/manifest.json | 29 +++++++++++---------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index 55e1efaf..f8a2558e 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -33,6 +33,7 @@ "placeholder": "e.g. https://mycustomapprovalservice.com" } ], + "allowIntegrationConfigurations": true, "capabilities": { "approval": { "name": "Custom Approvals", @@ -54,11 +55,11 @@ } ] }, - "jsonBody": "{\"links\": {\"href\": \"{{_links.approval.href}}\"}, \"approvalId\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.simple}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{approvalDescription}}\" }", + "jsonBody": "{\"_site\": {\"href\": \"{{_links.approval.href}}\"}, \"_id\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.milliseconds}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{approvalDescription}}\" }", "parser": { - "approvalId": "/id", - "statusValue": "/result/status", - "statusDisplay": "/result/displayStatus", + "approvalId": "/_id", + "statusValue": "/status/value", + "statusDisplay": "/status/display", "approvalMatcher": "approved", "rejectionMatcher": "declined", "urlTemplate": "{{ baseURL }}/approvals?approvalID={{ context.approvalId }}" @@ -76,16 +77,16 @@ ] }, "parser": { - "statusValue": "/result/status", - "statusDisplay": "/result/displayStatus", + "statusValue": "/status/value", + "statusDisplay": "/status/display", "approvalMatcher": "approved", "rejectionMatcher": "declined" } }, "postApplyRequest": { "endpoint": { - "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/applied", - "method": "PATCH", + "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/apply", + "method": "POST", "headers": [ { "name": "Content-Type", @@ -98,8 +99,8 @@ ] }, "parser": { - "statusValue": "/result/status", - "statusDisplay": "/result/displayStatus", + "statusValue": "/status/value", + "statusDisplay": "/status/display", "approvalMatcher": "approved", "rejectionMatcher": "declined" } @@ -107,7 +108,7 @@ "deletionRequest": { "endpoint": { "url": "{{ baseURL }}/api/approvals/{{ context.approvalId }}/cancel", - "method": "PATCH", + "method": "POST", "headers": [ { "name": "Content-Type", @@ -120,8 +121,8 @@ ] }, "parser": { - "statusValue": "/result/status", - "statusDisplay": "/result/displayStatus", + "statusValue": "/status/value", + "statusDisplay": "/status/display", "approvalMatcher": "approved", "rejectionMatcher": "declined" } @@ -138,7 +139,7 @@ ] }, "parser": { - "memberArrayPath": "/result", + "memberArrayPath": "/members", "memberItems": { "memberId": "/name", "email": "/email" From d9b87df684d41d3ad1e0fa9b3e12563f990266c7 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 7 Oct 2024 12:46:14 +0200 Subject: [PATCH 818/936] fix (#586) --- manifest.schema.d.ts | 5 +++++ manifest.schema.json | 14 +++++++------- schemas/base.json | 14 +++++++------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index d823a577..6d4b9afc 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -682,6 +682,10 @@ export type IncludeErrorResponseBody1 = boolean; * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ export type OAuthIntegrationKey = string; +/** + * Whether the integration allows integration configurations. Will apply to all capabilities on the manifest. + */ +export type AllowIntegrationConfigurations = boolean; /** * Describes the capabilities and intent of a LaunchDarkly integration @@ -704,6 +708,7 @@ export interface LaunchDarklyIntegrationsManifest { formVariables?: FormVariables; capabilities?: Capabilities; oauthIntegrationKey?: OAuthIntegrationKey; + allowIntegrationConfigurations?: AllowIntegrationConfigurations; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index d5444668..3257216a 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -4362,15 +4362,15 @@ "minLength": 3, "maxLength": 100, "type": "string" + }, + "allowIntegrationConfigurations": { + "$id": "#/properties/allow-integration-configurations", + "title": "Allow Integration Configurations", + "description": "Whether the integration allows integration configurations. Will apply to all capabilities on the manifest.", + "type": "boolean", + "default": false } }, - "allowIntegrationConfigurations": { - "$id": "#/properties/allow-integration-configurations", - "title": "Allow Integration Configurations", - "description": "Whether the integration allows integration configurations. Will apply to all capabilities on the manifest.", - "type": "boolean", - "default": false - }, "required": [ "name", "version", diff --git a/schemas/base.json b/schemas/base.json index b07171c6..72f996db 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -317,15 +317,15 @@ "minLength": 3, "maxLength": 100, "type": "string" + }, + "allowIntegrationConfigurations": { + "$id": "#/properties/allow-integration-configurations", + "title": "Allow Integration Configurations", + "description": "Whether the integration allows integration configurations. Will apply to all capabilities on the manifest.", + "type": "boolean", + "default": false } }, - "allowIntegrationConfigurations": { - "$id": "#/properties/allow-integration-configurations", - "title": "Allow Integration Configurations", - "description": "Whether the integration allows integration configurations. Will apply to all capabilities on the manifest.", - "type": "boolean", - "default": false - }, "required": [ "name", "version", From aeb3cada25aa85204e8dade168c323d145d3e969 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Fri, 11 Oct 2024 10:07:56 -0400 Subject: [PATCH 819/936] Bumped jest version --- package-lock.json | 9282 +++++++++++++-------------------------------- package.json | 2 +- 2 files changed, 2562 insertions(+), 6722 deletions(-) diff --git a/package-lock.json b/package-lock.json index c10aa222..70e509bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@types/node": "^20.3.1", "ajv": "^6.10.2", "handlebars": "^4.7.7", - "jest": "^26.6.3", + "jest": "^29.7.0", "jest-expect-message": "1.0.2", "jest-junit": "^13.0.0", "json-schema-to-typescript": "^10.0.0", @@ -33,122 +33,83 @@ "typescript": "^5.1.3" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", - "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.0", - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/code-frame/node_modules/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==", + "node_modules/@ampproject/remapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", + "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "@jsdevtools/ono": "^7.1.0", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" } }, - "node_modules/@babel/code-frame/node_modules/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==", + "node_modules/@babel/code-frame": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dev": true, "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/compat-data": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", - "convert-source-map": "^1.7.0", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -158,195 +119,168 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "@babel/types": "^7.12.7" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@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==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dev": true, "dependencies": { - "@babel/types": "^7.12.5" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@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, - "dependencies": { - "@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" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, "dependencies": { - "@babel/types": "^7.12.10" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@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 - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", - "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.12.7", - "@babel/helper-optimise-call-expression": "^7.12.10", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.11" + "engines": { + "node": ">=6.9.0" } }, "node_modules/@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, - "dependencies": { - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, "dependencies": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -424,10 +358,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.25.8" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -460,12 +397,42 @@ } }, "node_modules/@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==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -495,6 +462,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@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", @@ -567,47 +549,77 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@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==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -615,13 +627,13 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -634,22 +646,6 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -775,270 +771,346 @@ } }, "node_modules/@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@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", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "ci-info": "^3.2.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", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@jest/core/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" + "jest-get-type": "^29.6.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@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", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-instrument": "^6.0.0", "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", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.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" + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "optionalDependencies": { - "node-notifier": "^8.0.0" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@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==", + "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 10.14.2" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@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==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@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==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { - "@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" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@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", + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "write-file-atomic": "^4.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^15.0.0", + "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -1049,9 +1121,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1124,31 +1196,28 @@ "node": ">=14" } }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@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==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@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, - "engines": { - "node": ">= 6" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@tsconfig/node10": { @@ -1176,31 +1245,31 @@ "dev": true }, "node_modules/@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==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "node_modules/@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==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -1208,12 +1277,12 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", - "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { @@ -1276,9 +1345,9 @@ } }, "node_modules/@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==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -1295,24 +1364,24 @@ } }, "node_modules/@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==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@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==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@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==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" @@ -1352,18 +1421,6 @@ "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", "dev": true }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.6.tgz", - "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", - "dev": true - }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -1397,9 +1454,9 @@ } }, "node_modules/@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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "node_modules/@types/through": { @@ -1412,24 +1469,18 @@ } }, "node_modules/@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/abbrev": { @@ -1450,49 +1501,6 @@ "node": ">= 0.6" } }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -1595,33 +1603,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", @@ -1654,129 +1635,120 @@ "node": ">=8" } }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@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", + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.8.0" } }, "node_modules/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==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "dependencies": { "@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", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" }, "engines": { "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", + "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, "dependencies": { "@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-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@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/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^26.6.2", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -1788,36 +1760,6 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1916,11 +1858,37 @@ "node": ">=8" } }, - "node_modules/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==", - "dev": true + "node_modules/browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } }, "node_modules/bser": { "version": "2.1.1", @@ -1956,9 +1924,9 @@ } }, "node_modules/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==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/bytes": { @@ -1969,26 +1937,6 @@ "node": ">= 0.8" } }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2035,6 +1983,26 @@ "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001668", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", + "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, "node_modules/capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", @@ -2046,22 +2014,10 @@ "upper-case-first": "^2.0.2" } }, - "node_modules/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, - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -2137,128 +2093,39 @@ } }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, "node_modules/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==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", "dev": true }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", - "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "node_modules/cli-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", + "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", "dev": true, "dependencies": { "ansi-regex": "^2.1.1", @@ -2312,14 +2179,17 @@ } }, "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { @@ -2334,7 +2204,7 @@ "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "engines": { "iojs": ">= 1.0.0", @@ -2342,24 +2212,11 @@ } }, "node_modules/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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2378,24 +2235,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2452,13 +2291,10 @@ } }, "node_modules/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, - "dependencies": { - "safe-buffer": "~5.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/cookie": { "version": "0.5.0", @@ -2473,13 +2309,25 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/create-require": { @@ -2502,30 +2350,6 @@ "node": ">= 8" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -2536,20 +2360,6 @@ "type": "^1.0.1" } }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/dateformat": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.5.1.tgz", @@ -2559,12 +2369,12 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2575,40 +2385,24 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, - "engines": { - "node": ">=0.10" + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" @@ -2623,19 +2417,6 @@ "clone": "^1.0.2" } }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/del": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", @@ -2693,15 +2474,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2747,12 +2519,12 @@ } }, "node_modules/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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { @@ -2767,27 +2539,6 @@ "node": ">=8" } }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", @@ -2809,13 +2560,19 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/electron-to-chromium": { + "version": "1.5.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", + "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==", + "dev": true + }, "node_modules/emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" @@ -2835,15 +2592,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2897,6 +2645,15 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2911,28 +2668,6 @@ "node": ">=8" } }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2946,24 +2681,6 @@ "node": ">=4" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -2982,26 +2699,20 @@ "es5-ext": "~0.10.14" } }, - "node_modules/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 - }, "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "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.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" }, "engines": { @@ -3014,182 +2725,44 @@ "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "homedir-polyfill": "^1.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -3280,19 +2853,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -3307,58 +2867,6 @@ "node": ">=4" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -3387,12 +2895,6 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -3403,9 +2905,9 @@ } }, "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "dependencies": { "bser": "2.1.1" @@ -3588,20 +3090,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -3610,18 +3098,6 @@ "node": ">= 0.6" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -3697,29 +3173,17 @@ } }, "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -3850,18 +3314,11 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/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 - }, "node_modules/handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", @@ -3925,69 +3382,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -4010,24 +3404,6 @@ "node": ">=0.10.0" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4049,40 +3425,13 @@ "node": ">= 0.8" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "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, "engines": { - "node": ">=8.12.0" + "node": ">=10.17.0" } }, "node_modules/iconv-lite": { @@ -4132,9 +3481,9 @@ "dev": true }, "node_modules/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==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "dependencies": { "pkg-dir": "^4.2.0", @@ -4145,12 +3494,15 @@ }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" @@ -4247,22 +3599,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/inquirer/node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -4323,23 +3659,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -4370,22 +3689,10 @@ "node": ">=0.10.0" } }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "node_modules/is-binary-path": { @@ -4400,90 +3707,18 @@ "node": ">=8" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" + "has": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4562,24 +3797,6 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -4599,20 +3816,17 @@ } }, "node_modules/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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, "node_modules/is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -4646,25 +3860,6 @@ "node": ">=0.10.0" } }, - "node_modules/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, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "node_modules/isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", @@ -4693,56 +3888,60 @@ } }, "node_modules/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==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/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==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -4750,13 +3949,13 @@ "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -4785,176 +3984,212 @@ } }, "node_modules/jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "@jest/core": "^26.6.3", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^26.6.3" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.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" + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, "node_modules/jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", + "ci-info": "^3.2.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" + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { + "@types/node": "*", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, "ts-node": { "optional": true } } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-expect-message": { @@ -4964,68 +4199,37 @@ "dev": true }, "node_modules/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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "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", - "sane": "^4.0.3", - "walker": "^1.0.7" + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { - "fsevents": "^2.1.2" - } - }, - "node_modules/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, - "dependencies": { - "@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" - }, - "engines": { - "node": ">= 10.14.2" + "fsevents": "^2.3.2" } }, "node_modules/jest-junit": { @@ -5044,70 +4248,71 @@ } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", "slash": "^3.0.0", - "stack-utils": "^2.0.2" + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "engines": { "node": ">=6" @@ -5122,167 +4327,148 @@ } }, "node_modules/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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@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" + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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, - "dependencies": { - "@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", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", + "cjs-module-lexer": "^1.0.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", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/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, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" + "strip-bom": "^4.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.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", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -5291,43 +4477,43 @@ } }, "node_modules/jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^26.6.2" + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { "node": ">=10" @@ -5337,35 +4523,52 @@ } }, "node_modules/jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.2", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { - "node": ">= 10.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/js-tokens": { @@ -5387,74 +4590,16 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "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.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-parse-even-better-errors": { @@ -5573,19 +4718,6 @@ "node": ">=6" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/liftoff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", @@ -5615,9 +4747,9 @@ } }, "node_modules/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=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "node_modules/locate-path": { @@ -5682,15 +4814,12 @@ } }, "node_modules/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==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/lru-queue": { @@ -5703,27 +4832,30 @@ } }, "node_modules/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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/make-error": { @@ -5745,12 +4877,12 @@ } }, "node_modules/makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "dependencies": { - "tmpl": "1.0.x" + "tmpl": "1.0.5" } }, "node_modules/map-cache": { @@ -5762,18 +4894,6 @@ "node": ">=0.10.0" } }, - "node_modules/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, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -5905,19 +5025,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -5931,10 +5038,9 @@ } }, "node_modules/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 + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mute-stream": { "version": "0.0.8", @@ -5953,32 +5059,10 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node_modules/negotiator": { @@ -6001,12 +5085,6 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -6020,49 +5098,9 @@ "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-notifier": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", - "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", - "dev": true, - "optional": true, - "dependencies": { - "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" - } - }, - "node_modules/node-notifier/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-plop": { "version": "0.31.0", "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.31.0.tgz", @@ -6087,6 +5125,12 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, "node_modules/nodemon": { "version": "2.0.22", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", @@ -6160,18 +5204,6 @@ "node": "*" } }, - "node_modules/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, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6193,12 +5225,6 @@ "node": ">=8" } }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6208,91 +5234,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -6301,18 +5242,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -6388,23 +5317,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/ora": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", @@ -6507,28 +5419,34 @@ "node": ">=0.10.0" } }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/p-limit": { + "node_modules/p-locate/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", @@ -6543,18 +5461,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -6604,9 +5510,9 @@ } }, "node_modules/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": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", @@ -6630,12 +5536,6 @@ "node": ">=0.10.0" } }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -6654,15 +5554,6 @@ "tslib": "^2.0.3" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", @@ -6766,6 +5657,12 @@ "node": ">=8" } }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -6779,13 +5676,10 @@ } }, "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, "engines": { "node": ">= 6" } @@ -6836,24 +5730,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/prettier": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", @@ -6867,24 +5743,35 @@ } }, "node_modules/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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">= 10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "dependencies": { "kleur": "^3.0.3", @@ -6906,28 +5793,12 @@ "node": ">= 0.10" } }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -6937,6 +5808,22 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -6999,61 +5886,11 @@ } }, "node_modules/react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, - "node_modules/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, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/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, - "engines": { - "node": ">=8" - } - }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -7092,58 +5929,15 @@ "node": ">= 10.13.0" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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 - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/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 - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -7200,12 +5994,14 @@ "node": ">=8" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/restore-cursor": { "version": "3.1.0", @@ -7220,15 +6016,6 @@ "node": ">=8" } }, - "node_modules/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, - "engines": { - "node": ">=0.12" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -7303,15 +6090,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true, - "engines": { - "node": "6.* || >= 7.*" - } - }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -7353,323 +6131,11 @@ "tslib": "^2.1.0" } }, - "node_modules/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 - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", - "dev": true, - "dependencies": { - "@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" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/sane/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/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, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -7715,11 +6181,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "node_modules/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", @@ -7745,48 +6206,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7813,13 +6232,6 @@ "node": ">=8" } }, - "node_modules/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 - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -7834,9 +6246,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/simple-update-notifier": { @@ -7885,397 +6297,41 @@ "tslib": "^2.0.3" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "node_modules/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, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.0" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/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, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, "node_modules/statuses": { @@ -8322,9 +6378,9 @@ ] }, "node_modules/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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "dependencies": { "char-regex": "^1.0.2", @@ -8335,14 +6391,14 @@ } }, "node_modules/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==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" @@ -8397,15 +6453,6 @@ "node": ">=8" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -8415,26 +6462,25 @@ "node": ">=6" } }, - "node_modules/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==", + "node_modules/strip-json-comments": { + "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, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "node_modules/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, "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" @@ -8452,32 +6498,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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==", + "node_modules/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, "dependencies": { "@istanbuljs/schema": "^0.1.2", @@ -8509,12 +6533,6 @@ "node": ">=0.8" } }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -8561,51 +6579,12 @@ "node_modules/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=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8638,33 +6617,6 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -8741,18 +6693,6 @@ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -8786,15 +6726,6 @@ "node": ">= 0.6" } }, - "node_modules/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, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", @@ -8836,39 +6767,6 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -8877,52 +6775,34 @@ "node": ">= 0.8" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" + "bin": { + "update-browserslist-db": "cli.js" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, "node_modules/upper-case": { @@ -8952,13 +6832,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, "node_modules/url-parse": { "version": "1.5.9", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.9.tgz", @@ -8968,15 +6841,6 @@ "requires-port": "^1.0.0" } }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -9007,26 +6871,27 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", - "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "convert-source-map": "^2.0.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "engines": { - "node": ">= 8" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/v8flags": { @@ -9038,16 +6903,6 @@ "node": ">= 10.13.0" } }, - "node_modules/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", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -9056,34 +6911,13 @@ "node": ">= 0.8" } }, - "node_modules/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==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "dependencies": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "node_modules/wcwidth": { @@ -9095,44 +6929,6 @@ "defaults": "^1.0.3" } }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9148,21 +6944,6 @@ "node": ">= 8" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -9170,9 +6951,9 @@ "dev": true }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -9180,7 +6961,10 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi-cjs": { @@ -9208,36 +6992,16 @@ "dev": true }, "node_modules/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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "signal-exit": "^3.0.7" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/xml": { @@ -9246,63 +7010,46 @@ "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", "dev": true }, - "node_modules/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==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, "engines": { - "node": ">=6" + "node": ">=12" } }, "node_modules/yn": { @@ -9313,9 +7060,43 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { + "@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } + } + }, "@apidevtools/json-schema-ref-parser": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", @@ -9328,120 +7109,68 @@ } }, "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dev": true, "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "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==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" } }, + "@babel/compat-data": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", + "dev": true + }, "@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", - "convert-source-map": "^1.7.0", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } }, "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dev": true, "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "dependencies": { "@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", @@ -9450,143 +7179,103 @@ } } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "@babel/helper-compilation-targets": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, "requires": { - "@babel/types": "^7.12.7" + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@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==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dev": true, "requires": { - "@babel/types": "^7.12.5" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@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.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@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==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true }, - "@babel/helper-replace-supers": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", - "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.7", - "@babel/helper-optimise-call-expression": "^7.12.10", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.11" - } - }, "@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.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true }, "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "dependencies": { "ansi-styles": { @@ -9648,10 +7337,13 @@ } }, "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "dev": true, + "requires": { + "@babel/types": "^7.25.8" + } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -9672,12 +7364,30 @@ } }, "@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==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-syntax-import-meta": { @@ -9698,6 +7408,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" + } + }, "@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", @@ -9752,52 +7471,67 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, "@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==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" } }, @@ -9807,16 +7541,6 @@ "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" - } - }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -9905,223 +7629,288 @@ } }, "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "requires": { - "@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", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", + "ci-info": "^3.2.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", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "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" - } - } } }, "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^26.6.2" + "jest-mock": "^29.7.0" + } + }, + "@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "requires": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + } + }, + "@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "requires": { + "jest-get-type": "^29.6.3" } }, "@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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" } }, "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" } }, "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "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", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-instrument": "^6.0.0", "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", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.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" + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } + } + }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" } }, "@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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" + "graceful-fs": "^4.2.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } } }, "@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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "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/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" } }, "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", "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", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" + "write-file-atomic": "^4.0.2" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } } }, "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "requires": { + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^15.0.0", + "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + } } }, "@jridgewell/resolve-uri": { @@ -10131,9 +7920,9 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/sourcemap-codec": { @@ -10191,30 +7980,30 @@ "dev": true, "optional": true }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "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==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { - "@sinonjs/commons": "^1.7.0" + "@sinonjs/commons": "^3.0.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 - }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -10240,31 +8029,31 @@ "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==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@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==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.0.tgz", - "integrity": "sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -10272,12 +8061,12 @@ } }, "@types/babel__traverse": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.11.0.tgz", - "integrity": "sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "@types/body-parser": { @@ -10340,9 +8129,9 @@ } }, "@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==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "requires": { "@types/node": "*" @@ -10359,24 +8148,24 @@ } }, "@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==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "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==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "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==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" @@ -10416,18 +8205,6 @@ "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", "dev": true }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, - "@types/prettier": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.6.tgz", - "integrity": "sha512-6gOkRe7OIioWAXfnO/2lFiv+SJichKVSys1mSsgyrYHSEjk8Ctv4tSR/Odvnu+HWlH2C8j53dahU03XmQdd5fA==", - "dev": true - }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -10461,9 +8238,9 @@ } }, "@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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "@types/through": { @@ -10476,24 +8253,18 @@ } }, "@types/yargs": { - "version": "15.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz", - "integrity": "sha512-f+fD/fQAo3BCbCDlrUpznF1A5Zp9rB0noS5vnoormHSIPFKL0Z2DcUJ3Gxp5ytH4uLRNxy7AwYUC9exZzqGMAw==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "abbrev": { @@ -10511,37 +8282,6 @@ "negotiator": "0.6.3" } }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "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==", - "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==", - "dev": true, - "requires": { - "debug": "4" - } - }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -10619,28 +8359,10 @@ "sprintf-js": "~1.0.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==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", "dev": true }, "array-flatten": { @@ -10660,98 +8382,97 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "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 - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "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", + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "slash": "^3.0.0" } }, "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==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "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", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", + "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "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-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@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/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" } }, "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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^26.6.2", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -10761,32 +8482,6 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -10863,11 +8558,17 @@ "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==", - "dev": true + "browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + } }, "bser": { "version": "2.1.1", @@ -10889,9 +8590,9 @@ } }, "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==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "bytes": { @@ -10899,23 +8600,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -10953,6 +8637,12 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "caniuse-lite": { + "version": "1.0.30001668", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", + "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", + "dev": true + }, "capital-case": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", @@ -10964,19 +8654,10 @@ "upper-case-first": "^2.0.2" } }, - "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" - } - }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -11032,97 +8713,17 @@ } }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "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==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "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-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -11173,14 +8774,14 @@ "dev": true }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" } }, "clone": { @@ -11192,25 +8793,15 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -11226,21 +8817,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "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==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -11279,13 +8855,10 @@ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "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" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "cookie": { "version": "0.5.0", @@ -11297,11 +8870,20 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "requires": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + } }, "create-require": { "version": "1.1.1", @@ -11320,29 +8902,6 @@ "which": "^2.0.1" } }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "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==", - "dev": true - } - } - }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -11353,59 +8912,31 @@ "type": "^1.0.1" } }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, "dateformat": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.5.1.tgz", "integrity": "sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==" }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "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==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "requires": {} }, "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, "defaults": { @@ -11417,16 +8948,6 @@ "clone": "^1.0.2" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, "del": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", @@ -11468,12 +8989,6 @@ } } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -11503,9 +9018,9 @@ "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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "dir-glob": { @@ -11517,23 +9032,6 @@ "path-type": "^4.0.0" } }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "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==", - "dev": true - } - } - }, "dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", @@ -11555,10 +9053,16 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "electron-to-chromium": { + "version": "1.5.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", + "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==", + "dev": true + }, "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, "emoji-regex": { @@ -11572,15 +9076,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -11634,6 +9129,12 @@ "es6-symbol": "^3.1.1" } }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -11645,37 +9146,12 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -11691,169 +9167,49 @@ "es5-ext": "~0.10.14" } }, - "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", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "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.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "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", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "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-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "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-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, "requires": { "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "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" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" } }, "express": { @@ -11937,16 +9293,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -11958,48 +9304,6 @@ "tmp": "^0.0.33" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "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-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -12025,12 +9329,6 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -12041,9 +9339,9 @@ } }, "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" @@ -12186,31 +9484,11 @@ } } }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -12264,18 +9542,9 @@ "dev": true }, "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "glob": { @@ -12373,18 +9642,11 @@ } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "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.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", @@ -12422,58 +9684,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "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", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -12493,21 +9703,6 @@ "parse-passwd": "^1.0.0" } }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "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==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -12526,31 +9721,10 @@ "toidentifier": "1.0.1" } }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "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 }, "iconv-lite": { @@ -12580,9 +9754,9 @@ "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==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -12592,7 +9766,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indent-string": { @@ -12666,16 +9840,6 @@ "ieee754": "^1.1.13" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -12714,17 +9878,6 @@ "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } } } }, @@ -12749,19 +9902,10 @@ "is-windows": "^1.0.1" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "is-binary-path": { @@ -12773,21 +9917,6 @@ "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "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.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", @@ -12797,42 +9926,6 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "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": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -12884,21 +9977,6 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -12915,15 +9993,9 @@ } }, "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 - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-unc-path": { @@ -12947,22 +10019,6 @@ "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", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", @@ -12982,46 +10038,47 @@ "dev": true }, "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==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true }, "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==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "dependencies": { "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -13030,9 +10087,9 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -13050,135 +10107,151 @@ } }, "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "requires": { - "@jest/core": "^26.6.3", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^26.6.3" + "jest-cli": "^29.7.0" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" } }, "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.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" + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" } }, "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", + "ci-info": "^3.2.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" + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - } - }, - "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" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" } }, "jest-expect-message": { @@ -13188,57 +10261,29 @@ "dev": true }, "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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", "@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", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "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": { - "@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" + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" } }, "jest-junit": { @@ -13254,262 +10299,263 @@ } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", "slash": "^3.0.0", - "stack-utils": "^2.0.2" + "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" } }, "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==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "requires": {} }, "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==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@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" + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" } }, "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", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "requires": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", + "cjs-module-lexer": "^1.0.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", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - } - }, - "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" + "strip-bom": "^4.0.0" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.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", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "dependencies": { "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true } } }, "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "requires": { - "@jest/types": "^26.6.2", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^26.6.2" + "pretty-format": "^29.7.0" }, "dependencies": { "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true } } }, "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.6.2", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", "string-length": "^4.0.1" } }, "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "requires": { "@types/node": "*", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "js-tokens": { @@ -13528,53 +10574,10 @@ "esprima": "^4.0.0" } }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "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.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true - } - } - }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true }, "json-parse-even-better-errors": { @@ -13668,16 +10671,6 @@ "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=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, "liftoff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", @@ -13703,9 +10696,9 @@ } }, "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=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "locate-path": { @@ -13757,12 +10750,12 @@ } }, "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==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "yallist": "^4.0.0" + "yallist": "^3.0.2" } }, "lru-queue": { @@ -13775,18 +10768,18 @@ } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "requires": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "dependencies": { "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -13807,12 +10800,12 @@ } }, "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { - "tmpl": "1.0.x" + "tmpl": "1.0.5" } }, "map-cache": { @@ -13821,15 +10814,6 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "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" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -13928,16 +10912,6 @@ "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", "dev": true }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -13945,10 +10919,9 @@ "dev": true }, "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 + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "mute-stream": { "version": "0.0.8", @@ -13967,29 +10940,10 @@ "thenify-all": "^1.0.0" } }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "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=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "negotiator": { @@ -14009,12 +10963,6 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -14028,42 +10976,9 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "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.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", - "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", - "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.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, "node-plop": { "version": "0.31.0", "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.31.0.tgz", @@ -14085,6 +11000,12 @@ "upper-case": "^2.0.2" } }, + "node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, "nodemon": { "version": "2.0.22", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", @@ -14138,18 +11059,6 @@ "abbrev": "1" } }, - "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" - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -14165,100 +11074,17 @@ "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==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "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" - } - } - } - }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -14316,20 +11142,6 @@ "mimic-fn": "^2.1.0" } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "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" - } - }, "ora": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", @@ -14395,25 +11207,13 @@ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { @@ -14423,6 +11223,17 @@ "dev": true, "requires": { "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "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-map": { @@ -14462,9 +11273,9 @@ } }, "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": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -14479,12 +11290,6 @@ "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -14500,12 +11305,6 @@ "tslib": "^2.0.3" } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, "path-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", @@ -14584,6 +11383,12 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -14591,13 +11396,10 @@ "dev": true }, "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" - } + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true }, "pkg-dir": { "version": "4.2.0", @@ -14632,18 +11434,6 @@ } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "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=", - "dev": true - }, "prettier": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", @@ -14651,21 +11441,28 @@ "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==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } } }, "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { "kleur": "^3.0.3", @@ -14681,34 +11478,24 @@ "ipaddr.js": "1.9.1" } }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, "pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true + }, "qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -14745,50 +11532,11 @@ } }, "react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "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" - }, - "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 - } - } - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -14818,44 +11566,10 @@ "resolve": "^1.20.0" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "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", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "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==", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, "requires-port": { @@ -14899,10 +11613,10 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, "restore-cursor": { @@ -14915,12 +11629,6 @@ "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 - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -14969,12 +11677,6 @@ } } }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -14999,264 +11701,11 @@ "tslib": "^2.1.0" } }, - "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 - }, - "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==" }, - "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": { - "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-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "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" - } - } - } - }, - "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" - } - } - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -15297,11 +11746,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -15327,41 +11771,6 @@ "send": "0.18.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^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" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -15382,304 +11791,75 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "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 - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, - "requires": { - "semver": "~7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "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", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "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", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "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-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "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-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "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 - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "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" - } - } - } - }, - "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 - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "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, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } } }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "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 }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "sprintf-js": { @@ -15689,92 +11869,14 @@ "dev": true }, "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "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-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "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-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -15804,9 +11906,9 @@ } }, "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", @@ -15814,14 +11916,14 @@ } }, "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==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "string-width-cjs": { @@ -15859,18 +11961,18 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-json-comments": { + "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", @@ -15880,38 +11982,12 @@ "has-flag": "^4.0.0" } }, - "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "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==", - "dev": true - }, - "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" - } - }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -15941,12 +12017,6 @@ "thenify": ">= 3.1.0 < 4" } }, - "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", @@ -15990,41 +12060,9 @@ "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=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "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" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -16048,27 +12086,6 @@ "nopt": "~1.0.10" } }, - "tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -16116,15 +12133,6 @@ "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -16146,15 +12154,6 @@ "mime-types": "~2.1.24" } }, - "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" - } - }, "typescript": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", @@ -16180,75 +12179,19 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "upper-case": { @@ -16278,12 +12221,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "url-parse": { "version": "1.5.9", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.9.tgz", @@ -16293,12 +12230,6 @@ "requires-port": "^1.0.0" } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16323,21 +12254,25 @@ "dev": true }, "v8-to-istanbul": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz", - "integrity": "sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "convert-source-map": "^2.0.0" }, "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 + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } } } }, @@ -16347,46 +12282,18 @@ "integrity": "sha512-83N0OkTbn6gOjJ2awNuzuK4czeGxwEwBoTqlhBZhnp8o0IJ72mXRQKphj/azwRf3acbDJZYZhbOPEJHd884ELg==", "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", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "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=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "wcwidth": { @@ -16398,38 +12305,6 @@ "defaults": "^1.0.3" } }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -16439,18 +12314,6 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -16458,9 +12321,9 @@ "dev": true }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -16486,88 +12349,65 @@ "dev": true }, "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "requires": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^3.0.7" } }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "dev": true, - "requires": {} - }, "xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", "dev": true }, - "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==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" } }, "yargs-parser": { - "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" - } + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 4add8217..eb685ae9 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@types/node": "^20.3.1", "ajv": "^6.10.2", "handlebars": "^4.7.7", - "jest": "^26.6.3", + "jest": "^29.7.0", "jest-expect-message": "1.0.2", "jest-junit": "^13.0.0", "json-schema-to-typescript": "^10.0.0", From 27e6cd7e5a828999774846cfc149843f71aececf Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Thu, 10 Oct 2024 15:09:00 -0700 Subject: [PATCH 820/936] [RO-460] Add event hook integration capability schema This adds a first draft of the EDA event hook capability schema. This will be similar to the auditLogHook capability, but triggered by eda events instead of audit log events. It'll create a repeatable task that triggers on configured events and renders templates with goaltender as an action. --- schemas/capabilities/eventsHook.json | 77 ++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 schemas/capabilities/eventsHook.json diff --git a/schemas/capabilities/eventsHook.json b/schemas/capabilities/eventsHook.json new file mode 100644 index 00000000..56ba30a7 --- /dev/null +++ b/schemas/capabilities/eventsHook.json @@ -0,0 +1,77 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "eventsHook": { + "$id": "#/properties/capability/events-hook", + "title": "Events hook", + "description": "This capability will enable LaunchDarkly to send webhooks to your endpoint when particular events are observed.", + "type": "object", + "propertyNames": { + "enum": ["endpoint", "templates", "includeErrorResponseBody", "triggers"] + }, + "properties": { + "endpoint": { + "$ref": "../definitions.json#/endpoint" + }, + "templates": { + "$id": "#/properties/capability/events-hook/templates", + "title": "Webhook body template", + "description": "A map of event types to templates to use to render the webhook", + "type": "object" + }, + "includeErrorResponseBody": { + "$id": "#/properties/include-error-response-body", + "title": "Include error response body", + "type": "boolean", + "description": "Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI", + "default": false + }, + "triggers": { + "$id": "#/properties/triggers", + "title": "Triggers", + "type": "object", + "propertyNames": { + "enum": ["validEvents", "eventFilters"] + }, + "properties": { + "validEvents": { + "$id": "#/properties/triggers/validEvents", + "title": "Valid events", + "type": "array", + "items": { + "type": "string" + } + }, + "eventFilters": { + "$id": "#/properties/triggers/eventFilters", + "title": "Event filters", + "type": "array", + "items": { + "type": "object", + "propertyNames": { + "enum": ["key", "optional", "value"] + }, + "properties": { + "key": { + "$id": "#/properties/triggers/eventFilters/key", + "title": "Key", + "type": "string" + }, + "optional": { + "$id": "#/properties/triggers/eventFilters/optional", + "title": "Optional", + "type": "boolean" + }, + "value": { + "$id": "#/properties/triggers/eventFilters/value", + "title": "Value", + "type": "string" + } + } + } + } + } + } + }, + "required": ["templates", "endpoint", "triggers"] + } +} From 8bcfdc2a6c71922f97ac9caf9fca330cd1878cd1 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 14 Oct 2024 12:39:58 -0400 Subject: [PATCH 821/936] Added environment selector and multi select form variable types --- manifest.schema.d.ts | 39 ++++++- manifest.schema.json | 240 +++++++++++++++++++++++++++++++++++++-- schemas/definitions.json | 57 +++++++++- 3 files changed, 325 insertions(+), 11 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 6d4b9afc..e690828e 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -215,7 +215,16 @@ export type Name = string; /** * The type of the variable */ -export type Type = "string" | "boolean" | "uri" | "enum" | "oauth" | "dynamicEnum" | "generated"; +export type Type = + | "string" + | "boolean" + | "uri" + | "enum" + | "oauth" + | "dynamicEnum" + | "generated" + | "environmentSelector" + | "multiselect"; /** * Describes the variable in the UI. Markdown links allowed. */ @@ -228,6 +237,10 @@ export type Description1 = string; * Secret variables will be masked in the UI */ export type IsThisVariableASecret = boolean; +/** + * Variables marked as disabled after saving won't be editable after they are saved + */ +export type DisableAfterSaving = boolean; /** * Variables marked as optional won't be required on the UI */ @@ -331,6 +344,19 @@ export type DependsOn = { conditions: Conditions; [k: string]: unknown; }[]; +/** + * Label of the multi select option + */ +export type Label1 = string; +/** + * Value of the multi select option + */ +export type Value3 = string; +export type OptionsArray1 = MultiSelectOptionItem[]; +/** + * Default options to be selected when the multi select is first rendered + */ +export type MultiSelectDefaultOptions = string[]; /** * Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`. */ @@ -746,12 +772,15 @@ export interface FormVariable { description: Description; placeholder?: Description1; isSecret?: IsThisVariableASecret; + disableAfterSaving?: DisableAfterSaving; isOptional?: IsThisVariableOptional; isHidden?: HideVariableInTheUI; defaultValue?: DefaultValue; allowedValues?: AllowedValues; dynamicOptions?: DynamicOptions; dependsOn?: DependsOn; + multiselectOptions?: OptionsArray1; + multiselectDefaultOptions?: MultiSelectDefaultOptions; [k: string]: unknown; } /** @@ -801,6 +830,14 @@ export interface OptionsArray { value: Value1; [k: string]: unknown; } +/** + * A multi select option item + */ +export interface MultiSelectOptionItem { + label: Label1; + value: Value3; + [k: string]: unknown; +} /** * Specify which capabilities you'd like your integration to have */ diff --git a/manifest.schema.json b/manifest.schema.json index 3257216a..c4432c99 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -292,7 +292,10 @@ "defaultValue", "allowedValues", "dynamicOptions", - "dependsOn" + "dependsOn", + "multiselectOptions", + "multiselectDefaultOptions", + "disableAfterSaving" ] }, "properties": { @@ -323,7 +326,9 @@ "enum", "oauth", "dynamicEnum", - "generated" + "generated", + "environmentSelector", + "multiselect" ] }, "description": { @@ -346,6 +351,13 @@ "description": "Secret variables will be masked in the UI", "default": false }, + "disableAfterSaving": { + "$id": "#/definitions/form-variable/disable-after-saving", + "title": "Disable after saving", + "type": "boolean", + "description": "Variables marked as disabled after saving won't be editable after they are saved", + "default": false + }, "isOptional": { "$id": "#/definitions/form-variable/is-optional", "title": "Is this variable optional?", @@ -666,6 +678,50 @@ } } } + }, + "multiselectOptions": { + "$id": "#/definitions/form-variable/multi-select-options", + "title": "Options array", + "type": "array", + "items": { + "$id": "#/definitions/multiselect-option-item", + "title": "Multi select option item", + "description": "A multi select option item", + "type": "object", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/multiselect-option-item/label", + "title": "Label", + "description": "Label of the multi select option", + "type": "string" + }, + "value": { + "$id": "#/definitions/multiselect-option-item/value", + "title": "Value", + "description": "Value of the multi select option", + "type": "string" + } + } + } + }, + "multiselectDefaultOptions": { + "$id": "#/definitions/form-variable/multiselect-default-options", + "title": "Multi select default options", + "type": "array", + "description": "Default options to be selected when the multi select is first rendered", + "items": { + "type": "string" + } } }, "required": [ @@ -1204,7 +1260,10 @@ "defaultValue", "allowedValues", "dynamicOptions", - "dependsOn" + "dependsOn", + "multiselectOptions", + "multiselectDefaultOptions", + "disableAfterSaving" ] }, "properties": { @@ -1235,7 +1294,9 @@ "enum", "oauth", "dynamicEnum", - "generated" + "generated", + "environmentSelector", + "multiselect" ] }, "description": { @@ -1258,6 +1319,13 @@ "description": "Secret variables will be masked in the UI", "default": false }, + "disableAfterSaving": { + "$id": "#/definitions/form-variable/disable-after-saving", + "title": "Disable after saving", + "type": "boolean", + "description": "Variables marked as disabled after saving won't be editable after they are saved", + "default": false + }, "isOptional": { "$id": "#/definitions/form-variable/is-optional", "title": "Is this variable optional?", @@ -1578,6 +1646,50 @@ } } } + }, + "multiselectOptions": { + "$id": "#/definitions/form-variable/multi-select-options", + "title": "Options array", + "type": "array", + "items": { + "$id": "#/definitions/multiselect-option-item", + "title": "Multi select option item", + "description": "A multi select option item", + "type": "object", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/multiselect-option-item/label", + "title": "Label", + "description": "Label of the multi select option", + "type": "string" + }, + "value": { + "$id": "#/definitions/multiselect-option-item/value", + "title": "Value", + "description": "Value of the multi select option", + "type": "string" + } + } + } + }, + "multiselectDefaultOptions": { + "$id": "#/definitions/form-variable/multiselect-default-options", + "title": "Multi select default options", + "type": "array", + "description": "Default options to be selected when the multi select is first rendered", + "items": { + "type": "string" + } } }, "required": [ @@ -1612,7 +1724,10 @@ "defaultValue", "allowedValues", "dynamicOptions", - "dependsOn" + "dependsOn", + "multiselectOptions", + "multiselectDefaultOptions", + "disableAfterSaving" ] }, "properties": { @@ -1643,7 +1758,9 @@ "enum", "oauth", "dynamicEnum", - "generated" + "generated", + "environmentSelector", + "multiselect" ] }, "description": { @@ -1666,6 +1783,13 @@ "description": "Secret variables will be masked in the UI", "default": false }, + "disableAfterSaving": { + "$id": "#/definitions/form-variable/disable-after-saving", + "title": "Disable after saving", + "type": "boolean", + "description": "Variables marked as disabled after saving won't be editable after they are saved", + "default": false + }, "isOptional": { "$id": "#/definitions/form-variable/is-optional", "title": "Is this variable optional?", @@ -1986,6 +2110,50 @@ } } } + }, + "multiselectOptions": { + "$id": "#/definitions/form-variable/multi-select-options", + "title": "Options array", + "type": "array", + "items": { + "$id": "#/definitions/multiselect-option-item", + "title": "Multi select option item", + "description": "A multi select option item", + "type": "object", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/multiselect-option-item/label", + "title": "Label", + "description": "Label of the multi select option", + "type": "string" + }, + "value": { + "$id": "#/definitions/multiselect-option-item/value", + "title": "Value", + "description": "Value of the multi select option", + "type": "string" + } + } + } + }, + "multiselectDefaultOptions": { + "$id": "#/definitions/form-variable/multiselect-default-options", + "title": "Multi select default options", + "type": "array", + "description": "Default options to be selected when the multi select is first rendered", + "items": { + "type": "string" + } } }, "required": [ @@ -3056,7 +3224,10 @@ "defaultValue", "allowedValues", "dynamicOptions", - "dependsOn" + "dependsOn", + "multiselectOptions", + "multiselectDefaultOptions", + "disableAfterSaving" ] }, "properties": { @@ -3087,7 +3258,9 @@ "enum", "oauth", "dynamicEnum", - "generated" + "generated", + "environmentSelector", + "multiselect" ] }, "description": { @@ -3110,6 +3283,13 @@ "description": "Secret variables will be masked in the UI", "default": false }, + "disableAfterSaving": { + "$id": "#/definitions/form-variable/disable-after-saving", + "title": "Disable after saving", + "type": "boolean", + "description": "Variables marked as disabled after saving won't be editable after they are saved", + "default": false + }, "isOptional": { "$id": "#/definitions/form-variable/is-optional", "title": "Is this variable optional?", @@ -3430,6 +3610,50 @@ } } } + }, + "multiselectOptions": { + "$id": "#/definitions/form-variable/multi-select-options", + "title": "Options array", + "type": "array", + "items": { + "$id": "#/definitions/multiselect-option-item", + "title": "Multi select option item", + "description": "A multi select option item", + "type": "object", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/multiselect-option-item/label", + "title": "Label", + "description": "Label of the multi select option", + "type": "string" + }, + "value": { + "$id": "#/definitions/multiselect-option-item/value", + "title": "Value", + "description": "Value of the multi select option", + "type": "string" + } + } + } + }, + "multiselectDefaultOptions": { + "$id": "#/definitions/form-variable/multiselect-default-options", + "title": "Multi select default options", + "type": "array", + "description": "Default options to be selected when the multi select is first rendered", + "items": { + "type": "string" + } } }, "required": [ diff --git a/schemas/definitions.json b/schemas/definitions.json index 1c336140..1b5c642d 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -144,7 +144,10 @@ "defaultValue", "allowedValues", "dynamicOptions", - "dependsOn" + "dependsOn", + "multiselectOptions", + "multiselectDefaultOptions", + "disableAfterSaving" ] }, "properties": { @@ -175,7 +178,9 @@ "enum", "oauth", "dynamicEnum", - "generated" + "generated", + "environmentSelector", + "multiselect" ] }, "description": { @@ -198,6 +203,13 @@ "description": "Secret variables will be masked in the UI", "default": false }, + "disableAfterSaving": { + "$id": "#/definitions/form-variable/disable-after-saving", + "title": "Disable after saving", + "type": "boolean", + "description": "Variables marked as disabled after saving won't be editable after they are saved", + "default": false + }, "isOptional": { "$id": "#/definitions/form-variable/is-optional", "title": "Is this variable optional?", @@ -366,10 +378,51 @@ } } } + }, + "multiselectOptions": { + "$id": "#/definitions/form-variable/multi-select-options", + "title": "Options array", + "type": "array", + "items": { + "$ref": "#/multiselectOptionItem" + } + }, + "multiselectDefaultOptions": { + "$id": "#/definitions/form-variable/multiselect-default-options", + "title": "Multi select default options", + "type": "array", + "description": "Default options to be selected when the multi select is first rendered", + "items": { + "type": "string" + } } }, "required": ["key", "name", "type", "description"] }, + "multiselectOptionItem": { + "$id": "#/definitions/multiselect-option-item", + "title": "Multi select option item", + "description": "A multi select option item", + "type": "object", + "propertyNames": { + "enum": ["label", "value"] + }, + "required": ["label", "value"], + "properties": { + "label": { + "$id": "#/definitions/multiselect-option-item/label", + "title": "Label", + "description": "Label of the multi select option", + "type": "string" + }, + "value": { + "$id": "#/definitions/multiselect-option-item/value", + "title": "Value", + "description": "Value of the multi select option", + "type": "string" + } + } + }, "uiBlockElement": { "$id": "#/definitions/ui-block-element", "title": "UI Block Element", From ae1db80f24c4ec7c81bf7a1c1c45358d49f99f25 Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Mon, 14 Oct 2024 09:50:34 -0700 Subject: [PATCH 822/936] Add manifest for snowflake experimentation integration --- .../snowflake-experimentation/manifest.json | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 integrations/snowflake-experimentation/manifest.json diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json new file mode 100644 index 00000000..4f4def0b --- /dev/null +++ b/integrations/snowflake-experimentation/manifest.json @@ -0,0 +1,115 @@ +{ + "name": "Snowflake", + "version": "1.0.0", + "overview": "Analyze your Snowflake experimentation data with LaunchDarkly", + "description": "Enable LaunchDarkly's experimentation platform to read and analyze data from your Snowflake data warehouse", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.snowflake.com/", + "launchdarklyDocs": "TODO", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": [ + "data" + ], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "dataExport" + }, + "otherCapabilities": [ + "dataExport" + ], + "formVariables": [ + { + "key": "user", + "name": "User", + "description": "The user used to connect to Snowflake for accessing experimentation data", + "placeholder": "SNOW_USER", + "type": "string", + "isSecret": false + }, + { + "key": "role", + "name": "Role", + "description": "The role used by the connecting user", + "placeholder": "SNOW_ROLE", + "type": "string", + "isSecret": false + }, + { + "key": "organization", + "name": "Organization", + "description": "The name of the Snowflake organization being connected", + "placeholder": "ABC00001", + "type": "string", + "isSecret": false + }, + { + "key": "account", + "name": "Account", + "description": "The Snowflake account being connected", + "placeholder": "ABC00001", + "type": "string", + "isSecret": false + }, + { + "key": "warehouse", + "name": "Warehouse", + "description": "The Snowflake warehouse containing experimentation data", + "placeholder": "LD_EXP_WH", + "type": "string", + "isSecret": false + }, + { + "key": "database", + "name": "Database", + "description": "The Snowflake database containing experimentation data", + "placeholder": "LD_EXP_DB", + "type": "string", + "isSecret": false + }, + { + "key": "schema", + "name": "Schema", + "description": "The Snowflake schema containing experimentation data", + "placeholder": "EXP_SCHEMA", + "type": "string", + "isSecret": false + }, + { + "key": "region", + "name": "Region", + "description": "The Snowflake region the warehouse resides in", + "placeholder": "us-east-1", + "type": "string", + "isSecret": false + }, + { + "key": "region", + "name": "Region", + "description": "The Snowflake region the warehouse resides in", + "placeholder": "us-east-1", + "type": "string", + "isSecret": false + }, + { + "key": "privateKey", + "name": "Private Key", + "description": "Private key on a single line, ", + "placeholder": "e.g. odKAmV6AbsoWsyL3thUoYVDEJAsQl8RrH+JuQ9HWUnDLunDdLEM6oNl15XP1xLOHz3bEq1rvATiQmAByKNOiVujd1gsq7JxfQYDdHRzDhZZrUstnetvGTDBtMHmhzbBXOih+1q3eA2RMQ5izXOEkyMKrWWlcKMWVJzMSYjFeFJB8D8wJNmq1ArNCO3uXfwkZuMnMhYhx/OYvCs4sMWKe5/etyR2gz0Fvp6VDUa0jNRvoad+8/pHK7KDxB8nW5KgmpSjfkl1Ut3zChtwEuAFnSDuypbrODBdphZHD40WmX0f69VKKs44vsKCHr8nzJ8R5dw+2Ggyq5W5hl3PDTMTqn8Pc+cwmPdVe4bkNqxbCHe2omZXpNIgC31wrMBvkyUYvpY8rMoBXqgm9hC5JsXzn6Z6X1kpGFhDjkNSdzx4jYzw=", + "type": "string", + "isSecret": true + }, + { + "key": "environmentId", + "name": "Clientside ID", + "type": "string", + "description": "The clientside ID of the LaunchDarkly environment to connect experimentation data to", + "isOptional": false + }, + ] +} From ccf97096896878ed60339dd5f9c5c7b6db37538d Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Mon, 14 Oct 2024 10:15:04 -0700 Subject: [PATCH 823/936] Enable integration configurations API for snowflake-experimentation --- integrations/snowflake-experimentation/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 4f4def0b..1287c776 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -5,6 +5,7 @@ "description": "Enable LaunchDarkly's experimentation platform to read and analyze data from your Snowflake data warehouse", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", + "allowIntegrationConfigurations": true, "links": { "site": "https://www.snowflake.com/", "launchdarklyDocs": "TODO", From 061cb6cbe8f8fcd30fd0a54b67e3a8f9e2441e52 Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Mon, 14 Oct 2024 10:38:05 -0700 Subject: [PATCH 824/936] Fix JSON syntax --- integrations/snowflake-experimentation/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 1287c776..41cf1d7d 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -111,6 +111,6 @@ "type": "string", "description": "The clientside ID of the LaunchDarkly environment to connect experimentation data to", "isOptional": false - }, + } ] } From 9a0e97ad5cb0bd7b4b00bcc226e2dd96f394f364 Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Mon, 14 Oct 2024 10:41:14 -0700 Subject: [PATCH 825/936] Check in assets --- .../assets/images/horizontal.svg | 27 +++++++++++++++++++ .../assets/images/square.svg | 1 + 2 files changed, 28 insertions(+) create mode 100644 integrations/snowflake-experimentation/assets/images/horizontal.svg create mode 100644 integrations/snowflake-experimentation/assets/images/square.svg diff --git a/integrations/snowflake-experimentation/assets/images/horizontal.svg b/integrations/snowflake-experimentation/assets/images/horizontal.svg new file mode 100644 index 00000000..5b792631 --- /dev/null +++ b/integrations/snowflake-experimentation/assets/images/horizontal.svg @@ -0,0 +1,27 @@ + + logo-blue-svg + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/snowflake-experimentation/assets/images/square.svg b/integrations/snowflake-experimentation/assets/images/square.svg new file mode 100644 index 00000000..70bb8a73 --- /dev/null +++ b/integrations/snowflake-experimentation/assets/images/square.svg @@ -0,0 +1 @@ + From b4f00011ae3354a93f397490ee9a0aa69d2a5ce0 Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Mon, 14 Oct 2024 10:42:40 -0700 Subject: [PATCH 826/936] End overview message in period --- integrations/snowflake-experimentation/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 41cf1d7d..c8b158a9 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -1,7 +1,7 @@ { "name": "Snowflake", "version": "1.0.0", - "overview": "Analyze your Snowflake experimentation data with LaunchDarkly", + "overview": "Analyze your Snowflake experimentation data with LaunchDarkly.", "description": "Enable LaunchDarkly's experimentation platform to read and analyze data from your Snowflake data warehouse", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", From 926a3fa93cc86bd1c84562518994d36a33e66ade Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Mon, 14 Oct 2024 10:45:29 -0700 Subject: [PATCH 827/936] Run prettier --- integrations/snowflake-experimentation/manifest.json | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index c8b158a9..568300cc 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -11,9 +11,7 @@ "launchdarklyDocs": "TODO", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": [ - "data" - ], + "categories": ["data"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" @@ -21,9 +19,7 @@ "legacy": { "kind": "dataExport" }, - "otherCapabilities": [ - "dataExport" - ], + "otherCapabilities": ["dataExport"], "formVariables": [ { "key": "user", From 5839500893af013ed93ee9ae2f5b69700c25458c Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Mon, 14 Oct 2024 10:54:38 -0700 Subject: [PATCH 828/936] Fix validation error --- integrations/snowflake-experimentation/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 568300cc..ebf420cc 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -8,7 +8,7 @@ "allowIntegrationConfigurations": true, "links": { "site": "https://www.snowflake.com/", - "launchdarklyDocs": "TODO", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/TODO", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], From 1146077f1a0efcf67ce86b00839eaca648422c21 Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Mon, 14 Oct 2024 12:33:57 -0700 Subject: [PATCH 829/936] [RO-471] Add PagerDuty integration manifest This adds the integration manifest for the new PagerDuty - Release Guardian integration. Right now the templates for the payloads to PD are stubbed, to be completed in another ticket. I realized that other integrations may not want to have form variables to filter their events by, so removed the `triggers` section that was meant to set those form variables up and used the new `multiselect` and `environment select` types for form variables for this integration. --- integrations/pagerduty-rg/README.md | 0 .../assets/pagerduty-rectangle.svg | 37 ++++ .../pagerduty-rg/assets/pagerduty-square.svg | 64 +++++++ integrations/pagerduty-rg/manifest.json | 91 ++++++++++ .../pagerduty-rg/templates/default.json.hbs | 9 + .../error-monitoring-new-issue-found.json.hbs | 9 + ...sured-rollout-regression-detected.json.hbs | 9 + .../measured-rollout-reverted.json.hbs | 9 + manifest.schema.d.ts | 16 ++ manifest.schema.json | 158 +++++++++++++++++- schemas/base.json | 6 +- schemas/capabilities/auditLogEventsHook.json | 6 +- schemas/capabilities/eventsHook.json | 56 +------ schemas/definitions.json | 7 + 14 files changed, 416 insertions(+), 61 deletions(-) create mode 100644 integrations/pagerduty-rg/README.md create mode 100644 integrations/pagerduty-rg/assets/pagerduty-rectangle.svg create mode 100644 integrations/pagerduty-rg/assets/pagerduty-square.svg create mode 100644 integrations/pagerduty-rg/manifest.json create mode 100644 integrations/pagerduty-rg/templates/default.json.hbs create mode 100644 integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs create mode 100644 integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs create mode 100644 integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs diff --git a/integrations/pagerduty-rg/README.md b/integrations/pagerduty-rg/README.md new file mode 100644 index 00000000..e69de29b diff --git a/integrations/pagerduty-rg/assets/pagerduty-rectangle.svg b/integrations/pagerduty-rg/assets/pagerduty-rectangle.svg new file mode 100644 index 00000000..696e1705 --- /dev/null +++ b/integrations/pagerduty-rg/assets/pagerduty-rectangle.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + diff --git a/integrations/pagerduty-rg/assets/pagerduty-square.svg b/integrations/pagerduty-rg/assets/pagerduty-square.svg new file mode 100644 index 00000000..ce397c63 --- /dev/null +++ b/integrations/pagerduty-rg/assets/pagerduty-square.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + diff --git a/integrations/pagerduty-rg/manifest.json b/integrations/pagerduty-rg/manifest.json new file mode 100644 index 00000000..164a4607 --- /dev/null +++ b/integrations/pagerduty-rg/manifest.json @@ -0,0 +1,91 @@ +{ + "name": "PagerDuty - Release Guardian", + "version": "1.0.0", + "overview": "Send Release Guardian events to PagerDuty services.", + "description": "Send Release Guardian events to PagerDuty to create or resolve incidents.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.pagerduty.com", + "launchdarklyDocs": "https://docs.launchdarkly.com", + "privacyPolicy": "https://www.pagerduty.com/privacy-policy/" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/pagerduty-square.svg", + "horizontal": "assets/pagerduty-rectangle.svg" + }, + "formVariables": [ + { + "key": "integrationKey", + "name": "PagerDuty integration key", + "type": "string", + "description": "Enter your [PagerDuty integration key](https://support.pagerduty.com/main/docs/services-and-integrations#add-integrations-to-an-existing-service).", + "isSecret": true, + "isOptional": false + }, + { + "key": "projectAndEnv", + "name": "Project and environment filters", + "type": "environmentSelector", + "description": "Filter incoming events by project and environment", + "placeholder": "default", + "isOptional": true, + "defaultValue": false + }, + { + "key": "eventFilter", + "name": "Events filter", + "type": "multiselect", + "description": "Filter incoming events by event type", + "isOptional": true, + "defaultValue": true, + "multiselectDefaultOptions": [ + "MeasuredRolloutRegressionDetected", + "MeasuredRolloutReverted", + "ErrorMonitoringNewIssueFound" + ], + "multiselectOptions": [ + { + "label": "Measured Rollout Regression Detected", + "value": "MeasuredRolloutRegressionDetected" + }, + { + "label": "Measured Rollout Reverted", + "value": "MeasuredRolloutReverted" + }, + { + "label": "New Issue Found", + "value": "ErrorMonitoringNewIssueFound" + } + ] + }, + { + "key": "severity", + "name": "Severity", + "type": "enum", + "description": "The severity that triggered events should have", + "allowedValues": ["critical", "warning", "error", "info"] + } + ], + "capabilities": { + "eventsHook": { + "includeErrorResponseBody": true, + "endpoint": { + "url": "https://events.pagerduty.com/v2/change/enqueue", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "templates": { + "MeasuredRolloutRegressionDetected": "templates/measured-rollout-regression-detected.json.hbs", + "MeasuredRolloutReverted": "templates/measured-rollout-reverted.json.hbs", + "ErrorMonitoringNewIssueFound": "templates/error-monitoring-new-issue-found.json.hbs" + } + } + } +} diff --git a/integrations/pagerduty-rg/templates/default.json.hbs b/integrations/pagerduty-rg/templates/default.json.hbs new file mode 100644 index 00000000..d1d282e2 --- /dev/null +++ b/integrations/pagerduty-rg/templates/default.json.hbs @@ -0,0 +1,9 @@ +{ + "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyIntegrationKey}}{{#if customProperties.pagerDutyIntegrationKey.values}}{{#each customProperties.pagerDutyIntegrationKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}} + "payload": { + "summary" : "Measured rollout regression detected", + "timestamp": "{{{timestamp.simple}}}", + "severity": "{{{formVariables.severity}}}", + "source": "TODO" + }, +} diff --git a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs new file mode 100644 index 00000000..d1d282e2 --- /dev/null +++ b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs @@ -0,0 +1,9 @@ +{ + "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyIntegrationKey}}{{#if customProperties.pagerDutyIntegrationKey.values}}{{#each customProperties.pagerDutyIntegrationKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}} + "payload": { + "summary" : "Measured rollout regression detected", + "timestamp": "{{{timestamp.simple}}}", + "severity": "{{{formVariables.severity}}}", + "source": "TODO" + }, +} diff --git a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs new file mode 100644 index 00000000..d1d282e2 --- /dev/null +++ b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs @@ -0,0 +1,9 @@ +{ + "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyIntegrationKey}}{{#if customProperties.pagerDutyIntegrationKey.values}}{{#each customProperties.pagerDutyIntegrationKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}} + "payload": { + "summary" : "Measured rollout regression detected", + "timestamp": "{{{timestamp.simple}}}", + "severity": "{{{formVariables.severity}}}", + "source": "TODO" + }, +} diff --git a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs new file mode 100644 index 00000000..d1d282e2 --- /dev/null +++ b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs @@ -0,0 +1,9 @@ +{ + "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyIntegrationKey}}{{#if customProperties.pagerDutyIntegrationKey.values}}{{#each customProperties.pagerDutyIntegrationKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}} + "payload": { + "summary" : "Measured rollout regression detected", + "timestamp": "{{{timestamp.simple}}}", + "severity": "{{{formVariables.severity}}}", + "source": "TODO" + }, +} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index e690828e..23cbbce1 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -854,6 +854,7 @@ export interface Capabilities { syncedSegment?: SyncedSegment; bigSegmentStore?: BigSegmentStore; flagImport?: FlagImport; + eventsHook?: EventsHook; [k: string]: unknown; } /** @@ -1177,3 +1178,18 @@ export interface FlagImportBodyTemplate { statsig?: StatSigTemplate; [k: string]: unknown; } +/** + * This capability will enable LaunchDarkly to send webhooks to your endpoint when particular events are observed. + */ +export interface EventsHook { + endpoint: Endpoint; + templates: EDAEventsWebhookBodyTemplate; + includeErrorResponseBody?: IncludeErrorResponseBody; + [k: string]: unknown; +} +/** + * A map of event types to templates to use to render the webhook + */ +export interface EDAEventsWebhookBodyTemplate { + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index c4432c99..4c0ef096 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -751,7 +751,8 @@ "externalConfigurationPages", "syncedSegment", "bigSegmentStore", - "flagImport" + "flagImport", + "eventsHook" ] }, "properties": { @@ -1046,7 +1047,7 @@ } }, "includeErrorResponseBody": { - "$id": "#/properties/include-error-response-body", + "$id": "#/definitions/include-error-response-body", "title": "Include error response body", "type": "boolean", "description": "Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI", @@ -4576,6 +4577,159 @@ "default": true } } + }, + "eventsHook": { + "$id": "#/properties/capability/events-hook", + "title": "Events hook", + "description": "This capability will enable LaunchDarkly to send webhooks to your endpoint when particular events are observed.", + "type": "object", + "propertyNames": { + "enum": [ + "endpoint", + "templates", + "includeErrorResponseBody", + "triggers" + ] + }, + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers", + "hmacSignature" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } + } + }, + "required": [ + "url", + "method" + ] + }, + "templates": { + "$id": "#/properties/capability/events-hook/templates", + "title": "EDA events webhook body template", + "description": "A map of event types to templates to use to render the webhook", + "type": "object" + }, + "includeErrorResponseBody": { + "$id": "#/definitions/include-error-response-body", + "title": "Include error response body", + "type": "boolean", + "description": "Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI", + "default": false + } + }, + "required": [ + "templates", + "endpoint" + ] } } }, diff --git a/schemas/base.json b/schemas/base.json index 72f996db..43b75e2d 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -268,7 +268,8 @@ "externalConfigurationPages", "syncedSegment", "bigSegmentStore", - "flagImport" + "flagImport", + "eventsHook" ] }, "properties": { @@ -307,6 +308,9 @@ }, "flagImport": { "$ref": "schemas/capabilities/flagImport.json#/flagImport" + }, + "eventsHook": { + "$ref": "schemas/capabilities/eventsHook.json#/eventsHook" } } }, diff --git a/schemas/capabilities/auditLogEventsHook.json b/schemas/capabilities/auditLogEventsHook.json index d64381af..a5d06eaa 100644 --- a/schemas/capabilities/auditLogEventsHook.json +++ b/schemas/capabilities/auditLogEventsHook.json @@ -155,11 +155,7 @@ } }, "includeErrorResponseBody": { - "$id": "#/properties/include-error-response-body", - "title": "Include error response body", - "type": "boolean", - "description": "Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI", - "default": false + "$ref": "../definitions.json#/includeErrorResponseBody" }, "deliveryMethod": { "$id": "#/properties/delivery-method", diff --git a/schemas/capabilities/eventsHook.json b/schemas/capabilities/eventsHook.json index 56ba30a7..d392ec11 100644 --- a/schemas/capabilities/eventsHook.json +++ b/schemas/capabilities/eventsHook.json @@ -14,64 +14,14 @@ }, "templates": { "$id": "#/properties/capability/events-hook/templates", - "title": "Webhook body template", + "title": "EDA events webhook body template", "description": "A map of event types to templates to use to render the webhook", "type": "object" }, "includeErrorResponseBody": { - "$id": "#/properties/include-error-response-body", - "title": "Include error response body", - "type": "boolean", - "description": "Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI", - "default": false - }, - "triggers": { - "$id": "#/properties/triggers", - "title": "Triggers", - "type": "object", - "propertyNames": { - "enum": ["validEvents", "eventFilters"] - }, - "properties": { - "validEvents": { - "$id": "#/properties/triggers/validEvents", - "title": "Valid events", - "type": "array", - "items": { - "type": "string" - } - }, - "eventFilters": { - "$id": "#/properties/triggers/eventFilters", - "title": "Event filters", - "type": "array", - "items": { - "type": "object", - "propertyNames": { - "enum": ["key", "optional", "value"] - }, - "properties": { - "key": { - "$id": "#/properties/triggers/eventFilters/key", - "title": "Key", - "type": "string" - }, - "optional": { - "$id": "#/properties/triggers/eventFilters/optional", - "title": "Optional", - "type": "boolean" - }, - "value": { - "$id": "#/properties/triggers/eventFilters/value", - "title": "Value", - "type": "string" - } - } - } - } - } + "$ref": "../definitions.json#/includeErrorResponseBody" } }, - "required": ["templates", "endpoint", "triggers"] + "required": ["templates", "endpoint"] } } diff --git a/schemas/definitions.json b/schemas/definitions.json index 1b5c642d..9fafe37e 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -120,6 +120,13 @@ }, "required": ["url", "method"] }, + "includeErrorResponseBody": { + "$id": "#/definitions/include-error-response-body", + "title": "Include error response body", + "type": "boolean", + "description": "Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI", + "default": false + }, "jsonBody": { "$id": "#/definitions/json-body", "title": "JSON Body", From cb671018480b31198479bc16eec25156c13f49eb Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Wed, 16 Oct 2024 13:12:44 -0700 Subject: [PATCH 830/936] Remove duplicate region variable --- integrations/snowflake-experimentation/manifest.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index ebf420cc..791f8da7 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -85,14 +85,6 @@ "type": "string", "isSecret": false }, - { - "key": "region", - "name": "Region", - "description": "The Snowflake region the warehouse resides in", - "placeholder": "us-east-1", - "type": "string", - "isSecret": false - }, { "key": "privateKey", "name": "Private Key", From 861a601e3381092df3a2ab9bd2af2dc684423359 Mon Sep 17 00:00:00 2001 From: Daniel OBrien Date: Mon, 21 Oct 2024 10:17:22 -0400 Subject: [PATCH 831/936] adding roadie integration --- .../roadie/assets/images/horizontal.svg | 4 ++++ integrations/roadie/assets/images/square.svg | 9 ++++++++ integrations/roadie/manifest.json | 21 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 integrations/roadie/assets/images/horizontal.svg create mode 100644 integrations/roadie/assets/images/square.svg create mode 100644 integrations/roadie/manifest.json diff --git a/integrations/roadie/assets/images/horizontal.svg b/integrations/roadie/assets/images/horizontal.svg new file mode 100644 index 00000000..b6629919 --- /dev/null +++ b/integrations/roadie/assets/images/horizontal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/roadie/assets/images/square.svg b/integrations/roadie/assets/images/square.svg new file mode 100644 index 00000000..319d2eae --- /dev/null +++ b/integrations/roadie/assets/images/square.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/integrations/roadie/manifest.json b/integrations/roadie/manifest.json new file mode 100644 index 00000000..342e7ffa --- /dev/null +++ b/integrations/roadie/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Backstage, via Roadie", + "version": "1.0.0", + "overview": "Visualize feature flag changes for software components in Backstage, via Roadie.", + "description": "Add a LaunchDarkly feature flag changes to related software components in Backstage, via Roadie.", + "author": "Roadie", + "supportEmail": "support@roadie.io", + "links": { + "site": "https://roadie.io", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/roadie", + "supportWebsite": "https://roadie.io/docs/integrations/launchdarkly/", + "privacyPolicy": "https://roadie.io/legal-notices/privacy-notice/v1/" + }, + "categories": ["developer-tools", "infrastructure"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "requiresOAuth": false, + "otherCapabilities": ["external"] +} From b0f6ee36614b4fb5c128b21f49d387aac59e89d0 Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Mon, 21 Oct 2024 09:13:02 -0700 Subject: [PATCH 832/936] [RO-471] Allow integration config form for PagerDuty integration This adds an attribute allowing the integration config form to be rendered for the PagerDuty-RG integration. --- integrations/pagerduty-rg/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/pagerduty-rg/manifest.json b/integrations/pagerduty-rg/manifest.json index 164a4607..559ea44a 100644 --- a/integrations/pagerduty-rg/manifest.json +++ b/integrations/pagerduty-rg/manifest.json @@ -15,6 +15,7 @@ "square": "assets/pagerduty-square.svg", "horizontal": "assets/pagerduty-rectangle.svg" }, + "allowIntegrationConfigurations": true, "formVariables": [ { "key": "integrationKey", From 7aed590314f073e1cb9c50fbfbead2ca498c2c97 Mon Sep 17 00:00:00 2001 From: Darius Harrison Date: Mon, 21 Oct 2024 12:52:54 -0500 Subject: [PATCH 833/936] remove default value --- integrations/pagerduty-rg/manifest.json | 1 - 1 file changed, 1 deletion(-) diff --git a/integrations/pagerduty-rg/manifest.json b/integrations/pagerduty-rg/manifest.json index 559ea44a..178d1e84 100644 --- a/integrations/pagerduty-rg/manifest.json +++ b/integrations/pagerduty-rg/manifest.json @@ -40,7 +40,6 @@ "type": "multiselect", "description": "Filter incoming events by event type", "isOptional": true, - "defaultValue": true, "multiselectDefaultOptions": [ "MeasuredRolloutRegressionDetected", "MeasuredRolloutReverted", From e4487e17edd5df505130a43f8eba417131991cb4 Mon Sep 17 00:00:00 2001 From: Darius Harrison Date: Mon, 21 Oct 2024 13:11:22 -0500 Subject: [PATCH 834/936] fix validation error --- __tests__/validateIntegrationManifests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index f3c1aa93..e32df223 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -332,7 +332,7 @@ describe('All integrations', () => { const formVariables = _.get(manifest, 'formVariables', null); if (formVariables) { formVariables.forEach(formVariable => { - if (formVariable.isOptional) { + if (formVariable.isOptional && formVariable.type !== 'multiselect' && formVariable.type !== 'environmentSelector') { expect( formVariable.defaultValue, '"isOptional" is only valid if "defaultValue" is provided.' From 63030a3425a859fcdbb86ef370c83da4998352cf Mon Sep 17 00:00:00 2001 From: Darius Harrison Date: Mon, 21 Oct 2024 13:15:44 -0500 Subject: [PATCH 835/936] run prettier --- __tests__/validateIntegrationManifests.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index e32df223..180304b3 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -332,7 +332,11 @@ describe('All integrations', () => { const formVariables = _.get(manifest, 'formVariables', null); if (formVariables) { formVariables.forEach(formVariable => { - if (formVariable.isOptional && formVariable.type !== 'multiselect' && formVariable.type !== 'environmentSelector') { + if ( + formVariable.isOptional && + formVariable.type !== 'multiselect' && + formVariable.type !== 'environmentSelector' + ) { expect( formVariable.defaultValue, '"isOptional" is only valid if "defaultValue" is provided.' From 63d57892a87b50da7062f31b5dbe1028c8754d27 Mon Sep 17 00:00:00 2001 From: Clifford Tawiah Date: Mon, 21 Oct 2024 16:34:09 -0500 Subject: [PATCH 836/936] Added tests for integration configs and multi select --- __tests__/validateIntegrationManifests.js | 50 +++++++++++++++++++++++ integrations/pagerduty-rg/manifest.json | 3 +- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 180304b3..bba4033c 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -347,6 +347,56 @@ describe('All integrations', () => { } ); + test.each(manifests)( + 'unrelated properties are not set on multiselect formVariables for %s', + (key, manifest) => { + const formVariables = _.get(manifest, 'formVariables', null); + if (formVariables) { + formVariables.forEach(formVariable => { + if (formVariable.type === 'multiselect') { + expect(formVariable.defaultValue).not.toBeDefined(); + expect(formVariable.dynamicOptions).not.toBeDefined(); + expect(formVariable.allowedValues).not.toBeDefined(); + expect(formVariable.isSecret).not.toBeDefined(); + } + }); + } + } + ); + + test.each(manifests)( + 'multiselectOptions is always provided when type is multiselect for %s', + (key, manifest) => { + const formVariables = _.get(manifest, 'formVariables', null); + if (formVariables) { + formVariables.forEach(formVariable => { + if (formVariable.type === 'multiselect') { + expect(formVariable.multiselectOptions).toBeDefined(); + } + }); + } + } + ); + + test.each(manifests)( + 'unrelated properties are not set on environmentSelector formVariables for %s', + (key, manifest) => { + const formVariables = _.get(manifest, 'formVariables', null); + if (formVariables) { + formVariables.forEach(formVariable => { + if (formVariable.type === 'environmentSelector') { + expect(formVariable.multiselectOptions).not.toBeDefined(); + expect(formVariable.multiselectDefaultOptions).not.toBeDefined(); + expect(formVariable.defaultValue).not.toBeDefined(); + expect(formVariable.dynamicOptions).not.toBeDefined(); + expect(formVariable.allowedValues).not.toBeDefined(); + expect(formVariable.isSecret).not.toBeDefined(); + } + }); + } + } + ); + test.each(manifests)( 'no non-string formVariables have been set to isSecret for %s', (key, manifest) => { diff --git a/integrations/pagerduty-rg/manifest.json b/integrations/pagerduty-rg/manifest.json index 178d1e84..dbef93bb 100644 --- a/integrations/pagerduty-rg/manifest.json +++ b/integrations/pagerduty-rg/manifest.json @@ -31,8 +31,7 @@ "type": "environmentSelector", "description": "Filter incoming events by project and environment", "placeholder": "default", - "isOptional": true, - "defaultValue": false + "isOptional": true }, { "key": "eventFilter", From 42b688de430a58d8356af42d23257f4003b43fe5 Mon Sep 17 00:00:00 2001 From: Darius Harrison Date: Wed, 23 Oct 2024 13:59:40 -0500 Subject: [PATCH 837/936] update pagerduty-rg payload templates --- .../pagerduty-rg/templates/default.json.hbs | 9 --------- .../error-monitoring-new-issue-found.json.hbs | 16 +++++++++++++--- ...measured-rollout-regression-detected.json.hbs | 16 +++++++++++++--- .../templates/measured-rollout-reverted.json.hbs | 16 +++++++++++++--- 4 files changed, 39 insertions(+), 18 deletions(-) delete mode 100644 integrations/pagerduty-rg/templates/default.json.hbs diff --git a/integrations/pagerduty-rg/templates/default.json.hbs b/integrations/pagerduty-rg/templates/default.json.hbs deleted file mode 100644 index d1d282e2..00000000 --- a/integrations/pagerduty-rg/templates/default.json.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{ - "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyIntegrationKey}}{{#if customProperties.pagerDutyIntegrationKey.values}}{{#each customProperties.pagerDutyIntegrationKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}} - "payload": { - "summary" : "Measured rollout regression detected", - "timestamp": "{{{timestamp.simple}}}", - "severity": "{{{formVariables.severity}}}", - "source": "TODO" - }, -} diff --git a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs index d1d282e2..eed1d750 100644 --- a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs +++ b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs @@ -1,9 +1,19 @@ { - "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyIntegrationKey}}{{#if customProperties.pagerDutyIntegrationKey.values}}{{#each customProperties.pagerDutyIntegrationKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}} + "routing_key": {{{formVariables.integrationKey}}}, + "event_action": "trigger", + "dedup_key": {{{measuredRolloutId}}}, "payload": { - "summary" : "Measured rollout regression detected", + "summary" : "Measured rollout with ID {{{measuredRolloutId}}} has a new issue", "timestamp": "{{{timestamp.simple}}}", "severity": "{{{formVariables.severity}}}", - "source": "TODO" + "source": "app.launchdarkly.com", + "links": [ + { + "href": "{{{_links.details.href}}}", "text": "View measured rollout insights in LaunchDarkly" + }, + { + "href": "{{{_links.site.href}}}", "text": "View measured rollout in LaunchDarkly" + } + ] }, } diff --git a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs index d1d282e2..92009783 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs @@ -1,9 +1,19 @@ { - "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyIntegrationKey}}{{#if customProperties.pagerDutyIntegrationKey.values}}{{#each customProperties.pagerDutyIntegrationKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}} + "routing_key": {{{formVariables.integrationKey}}}, + "event_action": "trigger", + "dedup_key": {{{measuredRolloutId}}}, "payload": { - "summary" : "Measured rollout regression detected", + "summary" : "Regression detected for measured rollout with ID {{{measuredRolloutId}}}", "timestamp": "{{{timestamp.simple}}}", "severity": "{{{formVariables.severity}}}", - "source": "TODO" + "source": "app.launchdarkly.com", + "links": [ + { + "href": "{{{_links.details.href}}}", "text": "View measured rollout insights in LaunchDarkly" + }, + { + "href": "{{{_links.site.href}}}", "text": "View measured rollout in LaunchDarkly" + } + ] }, } diff --git a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs index d1d282e2..6a265274 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs @@ -1,9 +1,19 @@ { - "routing_key": {{#if customProperties}}{{#if customProperties.pagerDutyIntegrationKey}}{{#if customProperties.pagerDutyIntegrationKey.values}}{{#each customProperties.pagerDutyIntegrationKey.values}}{{#if @first}}"{{{this}}}",{{/if}}{{/each}}{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}}{{else}}"{{{formVariables.integrationKey}}}",{{/if}} + "routing_key": {{{formVariables.integrationKey}}}, + "event_action": "resolve", + "dedup_key": {{{measuredRolloutId}}}, "payload": { - "summary" : "Measured rollout regression detected", + "summary" : "Measured rollout with ID {{{measuredRolloutId}}} reverted", "timestamp": "{{{timestamp.simple}}}", "severity": "{{{formVariables.severity}}}", - "source": "TODO" + "source": "app.launchdarkly.com", + "links": [ + { + "href": "{{{_links.details.href}}}", "text": "View measured rollout insights in LaunchDarkly" + }, + { + "href": "{{{_links.site.href}}}", "text": "View measured rollout in LaunchDarkly" + } + ] }, } From 855de62edb173fd9c5262dc1dc4fe85a4455b768 Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Fri, 25 Oct 2024 08:54:50 -0700 Subject: [PATCH 838/936] [RO-580] Fix event hook type parsing Attempting to make the events hook templates general enough to not specify particular events ended up resulting some type errors in Goaltender trying to parse a `struct` to an `interface`. This update the templates for `eventHook` capability to explicity name each event type that's supported. --- integrations/pagerduty-rg/manifest.json | 6 ++--- manifest.schema.d.ts | 15 +++++++++++++ manifest.schema.json | 29 ++++++++++++++++++++++++- schemas/capabilities/eventsHook.json | 29 ++++++++++++++++++++++++- 4 files changed, 74 insertions(+), 5 deletions(-) diff --git a/integrations/pagerduty-rg/manifest.json b/integrations/pagerduty-rg/manifest.json index dbef93bb..966b7926 100644 --- a/integrations/pagerduty-rg/manifest.json +++ b/integrations/pagerduty-rg/manifest.json @@ -81,9 +81,9 @@ ] }, "templates": { - "MeasuredRolloutRegressionDetected": "templates/measured-rollout-regression-detected.json.hbs", - "MeasuredRolloutReverted": "templates/measured-rollout-reverted.json.hbs", - "ErrorMonitoringNewIssueFound": "templates/error-monitoring-new-issue-found.json.hbs" + "measuredRolloutRegressionDetected": "templates/measured-rollout-regression-detected.json.hbs", + "measuredRolloutReverted": "templates/measured-rollout-reverted.json.hbs", + "errorMonitoringNewIssueFound": "templates/error-monitoring-new-issue-found.json.hbs" } } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 23cbbce1..3d1e45b9 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -704,6 +704,18 @@ export type StatSigTemplate = string; * Whether errors received while importing should be displayed in the error log in LaunchDarkly UI */ export type IncludeErrorResponseBody1 = boolean; +/** + * Template to use for measuredRolloutRegressionDetected events + */ +export type MeasuredRolloutRegressionDetectedTemplate = string; +/** + * Template to use for measuredRolloutReverted events + */ +export type MeasuredRolloutRevertedTemplate = string; +/** + * Template to use for errorMonitoringNewIssueFound events + */ +export type ErrorMonitoringNewIssueFoundTemplate = string; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -1191,5 +1203,8 @@ export interface EventsHook { * A map of event types to templates to use to render the webhook */ export interface EDAEventsWebhookBodyTemplate { + measuredRolloutRegressionDetected?: MeasuredRolloutRegressionDetectedTemplate; + measuredRolloutReverted?: MeasuredRolloutRevertedTemplate; + errorMonitoringNewIssueFound?: ErrorMonitoringNewIssueFoundTemplate; [k: string]: unknown; } diff --git a/manifest.schema.json b/manifest.schema.json index 4c0ef096..eb09b5ce 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -4716,7 +4716,34 @@ "$id": "#/properties/capability/events-hook/templates", "title": "EDA events webhook body template", "description": "A map of event types to templates to use to render the webhook", - "type": "object" + "type": "object", + "propertyNames": { + "enum": [ + "measuredRolloutRegressionDetected", + "measuredRolloutReverted", + "errorMonitoringNewIssueFound" + ] + }, + "properties": { + "measuredRolloutRegressionDetected": { + "$id": "#/properties/capability/events-hook/templates/measuredRolloutRegressionDetected", + "title": "measuredRolloutRegressionDetected template", + "description": "Template to use for measuredRolloutRegressionDetected events", + "type": "string" + }, + "measuredRolloutReverted": { + "$id": "#/properties/capability/events-hook/templates/measuredRolloutReverted", + "title": "measuredRolloutReverted template", + "description": "Template to use for measuredRolloutReverted events", + "type": "string" + }, + "errorMonitoringNewIssueFound": { + "$id": "#/properties/capability/events-hook/templates/errorMonitoringNewIssueFound", + "title": "errorMonitoringNewIssueFound template", + "description": "Template to use for errorMonitoringNewIssueFound events", + "type": "string" + } + } }, "includeErrorResponseBody": { "$id": "#/definitions/include-error-response-body", diff --git a/schemas/capabilities/eventsHook.json b/schemas/capabilities/eventsHook.json index d392ec11..f12c3936 100644 --- a/schemas/capabilities/eventsHook.json +++ b/schemas/capabilities/eventsHook.json @@ -16,7 +16,34 @@ "$id": "#/properties/capability/events-hook/templates", "title": "EDA events webhook body template", "description": "A map of event types to templates to use to render the webhook", - "type": "object" + "type": "object", + "propertyNames": { + "enum": [ + "measuredRolloutRegressionDetected", + "measuredRolloutReverted", + "errorMonitoringNewIssueFound" + ] + }, + "properties": { + "measuredRolloutRegressionDetected": { + "$id": "#/properties/capability/events-hook/templates/measuredRolloutRegressionDetected", + "title": "measuredRolloutRegressionDetected template", + "description": "Template to use for measuredRolloutRegressionDetected events", + "type": "string" + }, + "measuredRolloutReverted": { + "$id": "#/properties/capability/events-hook/templates/measuredRolloutReverted", + "title": "measuredRolloutReverted template", + "description": "Template to use for measuredRolloutReverted events", + "type": "string" + }, + "errorMonitoringNewIssueFound": { + "$id": "#/properties/capability/events-hook/templates/errorMonitoringNewIssueFound", + "title": "errorMonitoringNewIssueFound template", + "description": "Template to use for errorMonitoringNewIssueFound events", + "type": "string" + } + } }, "includeErrorResponseBody": { "$ref": "../definitions.json#/includeErrorResponseBody" From 4fe6a767081b09b08e772ef4fef6b50cba3f731d Mon Sep 17 00:00:00 2001 From: Darius Harrison Date: Fri, 25 Oct 2024 12:33:17 -0500 Subject: [PATCH 839/936] removing links for now --- .../error-monitoring-new-issue-found.json.hbs | 10 +--------- .../measured-rollout-regression-detected.json.hbs | 10 +--------- .../templates/measured-rollout-reverted.json.hbs | 10 +--------- 3 files changed, 3 insertions(+), 27 deletions(-) diff --git a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs index eed1d750..a44bae35 100644 --- a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs +++ b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs @@ -6,14 +6,6 @@ "summary" : "Measured rollout with ID {{{measuredRolloutId}}} has a new issue", "timestamp": "{{{timestamp.simple}}}", "severity": "{{{formVariables.severity}}}", - "source": "app.launchdarkly.com", - "links": [ - { - "href": "{{{_links.details.href}}}", "text": "View measured rollout insights in LaunchDarkly" - }, - { - "href": "{{{_links.site.href}}}", "text": "View measured rollout in LaunchDarkly" - } - ] + "source": "app.launchdarkly.com" }, } diff --git a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs index 92009783..8d8a19ee 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs @@ -6,14 +6,6 @@ "summary" : "Regression detected for measured rollout with ID {{{measuredRolloutId}}}", "timestamp": "{{{timestamp.simple}}}", "severity": "{{{formVariables.severity}}}", - "source": "app.launchdarkly.com", - "links": [ - { - "href": "{{{_links.details.href}}}", "text": "View measured rollout insights in LaunchDarkly" - }, - { - "href": "{{{_links.site.href}}}", "text": "View measured rollout in LaunchDarkly" - } - ] + "source": "app.launchdarkly.com" }, } diff --git a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs index 6a265274..df3bf7db 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs @@ -6,14 +6,6 @@ "summary" : "Measured rollout with ID {{{measuredRolloutId}}} reverted", "timestamp": "{{{timestamp.simple}}}", "severity": "{{{formVariables.severity}}}", - "source": "app.launchdarkly.com", - "links": [ - { - "href": "{{{_links.details.href}}}", "text": "View measured rollout insights in LaunchDarkly" - }, - { - "href": "{{{_links.site.href}}}", "text": "View measured rollout in LaunchDarkly" - } - ] + "source": "app.launchdarkly.com" }, } From b3af078fcef5c7b1e12c401284404fe8113bdad6 Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Mon, 28 Oct 2024 10:49:43 -0700 Subject: [PATCH 840/936] Add public key to snowflake experimentation integration --- .../snowflake-experimentation/manifest.json | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 791f8da7..5305d897 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -11,7 +11,9 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/home/TODO", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": ["data"], + "categories": [ + "data" + ], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" @@ -19,7 +21,9 @@ "legacy": { "kind": "dataExport" }, - "otherCapabilities": ["dataExport"], + "otherCapabilities": [ + "dataExport" + ], "formVariables": [ { "key": "user", @@ -88,11 +92,18 @@ { "key": "privateKey", "name": "Private Key", - "description": "Private key on a single line, ", - "placeholder": "e.g. odKAmV6AbsoWsyL3thUoYVDEJAsQl8RrH+JuQ9HWUnDLunDdLEM6oNl15XP1xLOHz3bEq1rvATiQmAByKNOiVujd1gsq7JxfQYDdHRzDhZZrUstnetvGTDBtMHmhzbBXOih+1q3eA2RMQ5izXOEkyMKrWWlcKMWVJzMSYjFeFJB8D8wJNmq1ArNCO3uXfwkZuMnMhYhx/OYvCs4sMWKe5/etyR2gz0Fvp6VDUa0jNRvoad+8/pHK7KDxB8nW5KgmpSjfkl1Ut3zChtwEuAFnSDuypbrODBdphZHD40WmX0f69VKKs44vsKCHr8nzJ8R5dw+2Ggyq5W5hl3PDTMTqn8Pc+cwmPdVe4bkNqxbCHe2omZXpNIgC31wrMBvkyUYvpY8rMoBXqgm9hC5JsXzn6Z6X1kpGFhDjkNSdzx4jYzw=", + "description": "Private key for the user connecting to Snowlake", + "placeholder": "-----BEGIN PRIVATE KEY-----...", "type": "string", "isSecret": true }, + { + "key": "publicKey", + "name": "Public Key", + "description": "Public key for the user connecting to Snowflake", + "placeholder": "-----BEGIN PUBLIC KEY-----...", + "type": "string" + }, { "key": "environmentId", "name": "Clientside ID", From c96c38bd3299882c095d792182574f3823fa08e5 Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Mon, 28 Oct 2024 10:50:49 -0700 Subject: [PATCH 841/936] Run prettier:write --- integrations/snowflake-experimentation/manifest.json | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 5305d897..c4f3cbd8 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -11,9 +11,7 @@ "launchdarklyDocs": "https://docs.launchdarkly.com/home/TODO", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, - "categories": [ - "data" - ], + "categories": ["data"], "icons": { "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" @@ -21,9 +19,7 @@ "legacy": { "kind": "dataExport" }, - "otherCapabilities": [ - "dataExport" - ], + "otherCapabilities": ["dataExport"], "formVariables": [ { "key": "user", From b491810073db7d818aae6c3f99e1168e23a21709 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 29 Oct 2024 11:41:16 +0000 Subject: [PATCH 842/936] Vercel: explicitly set user-agent header (#599) --- integrations/vercel/manifest.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/integrations/vercel/manifest.json b/integrations/vercel/manifest.json index 0509d360..4b3a71c9 100644 --- a/integrations/vercel/manifest.json +++ b/integrations/vercel/manifest.json @@ -63,6 +63,10 @@ { "name": "Content-Type", "value": "application/json" + }, + { + "name": "User-Agent", + "value": "launchdarkly" } ] }, From 122321420600e486453bfaed503e0c28d483cb83 Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Tue, 29 Oct 2024 10:41:09 -0700 Subject: [PATCH 843/936] [RO-471] Fix PagerDuty URL for release guardian integration The RG integration uses a different endpoint to send alert events than the regular integration, which sends change events. This updates the URL to be correct. --- integrations/pagerduty-rg/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/pagerduty-rg/manifest.json b/integrations/pagerduty-rg/manifest.json index 966b7926..b0cb3555 100644 --- a/integrations/pagerduty-rg/manifest.json +++ b/integrations/pagerduty-rg/manifest.json @@ -71,7 +71,7 @@ "eventsHook": { "includeErrorResponseBody": true, "endpoint": { - "url": "https://events.pagerduty.com/v2/change/enqueue", + "url": "https://events.pagerduty.com/v2/enqueue", "method": "POST", "headers": [ { From cae92cd6a5b18f05d899bd09c9b0303798e7b3fa Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Tue, 29 Oct 2024 13:02:37 -0700 Subject: [PATCH 844/936] Use environment selector for snowflake experimentation config --- integrations/snowflake-experimentation/manifest.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index c4f3cbd8..b6d151ab 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -101,9 +101,10 @@ "type": "string" }, { - "key": "environmentId", - "name": "Clientside ID", - "type": "string", + "key": "selectedEnv", + "type": "environmentSelector", + "description": "Select an environment from the list", + "name": "Environment selector", "description": "The clientside ID of the LaunchDarkly environment to connect experimentation data to", "isOptional": false } From 752754976e27094b9f0fa2fec0ab385c68b6f28d Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Tue, 29 Oct 2024 13:46:18 -0700 Subject: [PATCH 845/936] Remove duplicate description --- integrations/snowflake-experimentation/manifest.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index b6d151ab..f9b6178e 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -103,9 +103,8 @@ { "key": "selectedEnv", "type": "environmentSelector", - "description": "Select an environment from the list", "name": "Environment selector", - "description": "The clientside ID of the LaunchDarkly environment to connect experimentation data to", + "description": "The LaunchDarkly environment to connect experimentation data to", "isOptional": false } ] From 21e89f3815c9f2b793195f2ff40f99109dbe5dcd Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 31 Oct 2024 12:01:34 +0000 Subject: [PATCH 846/936] Hbarrow/backmerge public (#601) * Update express * update convex --- integrations/convex/manifest.json | 2 +- package-lock.json | 616 +++++++++++++++++++++--------- package.json | 2 +- 3 files changed, 427 insertions(+), 193 deletions(-) diff --git a/integrations/convex/manifest.json b/integrations/convex/manifest.json index 3905b987..e9553ea9 100644 --- a/integrations/convex/manifest.json +++ b/integrations/convex/manifest.json @@ -6,7 +6,7 @@ "author": "Convex", "supportEmail": "support@convex.dev", "links": { - "site": "https://convex.dev", + "site": "https://convex.dev/components/launchdarkly", "privacyPolicy": "https://convex.dev/privacy" }, "categories": ["infrastructure"], diff --git a/package-lock.json b/package-lock.json index 70e509bc..60dd1685 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "dateformat": "^4.5.1", - "express": "^4.18.2", + "express": "^4.21.1", "url-parse": "^1.5.9" }, "devDependencies": { @@ -1801,20 +1801,20 @@ } }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "qs": "6.13.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -1847,12 +1847,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1938,12 +1938,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2297,9 +2303,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -2417,6 +2423,22 @@ "clone": "^1.0.2" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/del": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", @@ -2585,9 +2607,9 @@ "dev": true }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } @@ -2601,15 +2623,39 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "dev": true, + "hasInstallScript": true, "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/es6-iterator": { @@ -2668,6 +2714,27 @@ "node": ">=8" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2760,36 +2827,36 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -2938,9 +3005,9 @@ } }, "node_modules/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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -2950,12 +3017,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -3127,9 +3194,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -3150,14 +3220,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3313,6 +3387,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3344,6 +3429,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -3360,10 +3446,21 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -3382,6 +3479,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -4919,9 +5027,12 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -4947,12 +5058,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -5080,9 +5191,9 @@ "dev": true }, "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, "node_modules/no-case": { @@ -5235,9 +5346,12 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5644,9 +5758,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/path-type": { "version": "4.0.0", @@ -5825,11 +5939,11 @@ ] }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -5872,9 +5986,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -6146,9 +6260,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -6181,6 +6295,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/sentence-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", @@ -6193,19 +6315,35 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -6233,13 +6371,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8506,20 +8648,20 @@ } }, "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "requires": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "qs": "6.13.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -8550,12 +8692,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browserslist": { @@ -8601,12 +8743,15 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "call-me-maybe": { @@ -8861,9 +9006,9 @@ "dev": true }, "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" }, "cookie-signature": { "version": "1.0.6", @@ -8948,6 +9093,16 @@ "clone": "^1.0.2" } }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "del": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", @@ -9072,9 +9227,9 @@ "dev": true }, "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" }, "error-ex": { "version": "1.3.2", @@ -9085,15 +9240,29 @@ "is-arrayish": "^0.2.1" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "dev": true, "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" } }, "es6-iterator": { @@ -9146,6 +9315,26 @@ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true }, + "esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -9213,36 +9402,36 @@ } }, "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -9365,21 +9554,21 @@ } }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -9508,9 +9697,9 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "gensync": { "version": "1.0.0-beta.2", @@ -9525,14 +9714,15 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-package-type": { @@ -9641,6 +9831,14 @@ } } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -9664,6 +9862,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -9674,16 +9873,32 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, "header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -10836,9 +11051,9 @@ } }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" }, "merge-stream": { "version": "2.0.0", @@ -10858,12 +11073,12 @@ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -10958,9 +11173,9 @@ "dev": true }, "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, "no-case": { @@ -11081,9 +11296,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" }, "object.defaults": { "version": "1.1.0", @@ -11373,9 +11588,9 @@ } }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "path-type": { "version": "4.0.0", @@ -11497,11 +11712,11 @@ "dev": true }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "querystringify": { @@ -11521,9 +11736,9 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -11713,9 +11928,9 @@ "dev": true }, "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "requires": { "debug": "2.6.9", "depd": "2.0.0", @@ -11746,6 +11961,11 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" } } }, @@ -11761,14 +11981,27 @@ } }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" + } + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" } }, "setprototypeof": { @@ -11792,13 +12025,14 @@ "dev": true }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "signal-exit": { diff --git a/package.json b/package.json index eb685ae9..67a04748 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ }, "dependencies": { "dateformat": "^4.5.1", - "express": "^4.18.2", + "express": "^4.21.1", "url-parse": "^1.5.9" } } From 203d1a88df3c89356ffedc1fe6de6f2f0a2fb978 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 31 Oct 2024 14:42:57 +0000 Subject: [PATCH 847/936] [REL-3702] Update merge to public script (#602) * Update merge to public script * Make the script easier to merge --- scripts/merge_to_public.sh | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/scripts/merge_to_public.sh b/scripts/merge_to_public.sh index 60229e64..ea036cfc 100755 --- a/scripts/merge_to_public.sh +++ b/scripts/merge_to_public.sh @@ -26,9 +26,20 @@ cd temp/repo git remote add private git@github.com:launchdarkly/integration-framework-private.git git checkout main git fetch private -git merge private/main --squash --strategy-option=theirs -git commit -a -m "${COMMIT_MSG}" # Merge conflicts will need to be resolved manually -git checkout -b "${BRANCH_NAME}" + +# Create a new branch from public main +git checkout -b "${BRANCH_NAME}" main + +# Remove all existing files to ensure a clean slate +git rm -rf . +git clean -fdx + +# Checkout files from private/main +git checkout private/main -- . +git add -A # Stage all changes, including deletions +git commit -m "${COMMIT_MSG}" + +# Push the changes to the new branch git push --set-upstream origin ${BRANCH_NAME} cd ../.. From 556269f952e1727d1f71fee8bc5abcbf2c6b87a3 Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Thu, 31 Oct 2024 14:01:13 -0700 Subject: [PATCH 848/936] [RO-663] Fix invalid JSON in request body Updates JSON to be valid, and correctly interpolate variables (our timestamp does not have fields) --- .../templates/error-monitoring-new-issue-found.json.hbs | 4 ++-- .../templates/measured-rollout-regression-detected.json.hbs | 4 ++-- .../pagerduty-rg/templates/measured-rollout-reverted.json.hbs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs index a44bae35..977030c7 100644 --- a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs +++ b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs @@ -4,8 +4,8 @@ "dedup_key": {{{measuredRolloutId}}}, "payload": { "summary" : "Measured rollout with ID {{{measuredRolloutId}}} has a new issue", - "timestamp": "{{{timestamp.simple}}}", + "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", "source": "app.launchdarkly.com" - }, + } } diff --git a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs index 8d8a19ee..cc300f4f 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs @@ -4,8 +4,8 @@ "dedup_key": {{{measuredRolloutId}}}, "payload": { "summary" : "Regression detected for measured rollout with ID {{{measuredRolloutId}}}", - "timestamp": "{{{timestamp.simple}}}", + "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", "source": "app.launchdarkly.com" - }, + } } diff --git a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs index df3bf7db..96cda35b 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs @@ -4,8 +4,8 @@ "dedup_key": {{{measuredRolloutId}}}, "payload": { "summary" : "Measured rollout with ID {{{measuredRolloutId}}} reverted", - "timestamp": "{{{timestamp.simple}}}", + "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", "source": "app.launchdarkly.com" - }, + } } From 2957462f7386ea1d9ee355cc5ad36fa437c6064f Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Thu, 31 Oct 2024 14:34:00 -0700 Subject: [PATCH 849/936] [RO-663] Fix invalid JSON in request body Dear god please let this be the last change we need. --- .../templates/error-monitoring-new-issue-found.json.hbs | 2 +- .../templates/measured-rollout-regression-detected.json.hbs | 2 +- .../pagerduty-rg/templates/measured-rollout-reverted.json.hbs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs index 977030c7..22f90a02 100644 --- a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs +++ b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs @@ -1,7 +1,7 @@ { "routing_key": {{{formVariables.integrationKey}}}, "event_action": "trigger", - "dedup_key": {{{measuredRolloutId}}}, + "dedup_key": "{{{measuredRolloutId}}}", "payload": { "summary" : "Measured rollout with ID {{{measuredRolloutId}}} has a new issue", "timestamp": "{{{timestamp}}}", diff --git a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs index cc300f4f..1a2d455c 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs @@ -1,7 +1,7 @@ { "routing_key": {{{formVariables.integrationKey}}}, "event_action": "trigger", - "dedup_key": {{{measuredRolloutId}}}, + "dedup_key": "{{{measuredRolloutId}}}", "payload": { "summary" : "Regression detected for measured rollout with ID {{{measuredRolloutId}}}", "timestamp": "{{{timestamp}}}", diff --git a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs index 96cda35b..f3d3990e 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs @@ -1,7 +1,7 @@ { "routing_key": {{{formVariables.integrationKey}}}, "event_action": "resolve", - "dedup_key": {{{measuredRolloutId}}}, + "dedup_key": "{{{measuredRolloutId}}}", "payload": { "summary" : "Measured rollout with ID {{{measuredRolloutId}}} reverted", "timestamp": "{{{timestamp}}}", From e231e22353a5ccbd93fefbf9efc8bc0fffe3822c Mon Sep 17 00:00:00 2001 From: carmenquan Date: Thu, 31 Oct 2024 15:14:02 -0700 Subject: [PATCH 850/936] [RO-663] Fix invalid JSON in request body (#606) Put quotes around everything, double-triple check Co-authored-by: Lucy Voigt --- .../templates/error-monitoring-new-issue-found.json.hbs | 2 +- .../templates/measured-rollout-regression-detected.json.hbs | 2 +- .../pagerduty-rg/templates/measured-rollout-reverted.json.hbs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs index 22f90a02..d86e30b2 100644 --- a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs +++ b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs @@ -1,5 +1,5 @@ { - "routing_key": {{{formVariables.integrationKey}}}, + "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "trigger", "dedup_key": "{{{measuredRolloutId}}}", "payload": { diff --git a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs index 1a2d455c..8f6c1ae4 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs @@ -1,5 +1,5 @@ { - "routing_key": {{{formVariables.integrationKey}}}, + "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "trigger", "dedup_key": "{{{measuredRolloutId}}}", "payload": { diff --git a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs index f3d3990e..7bcfe557 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs @@ -1,5 +1,5 @@ { - "routing_key": {{{formVariables.integrationKey}}}, + "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "resolve", "dedup_key": "{{{measuredRolloutId}}}", "payload": { From 8ec7cabaeec040b294e3ffc31e9ee672073e8c8f Mon Sep 17 00:00:00 2001 From: carmenquan Date: Thu, 31 Oct 2024 16:23:51 -0700 Subject: [PATCH 851/936] Make integrationKey for PagerDuty-RG not secret (#608) Having this be secret is making debugging difficult, and we suspect this value may not be getting interpolated into the request correctly. Co-authored-by: Lucy Voigt --- integrations/pagerduty-rg/manifest.json | 1 - 1 file changed, 1 deletion(-) diff --git a/integrations/pagerduty-rg/manifest.json b/integrations/pagerduty-rg/manifest.json index b0cb3555..491b756d 100644 --- a/integrations/pagerduty-rg/manifest.json +++ b/integrations/pagerduty-rg/manifest.json @@ -22,7 +22,6 @@ "name": "PagerDuty integration key", "type": "string", "description": "Enter your [PagerDuty integration key](https://support.pagerduty.com/main/docs/services-and-integrations#add-integrations-to-an-existing-service).", - "isSecret": true, "isOptional": false }, { From 2b6d9b4273a0aef9b008cb60c062bfab79095c3d Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Fri, 1 Nov 2024 09:53:39 -0700 Subject: [PATCH 852/936] Remove organization, account, and region in favor of 'account_url' --- .../snowflake-experimentation/manifest.json | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index f9b6178e..163c6c55 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -38,18 +38,10 @@ "isSecret": false }, { - "key": "organization", - "name": "Organization", - "description": "The name of the Snowflake organization being connected", - "placeholder": "ABC00001", - "type": "string", - "isSecret": false - }, - { - "key": "account", - "name": "Account", - "description": "The Snowflake account being connected", - "placeholder": "ABC00001", + "key": "account_url", + "name": "Account URL", + "description": "The URL of the Snowflake account being connected", + "placeholder": "https://abcdefg.us-east-1.snowflakecomputing.com", "type": "string", "isSecret": false }, @@ -77,14 +69,6 @@ "type": "string", "isSecret": false }, - { - "key": "region", - "name": "Region", - "description": "The Snowflake region the warehouse resides in", - "placeholder": "us-east-1", - "type": "string", - "isSecret": false - }, { "key": "privateKey", "name": "Private Key", From 5ebc98ae86b4767721b75538bb8aa10d149cf94e Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Fri, 1 Nov 2024 12:42:33 -0700 Subject: [PATCH 853/936] Camel case new form field --- integrations/snowflake-experimentation/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 163c6c55..ebb3db9c 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -38,7 +38,7 @@ "isSecret": false }, { - "key": "account_url", + "key": "accountURL", "name": "Account URL", "description": "The URL of the Snowflake account being connected", "placeholder": "https://abcdefg.us-east-1.snowflakecomputing.com", From aa86c741e94cc988f28b3183d2e30812094fa14a Mon Sep 17 00:00:00 2001 From: Blake Wilson Date: Fri, 1 Nov 2024 14:48:19 -0700 Subject: [PATCH 854/936] Use 'uri' data type for accountURL form variable --- integrations/snowflake-experimentation/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index ebb3db9c..d6fbe489 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -42,7 +42,7 @@ "name": "Account URL", "description": "The URL of the Snowflake account being connected", "placeholder": "https://abcdefg.us-east-1.snowflakecomputing.com", - "type": "string", + "type": "uri", "isSecret": false }, { From 69b81781d681e37ca0e54ca29a3176d5af453b19 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 5 Nov 2024 14:57:46 +0000 Subject: [PATCH 855/936] [REL-3171] Start on ServiceNow native (#597) * Start on ServiceNow native * Rename and update remaining requests * Update post-apply requests --- __tests__/validateIntegrationManifests.js | 7 +- .../assets/images/servicenow-horizontal.svg | 1 + .../assets/images/servicenow-icon.svg | 3 + integrations/servicenow-app/manifest.json | 106 ++++++++++++++++++ 4 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 integrations/servicenow-app/assets/images/servicenow-horizontal.svg create mode 100644 integrations/servicenow-app/assets/images/servicenow-icon.svg create mode 100644 integrations/servicenow-app/manifest.json diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index bba4033c..3b264c5e 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -16,8 +16,13 @@ const OAUTH_INTEGRATIONS = [ 'sentry', 'servicenow', 'servicenow-normal', + 'servicenow-app', ]; // add oauth integrations here -const INTEGRATIONS_WITH_DUP_OAUTH_KEYS = ['servicenow', 'servicenow-normal']; // these are integrations we expect to have duplicate oauth integration keys for various reasons +const INTEGRATIONS_WITH_DUP_OAUTH_KEYS = [ + 'servicenow', + 'servicenow-normal', + 'servicenow-app', +]; // these are integrations we expect to have duplicate oauth integration keys for various reasons var parse = require('url-parse'); diff --git a/integrations/servicenow-app/assets/images/servicenow-horizontal.svg b/integrations/servicenow-app/assets/images/servicenow-horizontal.svg new file mode 100644 index 00000000..4c76a79d --- /dev/null +++ b/integrations/servicenow-app/assets/images/servicenow-horizontal.svg @@ -0,0 +1 @@ + diff --git a/integrations/servicenow-app/assets/images/servicenow-icon.svg b/integrations/servicenow-app/assets/images/servicenow-icon.svg new file mode 100644 index 00000000..f676f2c1 --- /dev/null +++ b/integrations/servicenow-app/assets/images/servicenow-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/servicenow-app/manifest.json b/integrations/servicenow-app/manifest.json new file mode 100644 index 00000000..2c10caa0 --- /dev/null +++ b/integrations/servicenow-app/manifest.json @@ -0,0 +1,106 @@ +{ + "name": "ServiceNow Native App", + "version": "1.0.0", + "overview": "Create feature flag change requests in ServiceNow.", + "description": "Efficiently comply with company-wide change management policies by embedding LaunchDarkly approvals into existing ServiceNow workflows.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.servicenow.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/servicenow", + "privacyPolicy": "https://www.servicenow.com/privacy-statement.html" + }, + "categories": ["approval"], + "icons": { + "square": "assets/images/servicenow-icon.svg", + "horizontal": "assets/images/servicenow-horizontal.svg" + }, + "requiresOAuth": true, + "formVariables": [], + "allowIntegrationConfigurations": true, + "oauthIntegrationKey": "servicenow", + "capabilities": { + "approval": { + "name": "ServiceNow", + "allowApprovalIntegrationConfigurations": true, + "allowAdditionalApprovalFormVariables": true, + "environmentFormVariables": [], + "approvalFormVariables": [], + "creationRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/x_1551791_launch_0/approval_requests", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "jsonBody": "{\"approval_id\": \"{{approvalId}}\", \"title\": \"{{{title.plainText}}}\", \"description\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.email}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\", \"approval_form_variables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} } }", + "parser": { + "approvalId": "/result/record", + "statusValue": "/result/status/value", + "statusDisplay": "/result/status/display_value", + "approvalMatcher": "^approved$", + "rejectionMatcher": "^rejected$", + "urlTemplate": "{{oauth.baseURI}}/api/x_1551791_launch_0/approval_requests/redirect?id={{queryEncode context.approvalId}}" + } + }, + "statusRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/x_1551791_launch_0/approval_requests/{{context.approvalId}}", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "statusValue": "/result/status/value", + "statusDisplay": "/result/status/display_value", + "approvalMatcher": "^approved$", + "rejectionMatcher": "^rejected$" + } + }, + "postApplyRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/x_1551791_launch_0/approval_requests/{{context.approvalId}}/apply", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "statusValue": "/result/status/value", + "statusDisplay": "/result/status/display_value", + "approvalMatcher": "^approved$", + "rejectionMatcher": "^rejected$" + } + }, + "deletionRequest": { + "endpoint": { + "url": "{{oauth.baseURI}}/api/x_1551791_launch_0/approval_requests/{{context.approvalId}}/delete", + "method": "POST", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "statusValue": "/result/status/value", + "statusDisplay": "/result/status/display_value", + "approvalMatcher": "^approved$", + "rejectionMatcher": "^rejected$" + } + } + } + } +} From 7d99f42a9d45e8724793e91c0738a47201f00a70 Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Tue, 5 Nov 2024 13:09:54 -0800 Subject: [PATCH 856/936] [RO-664] Interpolate measured rollout flag name for Pagerduty - Guardian This updates the templates for the pagerduty-rg integration to use the `TemplateVariables` field from the `EdaContext` type in Goaltender, rather than adding a new field that may not apply to all event types. --- .../error-monitoring-new-issue-found.json.hbs | 12 ++++++++++-- .../measured-rollout-regression-detected.json.hbs | 12 ++++++++++-- .../templates/measured-rollout-reverted.json.hbs | 12 ++++++++++-- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs index d86e30b2..78d814cd 100644 --- a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs +++ b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs @@ -1,9 +1,17 @@ { "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "trigger", - "dedup_key": "{{{measuredRolloutId}}}", + "dedup_key": "{{{templateVariables.measuredRolloutFlagKey}}}", "payload": { - "summary" : "Measured rollout with ID {{{measuredRolloutId}}} has a new issue", + {{#if link}} + "links": [ + { + "href": "{{{link}}}", + "text": "Go to LaunchDarkly" + } + ], + {{/if}} + "summary" : "Measured rollout on flag {{{templateVariables.measuredRolloutFlagName}}} has a new issue", "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", "source": "app.launchdarkly.com" diff --git a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs index 8f6c1ae4..02c23517 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs @@ -1,9 +1,17 @@ { "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "trigger", - "dedup_key": "{{{measuredRolloutId}}}", + "dedup_key": "{{{templateVariables.measuredRolloutFlagKey}}}", "payload": { - "summary" : "Regression detected for measured rollout with ID {{{measuredRolloutId}}}", + {{#if link}} + "links": [ + { + "href": "{{{link}}}", + "text": "Go to LaunchDarkly" + } + ], + {{/if}} + "summary": "Regression detected for measured rollout on flag {{{templateVariables.measuredRolloutFlagName}}}", "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", "source": "app.launchdarkly.com" diff --git a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs index 7bcfe557..d520df3a 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs @@ -1,9 +1,17 @@ { "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "resolve", - "dedup_key": "{{{measuredRolloutId}}}", + "dedup_key": "{{{templateVariables.measuredRolloutFlagKey}}}", "payload": { - "summary" : "Measured rollout with ID {{{measuredRolloutId}}} reverted", + {{#if link}} + "links": [ + { + "href": "{{{link}}}", + "text": "Go to LaunchDarkly" + } + ], + {{/if}} + "summary" : "Measured rollout reverted for flag {{{templateVariables.measuredRolloutFlagName}}}", "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", "source": "app.launchdarkly.com" From fcf588758dfa98dc4d6e370053669d9cce0a1b15 Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Wed, 6 Nov 2024 08:09:01 -0800 Subject: [PATCH 857/936] Rename event selector values to match event kinds in payload --- integrations/pagerduty-rg/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/pagerduty-rg/manifest.json b/integrations/pagerduty-rg/manifest.json index 491b756d..22d12d4f 100644 --- a/integrations/pagerduty-rg/manifest.json +++ b/integrations/pagerduty-rg/manifest.json @@ -46,15 +46,15 @@ "multiselectOptions": [ { "label": "Measured Rollout Regression Detected", - "value": "MeasuredRolloutRegressionDetected" + "value": "measured-rollout-regression" }, { "label": "Measured Rollout Reverted", - "value": "MeasuredRolloutReverted" + "value": "measured-rollout-reverted" }, { "label": "New Issue Found", - "value": "ErrorMonitoringNewIssueFound" + "value": "error-monitoring-new-issue-found" } ] }, From 9aa60ee920313543bc209ae37a20e51b0e35509a Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 6 Nov 2024 17:03:29 +0000 Subject: [PATCH 858/936] [REL-3869] servicenow-c0: Disable assignment group override per customer request (#612) * servicenow-c0: Disable assignment group override per customer request * Fix grammer --- integrations/servicenow-c0/manifest.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 9e7ddf9c..2f990fc7 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -31,9 +31,10 @@ "approvalFormVariables": [ { "key": "assignmentGroup", - "name": "ServiceNow assignment group (override)", - "description": "Your ServiceNow assignment group. This value will override the flag's ServiceNow assignment group custom property.", - "type": "string", + "name": "ServiceNow assignment group override (Disabled)", + "description": "This request will fail if you have not specified the \"ServiceNow assignment group\" custom property. Read [Custom Properties](https://docs.launchdarkly.com/home/infrastructure/custom-properties) for more information.", + "type": "enum", + "allowedValues": ["Override disabled"], "isOptional": true } ], @@ -79,7 +80,7 @@ } ] }, - "jsonBody": "{ {{#if approvalFormVariables.assignmentGroup}} \"assignment_group\": \"{{{approvalFormVariables.assignmentGroup}}}\", \"u_requesting_group\": \"{{{approvalFormVariables.assignmentGroup}}}\", \"u_creating_group\": \"{{{approvalFormVariables.assignmentGroup}}}\",{{else}} \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\",{{/if}} \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", + "jsonBody": "{ \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From db7093d2d3f83f7b475720b51b088ea324e63acc Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Thu, 7 Nov 2024 07:45:33 -0800 Subject: [PATCH 859/936] [RO-671] Send flag tags and other metadata to PD As part of the release guardian PagerDuty integration we want to send metadata to PagerDuty so that users can route alerts properly. --- .../error-monitoring-new-issue-found.json.hbs | 4 ++-- ...sured-rollout-regression-detected.json.hbs | 21 +++++++++++++++++-- .../measured-rollout-reverted.json.hbs | 21 +++++++++++++++++-- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs index 78d814cd..f69f5175 100644 --- a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs +++ b/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs @@ -1,7 +1,7 @@ { "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "trigger", - "dedup_key": "{{{templateVariables.measuredRolloutFlagKey}}}", + "dedup_key": "{{{templateVariables.errorMonitoringDedupKey}}}", "payload": { {{#if link}} "links": [ @@ -11,7 +11,7 @@ } ], {{/if}} - "summary" : "Measured rollout on flag {{{templateVariables.measuredRolloutFlagName}}} has a new issue", + "summary" : "New issue found: {{{templateVariables.errorMessage}}}", "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", "source": "app.launchdarkly.com" diff --git a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs index 02c23517..c82d5160 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs @@ -1,7 +1,7 @@ { "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "trigger", - "dedup_key": "{{{templateVariables.measuredRolloutFlagKey}}}", + "dedup_key": "{{{templateVariables.measuredRolloutDedupKey}}}", "payload": { {{#if link}} "links": [ @@ -14,6 +14,23 @@ "summary": "Regression detected for measured rollout on flag {{{templateVariables.measuredRolloutFlagName}}}", "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", - "source": "app.launchdarkly.com" + "source": "app.launchdarkly.com", + "custom_details": { + {{#if templateVariables.projKey}} + "projKey": "{{{templateVariables.projKey}}}", + {{/if}} + {{#if templateVariables.envKey}} + "envKey": "{{{templateVariables.envKey}}}", + {{/if}} + {{#if templateVariables.flagKey}} + "flagKey": "{{{templateVariables.flagKey}}}", + {{/if}} + "tags": [ + {{#each templateVariables.tags}} + {{#if @index}}, {{/if}} + "{{{this}}}" + {{/each}} + ] + } } } diff --git a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs index d520df3a..aa284cd1 100644 --- a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs +++ b/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs @@ -1,7 +1,7 @@ { "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "resolve", - "dedup_key": "{{{templateVariables.measuredRolloutFlagKey}}}", + "dedup_key": "{{{templateVariables.measuredRolloutDedupKey}}}", "payload": { {{#if link}} "links": [ @@ -14,6 +14,23 @@ "summary" : "Measured rollout reverted for flag {{{templateVariables.measuredRolloutFlagName}}}", "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", - "source": "app.launchdarkly.com" + "source": "app.launchdarkly.com", + "custom_details": { + {{#if templateVariables.projKey}} + "projKey": "{{{templateVariables.projKey}}}", + {{/if}} + {{#if templateVariables.envKey}} + "envKey": "{{{templateVariables.envKey}}}", + {{/if}} + {{#if templateVariables.flagKey}} + "flagKey": "{{{templateVariables.flagKey}}}", + {{/if}} + "tags": [ + {{#each templateVariables.tags}} + {{#if @index}}, {{/if}} + "{{{this}}}" + {{/each}} + ] + } } } From 0e2c761c6a615fc8daf1bb1a8a3599fc705e407a Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 7 Nov 2024 16:08:50 +0000 Subject: [PATCH 860/936] Add links to servicenow-c0 manifest (#613) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 2f990fc7..139c44e6 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -80,7 +80,7 @@ } ] }, - "jsonBody": "{ \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", + "jsonBody": "{ \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\\n\\nLaunchDarkly Approval Request: {{{_links.approval.href}}}\\nChange History: {{{_links.history.href}}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From 51c3c68ea18787902c2ddb44d90abc60eadaf3a1 Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Thu, 7 Nov 2024 08:19:05 -0800 Subject: [PATCH 861/936] [RO-684] Rename pagerduty-rg to pagerduty-guardian-edition --- .../{pagerduty-rg => pagerduty-guardian-edition}/README.md | 0 .../assets/pagerduty-rectangle.svg | 0 .../assets/pagerduty-square.svg | 0 .../manifest.json | 6 +++--- .../templates/error-monitoring-new-issue-found.json.hbs | 0 .../templates/measured-rollout-regression-detected.json.hbs | 0 .../templates/measured-rollout-reverted.json.hbs | 0 7 files changed, 3 insertions(+), 3 deletions(-) rename integrations/{pagerduty-rg => pagerduty-guardian-edition}/README.md (100%) rename integrations/{pagerduty-rg => pagerduty-guardian-edition}/assets/pagerduty-rectangle.svg (100%) rename integrations/{pagerduty-rg => pagerduty-guardian-edition}/assets/pagerduty-square.svg (100%) rename integrations/{pagerduty-rg => pagerduty-guardian-edition}/manifest.json (94%) rename integrations/{pagerduty-rg => pagerduty-guardian-edition}/templates/error-monitoring-new-issue-found.json.hbs (100%) rename integrations/{pagerduty-rg => pagerduty-guardian-edition}/templates/measured-rollout-regression-detected.json.hbs (100%) rename integrations/{pagerduty-rg => pagerduty-guardian-edition}/templates/measured-rollout-reverted.json.hbs (100%) diff --git a/integrations/pagerduty-rg/README.md b/integrations/pagerduty-guardian-edition/README.md similarity index 100% rename from integrations/pagerduty-rg/README.md rename to integrations/pagerduty-guardian-edition/README.md diff --git a/integrations/pagerduty-rg/assets/pagerduty-rectangle.svg b/integrations/pagerduty-guardian-edition/assets/pagerduty-rectangle.svg similarity index 100% rename from integrations/pagerduty-rg/assets/pagerduty-rectangle.svg rename to integrations/pagerduty-guardian-edition/assets/pagerduty-rectangle.svg diff --git a/integrations/pagerduty-rg/assets/pagerduty-square.svg b/integrations/pagerduty-guardian-edition/assets/pagerduty-square.svg similarity index 100% rename from integrations/pagerduty-rg/assets/pagerduty-square.svg rename to integrations/pagerduty-guardian-edition/assets/pagerduty-square.svg diff --git a/integrations/pagerduty-rg/manifest.json b/integrations/pagerduty-guardian-edition/manifest.json similarity index 94% rename from integrations/pagerduty-rg/manifest.json rename to integrations/pagerduty-guardian-edition/manifest.json index 22d12d4f..e2715460 100644 --- a/integrations/pagerduty-rg/manifest.json +++ b/integrations/pagerduty-guardian-edition/manifest.json @@ -1,8 +1,8 @@ { - "name": "PagerDuty - Release Guardian", + "name": "PagerDuty - Guardian Edition", "version": "1.0.0", - "overview": "Send Release Guardian events to PagerDuty services.", - "description": "Send Release Guardian events to PagerDuty to create or resolve incidents.", + "overview": "Send Guardian Edition events to PagerDuty services.", + "description": "Send Guardian Edition events to PagerDuty to create or resolve incidents.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs b/integrations/pagerduty-guardian-edition/templates/error-monitoring-new-issue-found.json.hbs similarity index 100% rename from integrations/pagerduty-rg/templates/error-monitoring-new-issue-found.json.hbs rename to integrations/pagerduty-guardian-edition/templates/error-monitoring-new-issue-found.json.hbs diff --git a/integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs b/integrations/pagerduty-guardian-edition/templates/measured-rollout-regression-detected.json.hbs similarity index 100% rename from integrations/pagerduty-rg/templates/measured-rollout-regression-detected.json.hbs rename to integrations/pagerduty-guardian-edition/templates/measured-rollout-regression-detected.json.hbs diff --git a/integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs b/integrations/pagerduty-guardian-edition/templates/measured-rollout-reverted.json.hbs similarity index 100% rename from integrations/pagerduty-rg/templates/measured-rollout-reverted.json.hbs rename to integrations/pagerduty-guardian-edition/templates/measured-rollout-reverted.json.hbs From 726dd32d954ab4bf5ae193d2feb4e91b06e49d6b Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Thu, 7 Nov 2024 13:38:11 -0800 Subject: [PATCH 862/936] Correct event filter defaults --- integrations/pagerduty-guardian-edition/manifest.json | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/integrations/pagerduty-guardian-edition/manifest.json b/integrations/pagerduty-guardian-edition/manifest.json index e2715460..f70c2313 100644 --- a/integrations/pagerduty-guardian-edition/manifest.json +++ b/integrations/pagerduty-guardian-edition/manifest.json @@ -39,9 +39,8 @@ "description": "Filter incoming events by event type", "isOptional": true, "multiselectDefaultOptions": [ - "MeasuredRolloutRegressionDetected", - "MeasuredRolloutReverted", - "ErrorMonitoringNewIssueFound" + "measured-rollout-regression", + "measured-rollout-reverted" ], "multiselectOptions": [ { @@ -51,10 +50,6 @@ { "label": "Measured Rollout Reverted", "value": "measured-rollout-reverted" - }, - { - "label": "New Issue Found", - "value": "error-monitoring-new-issue-found" } ] }, From efaa8499eaea923a4c2eeeba279750c50823839d Mon Sep 17 00:00:00 2001 From: Lucy Voigt Date: Thu, 14 Nov 2024 14:05:51 -0800 Subject: [PATCH 863/936] [RO-737] Correctly structure pagerduty requests This updates the pagerduty request payload to move "links" out from under "payload" per the documentation: https://developer.pagerduty.com/docs/ZG9jOjExMDI5NTgx-send-an-alert-event#example-request-payloads I also realized that for resolve requests the "payload" key isn't used, so removed that from MeasuredRolloutReverted template. --- .../error-monitoring-new-issue-found.json.hbs | 16 ++++----- ...sured-rollout-regression-detected.json.hbs | 16 ++++----- .../measured-rollout-reverted.json.hbs | 33 +------------------ 3 files changed, 17 insertions(+), 48 deletions(-) diff --git a/integrations/pagerduty-guardian-edition/templates/error-monitoring-new-issue-found.json.hbs b/integrations/pagerduty-guardian-edition/templates/error-monitoring-new-issue-found.json.hbs index f69f5175..007e50a4 100644 --- a/integrations/pagerduty-guardian-edition/templates/error-monitoring-new-issue-found.json.hbs +++ b/integrations/pagerduty-guardian-edition/templates/error-monitoring-new-issue-found.json.hbs @@ -2,15 +2,15 @@ "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "trigger", "dedup_key": "{{{templateVariables.errorMonitoringDedupKey}}}", + {{#if link}} + "links": [ + { + "href": "{{{link}}}", + "text": "Go to LaunchDarkly" + } + ], + {{/if}} "payload": { - {{#if link}} - "links": [ - { - "href": "{{{link}}}", - "text": "Go to LaunchDarkly" - } - ], - {{/if}} "summary" : "New issue found: {{{templateVariables.errorMessage}}}", "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", diff --git a/integrations/pagerduty-guardian-edition/templates/measured-rollout-regression-detected.json.hbs b/integrations/pagerduty-guardian-edition/templates/measured-rollout-regression-detected.json.hbs index c82d5160..6baaab6d 100644 --- a/integrations/pagerduty-guardian-edition/templates/measured-rollout-regression-detected.json.hbs +++ b/integrations/pagerduty-guardian-edition/templates/measured-rollout-regression-detected.json.hbs @@ -2,15 +2,15 @@ "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "trigger", "dedup_key": "{{{templateVariables.measuredRolloutDedupKey}}}", + {{#if link}} + "links": [ + { + "href": "{{{link}}}", + "text": "Go to LaunchDarkly" + } + ], + {{/if}} "payload": { - {{#if link}} - "links": [ - { - "href": "{{{link}}}", - "text": "Go to LaunchDarkly" - } - ], - {{/if}} "summary": "Regression detected for measured rollout on flag {{{templateVariables.measuredRolloutFlagName}}}", "timestamp": "{{{timestamp}}}", "severity": "{{{formVariables.severity}}}", diff --git a/integrations/pagerduty-guardian-edition/templates/measured-rollout-reverted.json.hbs b/integrations/pagerduty-guardian-edition/templates/measured-rollout-reverted.json.hbs index aa284cd1..7eb5e2f1 100644 --- a/integrations/pagerduty-guardian-edition/templates/measured-rollout-reverted.json.hbs +++ b/integrations/pagerduty-guardian-edition/templates/measured-rollout-reverted.json.hbs @@ -1,36 +1,5 @@ { "routing_key": "{{{formVariables.integrationKey}}}", "event_action": "resolve", - "dedup_key": "{{{templateVariables.measuredRolloutDedupKey}}}", - "payload": { - {{#if link}} - "links": [ - { - "href": "{{{link}}}", - "text": "Go to LaunchDarkly" - } - ], - {{/if}} - "summary" : "Measured rollout reverted for flag {{{templateVariables.measuredRolloutFlagName}}}", - "timestamp": "{{{timestamp}}}", - "severity": "{{{formVariables.severity}}}", - "source": "app.launchdarkly.com", - "custom_details": { - {{#if templateVariables.projKey}} - "projKey": "{{{templateVariables.projKey}}}", - {{/if}} - {{#if templateVariables.envKey}} - "envKey": "{{{templateVariables.envKey}}}", - {{/if}} - {{#if templateVariables.flagKey}} - "flagKey": "{{{templateVariables.flagKey}}}", - {{/if}} - "tags": [ - {{#each templateVariables.tags}} - {{#if @index}}, {{/if}} - "{{{this}}}" - {{/each}} - ] - } - } + "dedup_key": "{{{templateVariables.measuredRolloutDedupKey}}}" } From 61b1301a86ca9fa28a57cb65bc7c8be3c18b131b Mon Sep 17 00:00:00 2001 From: Sam Stokes Date: Tue, 19 Nov 2024 08:19:28 -0800 Subject: [PATCH 864/936] Correct description of "warehouse" field in prototype form (#618) In Snowflake terminology ["warehouse"](https://docs.snowflake.com/en/user-guide/warehouses) means compute, not storage, but it's frequently misunderstood as meaning storage (and therefore having something to do with where the data lives). This corrects the description of the "warehouse" field to avoid reinforcing that confusion. --- integrations/snowflake-experimentation/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index d6fbe489..23f1b0af 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -48,7 +48,7 @@ { "key": "warehouse", "name": "Warehouse", - "description": "The Snowflake warehouse containing experimentation data", + "description": "The Snowflake warehouse used to compute experiment results", "placeholder": "LD_EXP_WH", "type": "string", "isSecret": false From b5dd6a06127ea0cee39f522cea118536df1adfcc Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Wed, 20 Nov 2024 13:03:28 -0600 Subject: [PATCH 865/936] add hideEmpty property for form fields --- manifest.schema.d.ts | 5 +++++ manifest.schema.json | 40 ++++++++++++++++++++++++++++++++++++---- schemas/definitions.json | 10 +++++++++- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 3d1e45b9..235bd053 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -357,6 +357,10 @@ export type OptionsArray1 = MultiSelectOptionItem[]; * Default options to be selected when the multi select is first rendered */ export type MultiSelectDefaultOptions = string[]; +/** + * Variables marked as hideEmpty won't be shown in the UI if they are empty + */ +export type HideValueInUIWhenEmpty = boolean; /** * Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`. */ @@ -793,6 +797,7 @@ export interface FormVariable { dependsOn?: DependsOn; multiselectOptions?: OptionsArray1; multiselectDefaultOptions?: MultiSelectDefaultOptions; + hideEmpty?: HideValueInUIWhenEmpty; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index eb09b5ce..f9cd83d6 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -295,7 +295,8 @@ "dependsOn", "multiselectOptions", "multiselectDefaultOptions", - "disableAfterSaving" + "disableAfterSaving", + "hideEmpty" ] }, "properties": { @@ -722,6 +723,13 @@ "items": { "type": "string" } + }, + "hideEmpty": { + "$id": "#/definitions/form-variable/hide-empty", + "title": "Hide value in UI when empty", + "type": "boolean", + "description": "Variables marked as hideEmpty won't be shown in the UI if they are empty", + "default": false } }, "required": [ @@ -1264,7 +1272,8 @@ "dependsOn", "multiselectOptions", "multiselectDefaultOptions", - "disableAfterSaving" + "disableAfterSaving", + "hideEmpty" ] }, "properties": { @@ -1691,6 +1700,13 @@ "items": { "type": "string" } + }, + "hideEmpty": { + "$id": "#/definitions/form-variable/hide-empty", + "title": "Hide value in UI when empty", + "type": "boolean", + "description": "Variables marked as hideEmpty won't be shown in the UI if they are empty", + "default": false } }, "required": [ @@ -1728,7 +1744,8 @@ "dependsOn", "multiselectOptions", "multiselectDefaultOptions", - "disableAfterSaving" + "disableAfterSaving", + "hideEmpty" ] }, "properties": { @@ -2155,6 +2172,13 @@ "items": { "type": "string" } + }, + "hideEmpty": { + "$id": "#/definitions/form-variable/hide-empty", + "title": "Hide value in UI when empty", + "type": "boolean", + "description": "Variables marked as hideEmpty won't be shown in the UI if they are empty", + "default": false } }, "required": [ @@ -3228,7 +3252,8 @@ "dependsOn", "multiselectOptions", "multiselectDefaultOptions", - "disableAfterSaving" + "disableAfterSaving", + "hideEmpty" ] }, "properties": { @@ -3655,6 +3680,13 @@ "items": { "type": "string" } + }, + "hideEmpty": { + "$id": "#/definitions/form-variable/hide-empty", + "title": "Hide value in UI when empty", + "type": "boolean", + "description": "Variables marked as hideEmpty won't be shown in the UI if they are empty", + "default": false } }, "required": [ diff --git a/schemas/definitions.json b/schemas/definitions.json index 9fafe37e..9108d2d1 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -154,7 +154,8 @@ "dependsOn", "multiselectOptions", "multiselectDefaultOptions", - "disableAfterSaving" + "disableAfterSaving", + "hideEmpty" ] }, "properties": { @@ -402,6 +403,13 @@ "items": { "type": "string" } + }, + "hideEmpty": { + "$id": "#/definitions/form-variable/hide-empty", + "title": "Hide value in UI when empty", + "type": "boolean", + "description": "Variables marked as hideEmpty won't be shown in the UI if they are empty", + "default": false } }, "required": ["key", "name", "type", "description"] From 7ed4d339d7d36824ac73a1453fa66ccdba8c68fc Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Wed, 20 Nov 2024 16:05:21 -0600 Subject: [PATCH 866/936] add new integration for snowflake export --- .../assets/images/horizontal.svg | 27 +++++++ .../snowflake-export/assets/images/square.svg | 1 + integrations/snowflake-export/manifest.json | 80 +++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 integrations/snowflake-export/assets/images/horizontal.svg create mode 100644 integrations/snowflake-export/assets/images/square.svg create mode 100644 integrations/snowflake-export/manifest.json diff --git a/integrations/snowflake-export/assets/images/horizontal.svg b/integrations/snowflake-export/assets/images/horizontal.svg new file mode 100644 index 00000000..5b792631 --- /dev/null +++ b/integrations/snowflake-export/assets/images/horizontal.svg @@ -0,0 +1,27 @@ + + logo-blue-svg + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/snowflake-export/assets/images/square.svg b/integrations/snowflake-export/assets/images/square.svg new file mode 100644 index 00000000..70bb8a73 --- /dev/null +++ b/integrations/snowflake-export/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/snowflake-export/manifest.json b/integrations/snowflake-export/manifest.json new file mode 100644 index 00000000..9229660a --- /dev/null +++ b/integrations/snowflake-export/manifest.json @@ -0,0 +1,80 @@ +{ + "name": "Snowflake Export", + "version": "1.0.0", + "overview": "Export data to snowflake", + "description": "Description string", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "allowIntegrationConfigurations": true, + "links": { + "site": "https://www.snowflake.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/TODO", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "dataExport" + }, + "otherCapabilities": ["dataExport"], + "formVariables": [ + { + "key": "user", + "name": "User", + "description": "The user used to connect to Snowflake for accessing experimentation data", + "placeholder": "SNOW_USER", + "type": "string", + "isSecret": false + }, + { + "key": "role", + "name": "Role", + "description": "The role used by the connecting user", + "placeholder": "SNOW_ROLE", + "type": "string", + "isSecret": false + }, + { + "key": "snowflakeHostAddress", + "name": "Snowflake Host Address", + "description": "Description string", + "placeholder": "--your-value--.--region--.snowflakecomputing.com", + "type": "string", + "isSecret": false + }, + { + "key": "warehouse", + "name": "Warehouse", + "description": "The Snowflake warehouse used to compute experiment results", + "placeholder": "LD_EXP_WH", + "type": "string", + "isSecret": false + }, + { + "key": "database", + "name": "Database", + "description": "The Snowflake database containing experimentation data", + "placeholder": "LD_EXP_DB", + "type": "string", + "isSecret": false + }, + { + "key": "schema", + "name": "Schema", + "description": "The Snowflake schema containing experimentation data", + "placeholder": "EXP_SCHEMA", + "type": "string", + "isSecret": false + }, + { + "key": "selectedEnv", + "type": "environmentSelector", + "name": "Environment selector", + "description": "The LaunchDarkly environment to connect experimentation data to", + "isOptional": false + } + ] +} From 55849a4296808db12a4cadf991beb0ed82cbe015 Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Thu, 21 Nov 2024 13:17:53 -0600 Subject: [PATCH 867/936] updates to manifest --- integrations/snowflake-export/manifest.json | 63 +-------------------- 1 file changed, 3 insertions(+), 60 deletions(-) diff --git a/integrations/snowflake-export/manifest.json b/integrations/snowflake-export/manifest.json index 9229660a..797771fd 100644 --- a/integrations/snowflake-export/manifest.json +++ b/integrations/snowflake-export/manifest.json @@ -2,13 +2,13 @@ "name": "Snowflake Export", "version": "1.0.0", "overview": "Export data to snowflake", - "description": "Description string", + "description": "Export data to snowflake", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "allowIntegrationConfigurations": true, "links": { "site": "https://www.snowflake.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/TODO", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/snowflake", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], @@ -19,62 +19,5 @@ "legacy": { "kind": "dataExport" }, - "otherCapabilities": ["dataExport"], - "formVariables": [ - { - "key": "user", - "name": "User", - "description": "The user used to connect to Snowflake for accessing experimentation data", - "placeholder": "SNOW_USER", - "type": "string", - "isSecret": false - }, - { - "key": "role", - "name": "Role", - "description": "The role used by the connecting user", - "placeholder": "SNOW_ROLE", - "type": "string", - "isSecret": false - }, - { - "key": "snowflakeHostAddress", - "name": "Snowflake Host Address", - "description": "Description string", - "placeholder": "--your-value--.--region--.snowflakecomputing.com", - "type": "string", - "isSecret": false - }, - { - "key": "warehouse", - "name": "Warehouse", - "description": "The Snowflake warehouse used to compute experiment results", - "placeholder": "LD_EXP_WH", - "type": "string", - "isSecret": false - }, - { - "key": "database", - "name": "Database", - "description": "The Snowflake database containing experimentation data", - "placeholder": "LD_EXP_DB", - "type": "string", - "isSecret": false - }, - { - "key": "schema", - "name": "Schema", - "description": "The Snowflake schema containing experimentation data", - "placeholder": "EXP_SCHEMA", - "type": "string", - "isSecret": false - }, - { - "key": "selectedEnv", - "type": "environmentSelector", - "name": "Environment selector", - "description": "The LaunchDarkly environment to connect experimentation data to", - "isOptional": false - } - ] + "otherCapabilities": ["dataExport"] } From cb61671a3a0728e91995a6af2082af6b393e3ed3 Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Thu, 21 Nov 2024 14:33:54 -0600 Subject: [PATCH 868/936] add periods --- integrations/snowflake-export/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/snowflake-export/manifest.json b/integrations/snowflake-export/manifest.json index 797771fd..b3dea154 100644 --- a/integrations/snowflake-export/manifest.json +++ b/integrations/snowflake-export/manifest.json @@ -1,8 +1,8 @@ { "name": "Snowflake Export", "version": "1.0.0", - "overview": "Export data to snowflake", - "description": "Export data to snowflake", + "overview": "Export data to snowflake.", + "description": "Export Launchdarkly data to your snowflake warehouse.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "allowIntegrationConfigurations": true, From 867d80256d7156f9d3859f2cd8efdeaf094bdfac Mon Sep 17 00:00:00 2001 From: awinders-launchdarkly <168487029+awinders-launchdarkly@users.noreply.github.com> Date: Fri, 22 Nov 2024 10:06:02 -0600 Subject: [PATCH 869/936] Update integrations/snowflake-export/manifest.json Co-authored-by: Isabelle Miller --- integrations/snowflake-export/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake-export/manifest.json b/integrations/snowflake-export/manifest.json index b3dea154..7b5f8116 100644 --- a/integrations/snowflake-export/manifest.json +++ b/integrations/snowflake-export/manifest.json @@ -2,7 +2,7 @@ "name": "Snowflake Export", "version": "1.0.0", "overview": "Export data to snowflake.", - "description": "Export Launchdarkly data to your snowflake warehouse.", + "description": "Export Launchdarkly data to your Snowflake warehouse.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "allowIntegrationConfigurations": true, From 932f188b0d6cac058ce32abb44eee636faff6263 Mon Sep 17 00:00:00 2001 From: awinders-launchdarkly <168487029+awinders-launchdarkly@users.noreply.github.com> Date: Fri, 22 Nov 2024 10:24:40 -0600 Subject: [PATCH 870/936] Update integrations/snowflake-export/manifest.json Co-authored-by: Isabelle Miller --- integrations/snowflake-export/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake-export/manifest.json b/integrations/snowflake-export/manifest.json index 7b5f8116..fb00fb24 100644 --- a/integrations/snowflake-export/manifest.json +++ b/integrations/snowflake-export/manifest.json @@ -5,7 +5,7 @@ "description": "Export Launchdarkly data to your Snowflake warehouse.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", - "allowIntegrationConfigurations": true, + "allowIntegrationConfigurations": false, "links": { "site": "https://www.snowflake.com/", "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/snowflake", From bd3be6b11cc104ff303e231d3d38033d3d700352 Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Wed, 20 Nov 2024 14:42:57 -0600 Subject: [PATCH 871/936] add new SNE integration --- .../snowflake-experimentation/manifest.json | 74 +++---------------- 1 file changed, 11 insertions(+), 63 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 23f1b0af..60acaab6 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -16,80 +16,28 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, - "legacy": { - "kind": "dataExport" - }, - "otherCapabilities": ["dataExport"], "formVariables": [ { - "key": "user", - "name": "User", - "description": "The user used to connect to Snowflake for accessing experimentation data", - "placeholder": "SNOW_USER", - "type": "string", - "isSecret": false - }, - { - "key": "role", - "name": "Role", - "description": "The role used by the connecting user", - "placeholder": "SNOW_ROLE", + "key": "snowflakeHostAddress", + "name": "Snowflake Host Address", + "description": "Description string", + "placeholder": "--your-value--.--region--.snowflakecomputing.com", "type": "string", "isSecret": false }, - { - "key": "accountURL", - "name": "Account URL", - "description": "The URL of the Snowflake account being connected", - "placeholder": "https://abcdefg.us-east-1.snowflakecomputing.com", - "type": "uri", - "isSecret": false - }, - { - "key": "warehouse", - "name": "Warehouse", - "description": "The Snowflake warehouse used to compute experiment results", - "placeholder": "LD_EXP_WH", - "type": "string", - "isSecret": false - }, - { - "key": "database", - "name": "Database", - "description": "The Snowflake database containing experimentation data", - "placeholder": "LD_EXP_DB", - "type": "string", - "isSecret": false - }, - { - "key": "schema", - "name": "Schema", - "description": "The Snowflake schema containing experimentation data", - "placeholder": "EXP_SCHEMA", - "type": "string", - "isSecret": false - }, - { - "key": "privateKey", - "name": "Private Key", - "description": "Private key for the user connecting to Snowlake", - "placeholder": "-----BEGIN PRIVATE KEY-----...", - "type": "string", - "isSecret": true - }, - { - "key": "publicKey", - "name": "Public Key", - "description": "Public key for the user connecting to Snowflake", - "placeholder": "-----BEGIN PUBLIC KEY-----...", - "type": "string" - }, { "key": "selectedEnv", "type": "environmentSelector", "name": "Environment selector", "description": "The LaunchDarkly environment to connect experimentation data to", "isOptional": false + }, + { + "key": "publicKey", + "name": "Public key", + "description": "This is your public key description", + "type": "generated", + "hideEmpty": true } ] } From afcae62c5eb67e9c1a1a846fa7f327af8f7892f0 Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Mon, 25 Nov 2024 12:27:52 -0600 Subject: [PATCH 872/936] add new otherCapabilities --- .../snowflake-experimentation/manifest.json | 1 + manifest.schema.d.ts | 304 ++++++++++-------- manifest.schema.json | 3 +- schemas/base.json | 10 +- 4 files changed, 177 insertions(+), 141 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 60acaab6..b29d3929 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -16,6 +16,7 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, + "otherCapabilities": ["nativeExperimentation"], "formVariables": [ { "key": "snowflakeHostAddress", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 235bd053..6d2e59ce 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -54,127 +54,127 @@ export type SupportWebsite = string; */ export type Categories = | [ - | "analytics" - | "approval" - | "authentication" - | "automation" - | "big-segment-store" - | "code-references" - | "customer-support" - | "data" - | "developer-tools" - | "import" - | "infrastructure" - | "issue-tracking" - | "log-management" - | "messaging" - | "migration" - | "monitoring" - | "synced-segments" - | "notifications" + | 'analytics' + | 'approval' + | 'authentication' + | 'automation' + | 'big-segment-store' + | 'code-references' + | 'customer-support' + | 'data' + | 'developer-tools' + | 'import' + | 'infrastructure' + | 'issue-tracking' + | 'log-management' + | 'messaging' + | 'migration' + | 'monitoring' + | 'synced-segments' + | 'notifications' ] | [ ( - | "analytics" - | "approval" - | "authentication" - | "automation" - | "big-segment-store" - | "code-references" - | "customer-support" - | "data" - | "developer-tools" - | "import" - | "infrastructure" - | "issue-tracking" - | "log-management" - | "messaging" - | "migration" - | "monitoring" - | "synced-segments" - | "notifications" + | 'analytics' + | 'approval' + | 'authentication' + | 'automation' + | 'big-segment-store' + | 'code-references' + | 'customer-support' + | 'data' + | 'developer-tools' + | 'import' + | 'infrastructure' + | 'issue-tracking' + | 'log-management' + | 'messaging' + | 'migration' + | 'monitoring' + | 'synced-segments' + | 'notifications' ), ( - | "analytics" - | "approval" - | "authentication" - | "automation" - | "big-segment-store" - | "code-references" - | "customer-support" - | "data" - | "developer-tools" - | "import" - | "infrastructure" - | "issue-tracking" - | "log-management" - | "messaging" - | "migration" - | "monitoring" - | "synced-segments" - | "notifications" + | 'analytics' + | 'approval' + | 'authentication' + | 'automation' + | 'big-segment-store' + | 'code-references' + | 'customer-support' + | 'data' + | 'developer-tools' + | 'import' + | 'infrastructure' + | 'issue-tracking' + | 'log-management' + | 'messaging' + | 'migration' + | 'monitoring' + | 'synced-segments' + | 'notifications' ) ] | [ ( - | "analytics" - | "approval" - | "authentication" - | "automation" - | "big-segment-store" - | "code-references" - | "customer-support" - | "data" - | "developer-tools" - | "import" - | "infrastructure" - | "issue-tracking" - | "log-management" - | "messaging" - | "migration" - | "monitoring" - | "synced-segments" - | "notifications" + | 'analytics' + | 'approval' + | 'authentication' + | 'automation' + | 'big-segment-store' + | 'code-references' + | 'customer-support' + | 'data' + | 'developer-tools' + | 'import' + | 'infrastructure' + | 'issue-tracking' + | 'log-management' + | 'messaging' + | 'migration' + | 'monitoring' + | 'synced-segments' + | 'notifications' ), ( - | "analytics" - | "approval" - | "authentication" - | "automation" - | "big-segment-store" - | "code-references" - | "customer-support" - | "data" - | "developer-tools" - | "import" - | "infrastructure" - | "issue-tracking" - | "log-management" - | "messaging" - | "migration" - | "monitoring" - | "synced-segments" - | "notifications" + | 'analytics' + | 'approval' + | 'authentication' + | 'automation' + | 'big-segment-store' + | 'code-references' + | 'customer-support' + | 'data' + | 'developer-tools' + | 'import' + | 'infrastructure' + | 'issue-tracking' + | 'log-management' + | 'messaging' + | 'migration' + | 'monitoring' + | 'synced-segments' + | 'notifications' ), ( - | "analytics" - | "approval" - | "authentication" - | "automation" - | "big-segment-store" - | "code-references" - | "customer-support" - | "data" - | "developer-tools" - | "import" - | "infrastructure" - | "issue-tracking" - | "log-management" - | "messaging" - | "migration" - | "monitoring" - | "synced-segments" - | "notifications" + | 'analytics' + | 'approval' + | 'authentication' + | 'automation' + | 'big-segment-store' + | 'code-references' + | 'customer-support' + | 'data' + | 'developer-tools' + | 'import' + | 'infrastructure' + | 'issue-tracking' + | 'log-management' + | 'messaging' + | 'migration' + | 'monitoring' + | 'synced-segments' + | 'notifications' ) ]; /** @@ -188,13 +188,34 @@ export type HorizontalLogo = string; /** * Kind of legacy integration */ -export type Kind = "codeRefs" | "datadog" | "dataExport" | "slackWebhooks" | "webhooks"; +export type Kind = + | 'codeRefs' + | 'datadog' + | 'dataExport' + | 'slackWebhooks' + | 'webhooks'; /** * Capabilities not configured by manifests */ export type OtherCapabilities = [ - "codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks", - ...("codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks")[] + ( + | 'codeRefs' + | 'dataExport' + | 'external' + | 'ide' + | 'sso' + | 'webhooks' + | 'nativeExperimentation' + ), + ...( + | 'codeRefs' + | 'dataExport' + | 'external' + | 'ide' + | 'sso' + | 'webhooks' + | 'nativeExperimentation' + )[] ]; /** * Whether the integration authenticates using OAuth @@ -216,15 +237,15 @@ export type Name = string; * The type of the variable */ export type Type = - | "string" - | "boolean" - | "uri" - | "enum" - | "oauth" - | "dynamicEnum" - | "generated" - | "environmentSelector" - | "multiselect"; + | 'string' + | 'boolean' + | 'uri' + | 'enum' + | 'oauth' + | 'dynamicEnum' + | 'generated' + | 'environmentSelector' + | 'multiselect'; /** * Describes the variable in the UI. Markdown links allowed. */ @@ -264,7 +285,7 @@ export type URL = string; /** * HTTP method to use when LaunchDarkly makes the request to your endpoint */ -export type HTTPMethod = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +export type HTTPMethod = 'POST' | 'PUT' | 'PATCH' | 'GET' | 'DELETE'; /** * Name of the header */ @@ -304,24 +325,27 @@ export type VariableKey = string; /** * Which form variable type is the variable key defined or located in? */ -export type VariableLocation = "approvalFormVariables" | "environmentFormVariables" | "formVariables"; +export type VariableLocation = + | 'approvalFormVariables' + | 'environmentFormVariables' + | 'formVariables'; /** * Action to be taken when your defined conditions evaluates to true */ -export type Action = "hideField" | "showField"; +export type Action = 'hideField' | 'showField'; /** * Name of the operator for evaluating a condition. */ export type Operator = - | "lessThan" - | "lessThanOrEqualTo" - | "greaterThan" - | "greaterThanOrEqualTo" - | "equalTo" - | "notEqual" - | "contains" - | "startsWith" - | "endsWith"; + | 'lessThan' + | 'lessThanOrEqualTo' + | 'greaterThan' + | 'greaterThanOrEqualTo' + | 'equalTo' + | 'notEqual' + | 'contains' + | 'startsWith' + | 'endsWith'; /** * Target value that conditions are evaluated against */ @@ -400,7 +424,7 @@ export type Actions = string[]; /** * This attribute defines whether the statement allows or denies access to the named resources and actions. */ -export type Effect = "allow" | "deny"; +export type Effect = 'allow' | 'deny'; /** * A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/home/members/role-actions for more information. */ @@ -420,7 +444,7 @@ export type IncludeErrorResponseBody = boolean; /** * Describes how the audit log event will be delivered to the destination. Custom delivery method indicates a custom delivery implementation in LaunchDarkly will be used. */ -export type DeliveryMethod = "custom"; +export type DeliveryMethod = 'custom'; /** * Whether to send the standard audit log webhook payload or to use defined JSON templates */ @@ -453,7 +477,7 @@ export type DocumentationLink = string; /** * Authentication type - currently the only option is sharedSecret. */ -export type Authentication = "sharedSecret"; +export type Authentication = 'sharedSecret'; /** * The default event name string used in the audit log if an eventName cannot be parsed in the trigger request body. */ @@ -489,11 +513,13 @@ export type ApprovalFormVariables = FormVariable[]; /** * If true, the user can define additional approval form variable fields with which to populate the approval creation request */ -export type AllowAdditionalApprovalFormVariablesForCreationRequestModal = boolean; +export type AllowAdditionalApprovalFormVariablesForCreationRequestModal = + boolean; /** * If true, the user can create integration configurations associated with this integration's approval capability. Requires formVariables to be defined */ -export type AllowUsersToConfigureIntegrationConfigurationsForApprovals = boolean; +export type AllowUsersToConfigureIntegrationConfigurationsForApprovals = + boolean; /** * Template string used to render the JSON request body */ @@ -563,7 +589,7 @@ export type LeadText = string; /** * Data type for the metadata attribute */ -export type Type1 = "string" | "uri"; +export type Type1 = 'string' | 'uri'; /** * Url of the image. Handlebars template notation can be used to reference metadata fields. */ @@ -691,7 +717,7 @@ export type CohortIdPath1 = string; /** * Describes what type of database LaunchDarkly will sync big segments to */ -export type DatabaseStyle = "redis" | "dynamoDB"; +export type DatabaseStyle = 'redis' | 'dynamoDB'; /** * Template to use for imports from Split */ diff --git a/manifest.schema.json b/manifest.schema.json index f9cd83d6..6a65ce88 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -251,7 +251,8 @@ "external", "ide", "sso", - "webhooks" + "webhooks", + "nativeExperimentation" ] } }, diff --git a/schemas/base.json b/schemas/base.json index 43b75e2d..eae6132b 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -223,7 +223,15 @@ "minItems": 1, "items": { "type": "string", - "enum": ["codeRefs", "dataExport", "external", "ide", "sso", "webhooks"] + "enum": [ + "codeRefs", + "dataExport", + "external", + "ide", + "sso", + "webhooks", + "nativeExperimentation" + ] } }, "requiresOAuth": { From ede9a2c284a5d6fe69788a05518dd36b8134eac2 Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Mon, 25 Nov 2024 12:34:42 -0600 Subject: [PATCH 873/936] regenerated --- manifest.schema.d.ts | 2220 +++++++++++++++++++++++++++++++++--------- 1 file changed, 1768 insertions(+), 452 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 6d2e59ce..cc76b499 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -54,127 +54,127 @@ export type SupportWebsite = string; */ export type Categories = | [ - | 'analytics' - | 'approval' - | 'authentication' - | 'automation' - | 'big-segment-store' - | 'code-references' - | 'customer-support' - | 'data' - | 'developer-tools' - | 'import' - | 'infrastructure' - | 'issue-tracking' - | 'log-management' - | 'messaging' - | 'migration' - | 'monitoring' - | 'synced-segments' - | 'notifications' + | "analytics" + | "approval" + | "authentication" + | "automation" + | "big-segment-store" + | "code-references" + | "customer-support" + | "data" + | "developer-tools" + | "import" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "migration" + | "monitoring" + | "synced-segments" + | "notifications" ] | [ ( - | 'analytics' - | 'approval' - | 'authentication' - | 'automation' - | 'big-segment-store' - | 'code-references' - | 'customer-support' - | 'data' - | 'developer-tools' - | 'import' - | 'infrastructure' - | 'issue-tracking' - | 'log-management' - | 'messaging' - | 'migration' - | 'monitoring' - | 'synced-segments' - | 'notifications' + | "analytics" + | "approval" + | "authentication" + | "automation" + | "big-segment-store" + | "code-references" + | "customer-support" + | "data" + | "developer-tools" + | "import" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "migration" + | "monitoring" + | "synced-segments" + | "notifications" ), ( - | 'analytics' - | 'approval' - | 'authentication' - | 'automation' - | 'big-segment-store' - | 'code-references' - | 'customer-support' - | 'data' - | 'developer-tools' - | 'import' - | 'infrastructure' - | 'issue-tracking' - | 'log-management' - | 'messaging' - | 'migration' - | 'monitoring' - | 'synced-segments' - | 'notifications' + | "analytics" + | "approval" + | "authentication" + | "automation" + | "big-segment-store" + | "code-references" + | "customer-support" + | "data" + | "developer-tools" + | "import" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "migration" + | "monitoring" + | "synced-segments" + | "notifications" ) ] | [ ( - | 'analytics' - | 'approval' - | 'authentication' - | 'automation' - | 'big-segment-store' - | 'code-references' - | 'customer-support' - | 'data' - | 'developer-tools' - | 'import' - | 'infrastructure' - | 'issue-tracking' - | 'log-management' - | 'messaging' - | 'migration' - | 'monitoring' - | 'synced-segments' - | 'notifications' + | "analytics" + | "approval" + | "authentication" + | "automation" + | "big-segment-store" + | "code-references" + | "customer-support" + | "data" + | "developer-tools" + | "import" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "migration" + | "monitoring" + | "synced-segments" + | "notifications" ), ( - | 'analytics' - | 'approval' - | 'authentication' - | 'automation' - | 'big-segment-store' - | 'code-references' - | 'customer-support' - | 'data' - | 'developer-tools' - | 'import' - | 'infrastructure' - | 'issue-tracking' - | 'log-management' - | 'messaging' - | 'migration' - | 'monitoring' - | 'synced-segments' - | 'notifications' + | "analytics" + | "approval" + | "authentication" + | "automation" + | "big-segment-store" + | "code-references" + | "customer-support" + | "data" + | "developer-tools" + | "import" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "migration" + | "monitoring" + | "synced-segments" + | "notifications" ), ( - | 'analytics' - | 'approval' - | 'authentication' - | 'automation' - | 'big-segment-store' - | 'code-references' - | 'customer-support' - | 'data' - | 'developer-tools' - | 'import' - | 'infrastructure' - | 'issue-tracking' - | 'log-management' - | 'messaging' - | 'migration' - | 'monitoring' - | 'synced-segments' - | 'notifications' + | "analytics" + | "approval" + | "authentication" + | "automation" + | "big-segment-store" + | "code-references" + | "customer-support" + | "data" + | "developer-tools" + | "import" + | "infrastructure" + | "issue-tracking" + | "log-management" + | "messaging" + | "migration" + | "monitoring" + | "synced-segments" + | "notifications" ) ]; /** @@ -188,34 +188,13 @@ export type HorizontalLogo = string; /** * Kind of legacy integration */ -export type Kind = - | 'codeRefs' - | 'datadog' - | 'dataExport' - | 'slackWebhooks' - | 'webhooks'; +export type Kind = "codeRefs" | "datadog" | "dataExport" | "slackWebhooks" | "webhooks"; /** * Capabilities not configured by manifests */ export type OtherCapabilities = [ - ( - | 'codeRefs' - | 'dataExport' - | 'external' - | 'ide' - | 'sso' - | 'webhooks' - | 'nativeExperimentation' - ), - ...( - | 'codeRefs' - | 'dataExport' - | 'external' - | 'ide' - | 'sso' - | 'webhooks' - | 'nativeExperimentation' - )[] + "codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks" | "nativeExperimentation", + ...("codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks" | "nativeExperimentation")[] ]; /** * Whether the integration authenticates using OAuth @@ -237,15 +216,15 @@ export type Name = string; * The type of the variable */ export type Type = - | 'string' - | 'boolean' - | 'uri' - | 'enum' - | 'oauth' - | 'dynamicEnum' - | 'generated' - | 'environmentSelector' - | 'multiselect'; + | "string" + | "boolean" + | "uri" + | "enum" + | "oauth" + | "dynamicEnum" + | "generated" + | "environmentSelector" + | "multiselect"; /** * Describes the variable in the UI. Markdown links allowed. */ @@ -285,7 +264,7 @@ export type URL = string; /** * HTTP method to use when LaunchDarkly makes the request to your endpoint */ -export type HTTPMethod = 'POST' | 'PUT' | 'PATCH' | 'GET' | 'DELETE'; +export type HTTPMethod = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; /** * Name of the header */ @@ -325,27 +304,24 @@ export type VariableKey = string; /** * Which form variable type is the variable key defined or located in? */ -export type VariableLocation = - | 'approvalFormVariables' - | 'environmentFormVariables' - | 'formVariables'; +export type VariableLocation = "approvalFormVariables" | "environmentFormVariables" | "formVariables"; /** * Action to be taken when your defined conditions evaluates to true */ -export type Action = 'hideField' | 'showField'; +export type Action = "hideField" | "showField"; /** * Name of the operator for evaluating a condition. */ export type Operator = - | 'lessThan' - | 'lessThanOrEqualTo' - | 'greaterThan' - | 'greaterThanOrEqualTo' - | 'equalTo' - | 'notEqual' - | 'contains' - | 'startsWith' - | 'endsWith'; + | "lessThan" + | "lessThanOrEqualTo" + | "greaterThan" + | "greaterThanOrEqualTo" + | "equalTo" + | "notEqual" + | "contains" + | "startsWith" + | "endsWith"; /** * Target value that conditions are evaluated against */ @@ -389,6 +365,34 @@ export type HideValueInUIWhenEmpty = boolean; * Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`. */ export type FormVariables = FormVariable[]; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL1 = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod1 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +/** + * Name of the header + */ +export type Name2 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value4 = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders1 = HeaderItems1[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName1 = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey1 = string; /** * Template to use for flag events */ @@ -424,7 +428,7 @@ export type Actions = string[]; /** * This attribute defines whether the statement allows or denies access to the named resources and actions. */ -export type Effect = 'allow' | 'deny'; +export type Effect = "allow" | "deny"; /** * A list of action specifiers defining the actions to which the statement does not apply. See https://docs.launchdarkly.com/home/members/role-actions for more information. */ @@ -444,7 +448,7 @@ export type IncludeErrorResponseBody = boolean; /** * Describes how the audit log event will be delivered to the destination. Custom delivery method indicates a custom delivery implementation in LaunchDarkly will be used. */ -export type DeliveryMethod = 'custom'; +export type DeliveryMethod = "custom"; /** * Whether to send the standard audit log webhook payload or to use defined JSON templates */ @@ -452,7 +456,7 @@ export type UseStandardWebhookPayload = boolean; /** * The reserved custom property's display name. */ -export type Name2 = string; +export type Name3 = string; /** * The custom property's API response key. */ @@ -465,7 +469,7 @@ export type Description2 = string; * This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/connecting/custom-properties for more information on custom properties */ export type ReservedCustomProperties = { - name: Name2; + name: Name3; key: Key1; description?: Description2; [k: string]: unknown; @@ -477,7 +481,7 @@ export type DocumentationLink = string; /** * Authentication type - currently the only option is sharedSecret. */ -export type Authentication = 'sharedSecret'; +export type Authentication = "sharedSecret"; /** * The default event name string used in the audit log if an eventName cannot be parsed in the trigger request body. */ @@ -503,302 +507,1103 @@ export type URLPointer = string; */ export type ApprovalSystemName = string; /** - * Environment-specific form variables that render on the environment approval settings modal + * A key will be used as the token name when the variable is substituted */ -export type EnvironmentFormVariables = FormVariable[]; +export type Key2 = string; /** - * Approval-specific form variables that render on the approval request creation modal + * A descriptive name that will be used as the form label on the UI */ -export type ApprovalFormVariables = FormVariable[]; +export type Name4 = string; /** - * If true, the user can define additional approval form variable fields with which to populate the approval creation request + * The type of the variable */ -export type AllowAdditionalApprovalFormVariablesForCreationRequestModal = - boolean; +export type Type1 = + | "string" + | "boolean" + | "uri" + | "enum" + | "oauth" + | "dynamicEnum" + | "generated" + | "environmentSelector" + | "multiselect"; /** - * If true, the user can create integration configurations associated with this integration's approval capability. Requires formVariables to be defined + * Describes the variable in the UI. Markdown links allowed. */ -export type AllowUsersToConfigureIntegrationConfigurationsForApprovals = - boolean; +export type Description3 = string; /** - * Template string used to render the JSON request body + * Placeholder value to use in the form element if applicable */ -export type JSONBody = string; +export type Description4 = string; /** - * Externally-created approval entity ID + * Secret variables will be masked in the UI */ -export type ApprovalIDPointer = string; +export type IsThisVariableASecret1 = boolean; /** - * JSON pointer to a status value + * Variables marked as disabled after saving won't be editable after they are saved */ -export type StatusValuePointer = string; +export type DisableAfterSaving1 = boolean; /** - * JSON pointer to a human-readable status + * Variables marked as optional won't be required on the UI */ -export type StatusValueDisplayPointer = string; +export type IsThisVariableOptional1 = boolean; /** - * regex pattern used to determine if the approval should be considered 'approved' + * Variables marked as hidden won't be displayed on the UI */ -export type ApprovalMatcher = string; +export type HideVariableInTheUI1 = boolean; /** - * regex pattern used to determine if the approval should be considered 'rejected' + * Default value for variable. Can be overridden by the user in the UI */ -export type RejectionMatcher = string; +export type DefaultValue1 = boolean | string; /** - * expected format for the external creation request URL. Values can be substituted in using {{value}} + * Allowed string values for enum-type formVariables */ -export type URLTemplate = string; +export type AllowedValues1 = string[]; /** - * JSON path to the array containing integration member details + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. */ -export type MemberArrayPath = string; +export type URL2 = string; /** - * Relative JSON path to the email field in each member item in the array + * HTTP method to use when LaunchDarkly makes the request to your endpoint */ -export type Email = string; +export type HTTPMethod2 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; /** - * Relative JSON path to the integration member ID field in each member item in the array + * Name of the header */ -export type MemberID = string; +export type Name5 = string; /** - * Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store + * Value of the header. Form variables can be substituted in using {{variableName}} */ -export type ProviderFormVariables = FormVariable[]; -export type SuccessPointer = string; -export type ErrorsPointer = string; +export type Value5 = string; /** - * Optional prefix to wrap payload data with (used for some integrations) + * Headers to send with the webhook request */ -export type Prefix = string; +export type HTTPHeaders2 = HeaderItems2[]; /** - * Optional suffix to wrap payload data with (used for some integrations) + * The name of the HMAC signature header */ -export type Suffix = string; +export type HMACSignatureHeaderName2 = string; /** - * Sentence-cased title to show for all links for this integration + * The name of the form variable field that corresponds to the HMAC encryption secret */ -export type LinkGroupHeader = string; +export type HMACSecretFormVariableKey2 = string; /** - * Title of the message + * JSON path to the array containing options for parsing */ -export type Title = string; +export type OptionsArrayPath1 = string; /** - * Text or markup content describing how links can be created for this integration + * Relative JSON path to values for each item in the options array to be used as UI dropdown labels */ -export type LeadText = string; +export type Label2 = string; /** - * Data type for the metadata attribute + * Relative JSON path to values for each item in the options array to be used as dropdown values */ -export type Type1 = 'string' | 'uri'; +export type Value6 = string; /** - * Url of the image. Handlebars template notation can be used to reference metadata fields. + * Key for the form variable that this form field depends on */ -export type SourceUrl = string; +export type VariableKey1 = string; /** - * Indicates whether the image should be rendered as an icon + * Which form variable type is the variable key defined or located in? */ -export type IsIcon = boolean; +export type VariableLocation1 = "approvalFormVariables" | "environmentFormVariables" | "formVariables"; /** - * Indicates whether the image should be rendered as an avatar + * Action to be taken when your defined conditions evaluates to true */ -export type IsAvatar = boolean; +export type Action1 = "hideField" | "showField"; /** - * Template string used to render a visual block in LaunchDarkly UI to display a name + * Name of the operator for evaluating a condition. */ -export type Name3 = string; +export type Operator1 = + | "lessThan" + | "lessThanOrEqualTo" + | "greaterThan" + | "greaterThanOrEqualTo" + | "equalTo" + | "notEqual" + | "contains" + | "startsWith" + | "endsWith"; /** - * Text to be displayed for the element. The text can contain template variables + * Target value that conditions are evaluated against */ -export type Text = string; +export type Value7 = string; /** - * Indicates whether the element should be bolded + * Conditional configurations to be evaluated to decide whether an action should taken for the form field. */ -export type IsBold = boolean; +export type Conditions1 = { + operator: Operator1; + value: Value7; + [k: string]: unknown; +}[]; /** - * Indicates whether the element should be rendered as a timestamp + * Dependency configuration to control the state and visibility of the form field. */ -export type IsTimestamp = boolean; +export type DependsOn1 = { + variableKey: VariableKey1; + variableLocation: VariableLocation1; + action: Action1; + conditions: Conditions1; + [k: string]: unknown; +}[]; /** - * URL to be set for the element which also indicates the element should be rendered as a hyperlink + * Label of the multi select option */ -export type Url = string; +export type Label3 = string; /** - * An array of elements to be combined to create a title block + * Value of the multi select option */ -export type Elements = UIBlockElement[]; +export type Value8 = string; +export type OptionsArray3 = MultiSelectOptionItem1[]; /** - * Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI + * Default options to be selected when the multi select is first rendered */ -export type LinkToReference = boolean; +export type MultiSelectDefaultOptions1 = string[]; /** - * Markdown string used to render a visual block in LaunchDarkly UI to display a link description + * Variables marked as hideEmpty won't be shown in the UI if they are empty */ -export type Description3 = string; +export type HideValueInUIWhenEmpty1 = boolean; /** - * An array of elements to be combined to create a context block + * Environment-specific form variables that render on the environment approval settings modal */ -export type Elements1 = UIBlockElement[]; +export type EnvironmentFormVariables = FormVariable1[]; /** - * This capability will disable in-app editing for the integration + * A key will be used as the token name when the variable is substituted */ -export type HideConfiguration = boolean; +export type Key3 = string; /** - * This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. + * A descriptive name that will be used as the form label on the UI */ -export type ExternalConfigurationURL = string; +export type Name6 = string; /** - * URL to redirect to for external creation flow + * The type of the variable */ -export type CreateURL = string; +export type Type2 = + | "string" + | "boolean" + | "uri" + | "enum" + | "oauth" + | "dynamicEnum" + | "generated" + | "environmentSelector" + | "multiselect"; /** - * URL to redirect to for external edit flow + * Describes the variable in the UI. Markdown links allowed. */ -export type EditURL = string; +export type Description5 = string; /** - * JSON string to be returned as a response + * Placeholder value to use in the form element if applicable */ -export type ResponseBody = string; +export type Description6 = string; /** - * JSON pointer to the LaunchDarkly environment id + * Secret variables will be masked in the UI */ -export type EnvironmentIdPath = string; +export type IsThisVariableASecret2 = boolean; /** - * JSON pointer to the LaunchDarkly context kind + * Variables marked as disabled after saving won't be editable after they are saved */ -export type ContextKindPath = string; +export type DisableAfterSaving2 = boolean; /** - * JSON pointer to the cohort id + * Variables marked as optional won't be required on the UI */ -export type CohortIdPath = string; +export type IsThisVariableOptional2 = boolean; /** - * JSON pointer to the cohort name + * Variables marked as hidden won't be displayed on the UI */ -export type CohortNamePath = string; +export type HideVariableInTheUI2 = boolean; /** - * JSON pointer to the cohort URL path + * Default value for variable. Can be overridden by the user in the UI */ -export type CohortUrlPath = string; +export type DefaultValue2 = boolean | string; /** - * JSON pointer to the array containing members to be added or removed from the segment + * Allowed string values for enum-type formVariables */ -export type MemberArrayPath1 = string; +export type AllowedValues2 = string[]; /** - * JSON pointer to the array containing members to be added to the segment. Required if removeMemberArrayPath is specified + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. */ -export type AddMemberArrayPath = string; +export type URL3 = string; /** - * JSON pointer to the array containing members to be removed to the segment. Required if addMemberArrayPath is specified + * HTTP method to use when LaunchDarkly makes the request to your endpoint */ -export type RemoveMemberArrayPath = string; +export type HTTPMethod3 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; /** - * JSON pointer to the property that will be checked by the matcher property + * Name of the header */ -export type Path = string; +export type Name7 = string; /** - * Regex indicating the action to be taken for the members in the segment. If it matches the value of path property, the members of the incoming segment will be added otherwise they will be removed + * Value of the header. Form variables can be substituted in using {{variableName}} */ -export type Matcher = string; +export type Value9 = string; /** - * JSON pointer to the member id + * Headers to send with the webhook request */ -export type MemberIdPath = string; +export type HTTPHeaders3 = HeaderItems3[]; /** - * JSON pointer to the property in member array payload indicating whether the member should be added or removed + * The name of the HMAC signature header */ -export type BooleanMembershipPath = string; +export type HMACSignatureHeaderName3 = string; /** - * JSON pointer to the cohort name. Overrides the cohort name for a single member + * The name of the form variable field that corresponds to the HMAC encryption secret */ -export type CohortNamePath1 = string; +export type HMACSecretFormVariableKey3 = string; /** - * JSON pointer to the cohort id. Overrides the cohort id for a single member + * JSON path to the array containing options for parsing */ -export type CohortIdPath1 = string; +export type OptionsArrayPath2 = string; /** - * Describes what type of database LaunchDarkly will sync big segments to + * Relative JSON path to values for each item in the options array to be used as UI dropdown labels */ -export type DatabaseStyle = 'redis' | 'dynamoDB'; +export type Label4 = string; /** - * Template to use for imports from Split + * Relative JSON path to values for each item in the options array to be used as dropdown values */ -export type SplitTemplate = string; +export type Value10 = string; /** - * Template to use for imports from Split + * Key for the form variable that this form field depends on */ -export type SplitDetailsTemplate = string; +export type VariableKey2 = string; /** - * Template to use for imports from StatSig + * Which form variable type is the variable key defined or located in? */ -export type StatSigTemplate = string; +export type VariableLocation2 = "approvalFormVariables" | "environmentFormVariables" | "formVariables"; /** - * Whether errors received while importing should be displayed in the error log in LaunchDarkly UI + * Action to be taken when your defined conditions evaluates to true */ -export type IncludeErrorResponseBody1 = boolean; +export type Action2 = "hideField" | "showField"; /** - * Template to use for measuredRolloutRegressionDetected events + * Name of the operator for evaluating a condition. */ -export type MeasuredRolloutRegressionDetectedTemplate = string; +export type Operator2 = + | "lessThan" + | "lessThanOrEqualTo" + | "greaterThan" + | "greaterThanOrEqualTo" + | "equalTo" + | "notEqual" + | "contains" + | "startsWith" + | "endsWith"; /** - * Template to use for measuredRolloutReverted events + * Target value that conditions are evaluated against */ -export type MeasuredRolloutRevertedTemplate = string; +export type Value11 = string; /** - * Template to use for errorMonitoringNewIssueFound events + * Conditional configurations to be evaluated to decide whether an action should taken for the form field. */ -export type ErrorMonitoringNewIssueFoundTemplate = string; +export type Conditions2 = { + operator: Operator2; + value: Value11; + [k: string]: unknown; +}[]; /** - * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. + * Dependency configuration to control the state and visibility of the form field. */ -export type OAuthIntegrationKey = string; +export type DependsOn2 = { + variableKey: VariableKey2; + variableLocation: VariableLocation2; + action: Action2; + conditions: Conditions2; + [k: string]: unknown; +}[]; /** - * Whether the integration allows integration configurations. Will apply to all capabilities on the manifest. + * Label of the multi select option */ -export type AllowIntegrationConfigurations = boolean; - +export type Label5 = string; /** - * Describes the capabilities and intent of a LaunchDarkly integration + * Value of the multi select option */ -export interface LaunchDarklyIntegrationsManifest { - name: IntegrationName; - version: Version; - overview: ShortDescription; - description: LongDescription; - details?: LearnMoreDetails; - author: Author; - supportEmail: SupportEmail; - links: Links; - categories: Categories; - icons: Icons; - legacy?: Legacy; - otherCapabilities?: OtherCapabilities; - requiresOAuth?: RequiresOAuth; - hideOnIntegrationsPage?: HideOnIntegrationsPage; - formVariables?: FormVariables; - capabilities?: Capabilities; - oauthIntegrationKey?: OAuthIntegrationKey; - allowIntegrationConfigurations?: AllowIntegrationConfigurations; - [k: string]: unknown; -} +export type Value12 = string; +export type OptionsArray5 = MultiSelectOptionItem2[]; /** - * A set of reference links supporting your integration + * Default options to be selected when the multi select is first rendered */ -export interface Links { - site: Website; - launchdarklyDocs?: LaunchDarklyDocumentation; - privacyPolicy: PrivacyPolicy; - supportWebsite?: SupportWebsite; - [k: string]: unknown; -} +export type MultiSelectDefaultOptions2 = string[]; /** - * Logos describing your integration in SVG format + * Variables marked as hideEmpty won't be shown in the UI if they are empty */ -export interface Icons { - square: SquareLogo; - horizontal: HorizontalLogo; - [k: string]: unknown; -} +export type HideValueInUIWhenEmpty2 = boolean; /** - * Legacy integration + * Approval-specific form variables that render on the approval request creation modal + */ +export type ApprovalFormVariables = FormVariable2[]; +/** + * If true, the user can define additional approval form variable fields with which to populate the approval creation request + */ +export type AllowAdditionalApprovalFormVariablesForCreationRequestModal = boolean; +/** + * If true, the user can create integration configurations associated with this integration's approval capability. Requires formVariables to be defined + */ +export type AllowUsersToConfigureIntegrationConfigurationsForApprovals = boolean; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL4 = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod4 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +/** + * Name of the header + */ +export type Name8 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value13 = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders4 = HeaderItems4[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName4 = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey4 = string; +/** + * Template string used to render the JSON request body + */ +export type JSONBody = string; +/** + * Externally-created approval entity ID + */ +export type ApprovalIDPointer = string; +/** + * JSON pointer to a status value + */ +export type StatusValuePointer = string; +/** + * JSON pointer to a human-readable status + */ +export type StatusValueDisplayPointer = string; +/** + * regex pattern used to determine if the approval should be considered 'approved' + */ +export type ApprovalMatcher = string; +/** + * regex pattern used to determine if the approval should be considered 'rejected' + */ +export type RejectionMatcher = string; +/** + * expected format for the external creation request URL. Values can be substituted in using {{value}} + */ +export type URLTemplate = string; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL5 = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod5 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +/** + * Name of the header + */ +export type Name9 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value14 = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders5 = HeaderItems5[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName5 = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey5 = string; +/** + * Template string used to render the JSON request body + */ +export type JSONBody1 = string; +/** + * Externally-created approval entity ID + */ +export type ApprovalIDPointer1 = string; +/** + * JSON pointer to a status value + */ +export type StatusValuePointer1 = string; +/** + * JSON pointer to a human-readable status + */ +export type StatusValueDisplayPointer1 = string; +/** + * regex pattern used to determine if the approval should be considered 'approved' + */ +export type ApprovalMatcher1 = string; +/** + * regex pattern used to determine if the approval should be considered 'rejected' + */ +export type RejectionMatcher1 = string; +/** + * expected format for the external creation request URL. Values can be substituted in using {{value}} + */ +export type URLTemplate1 = string; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL6 = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod6 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +/** + * Name of the header + */ +export type Name10 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value15 = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders6 = HeaderItems6[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName6 = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey6 = string; +/** + * Template string used to render the JSON request body + */ +export type JSONBody2 = string; +/** + * Externally-created approval entity ID + */ +export type ApprovalIDPointer2 = string; +/** + * JSON pointer to a status value + */ +export type StatusValuePointer2 = string; +/** + * JSON pointer to a human-readable status + */ +export type StatusValueDisplayPointer2 = string; +/** + * regex pattern used to determine if the approval should be considered 'approved' + */ +export type ApprovalMatcher2 = string; +/** + * regex pattern used to determine if the approval should be considered 'rejected' + */ +export type RejectionMatcher2 = string; +/** + * expected format for the external creation request URL. Values can be substituted in using {{value}} + */ +export type URLTemplate2 = string; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL7 = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod7 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +/** + * Name of the header + */ +export type Name11 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value16 = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders7 = HeaderItems7[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName7 = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey7 = string; +/** + * Template string used to render the JSON request body + */ +export type JSONBody3 = string; +/** + * Externally-created approval entity ID + */ +export type ApprovalIDPointer3 = string; +/** + * JSON pointer to a status value + */ +export type StatusValuePointer3 = string; +/** + * JSON pointer to a human-readable status + */ +export type StatusValueDisplayPointer3 = string; +/** + * regex pattern used to determine if the approval should be considered 'approved' + */ +export type ApprovalMatcher3 = string; +/** + * regex pattern used to determine if the approval should be considered 'rejected' + */ +export type RejectionMatcher3 = string; +/** + * expected format for the external creation request URL. Values can be substituted in using {{value}} + */ +export type URLTemplate3 = string; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL8 = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod8 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +/** + * Name of the header + */ +export type Name12 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value17 = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders8 = HeaderItems8[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName8 = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey8 = string; +/** + * Template string used to render the JSON request body + */ +export type JSONBody4 = string; +/** + * JSON path to the array containing integration member details + */ +export type MemberArrayPath = string; +/** + * Relative JSON path to the email field in each member item in the array + */ +export type Email = string; +/** + * Relative JSON path to the integration member ID field in each member item in the array + */ +export type MemberID = string; +/** + * A key will be used as the token name when the variable is substituted + */ +export type Key4 = string; +/** + * A descriptive name that will be used as the form label on the UI + */ +export type Name13 = string; +/** + * The type of the variable + */ +export type Type3 = + | "string" + | "boolean" + | "uri" + | "enum" + | "oauth" + | "dynamicEnum" + | "generated" + | "environmentSelector" + | "multiselect"; +/** + * Describes the variable in the UI. Markdown links allowed. + */ +export type Description7 = string; +/** + * Placeholder value to use in the form element if applicable + */ +export type Description8 = string; +/** + * Secret variables will be masked in the UI + */ +export type IsThisVariableASecret3 = boolean; +/** + * Variables marked as disabled after saving won't be editable after they are saved + */ +export type DisableAfterSaving3 = boolean; +/** + * Variables marked as optional won't be required on the UI + */ +export type IsThisVariableOptional3 = boolean; +/** + * Variables marked as hidden won't be displayed on the UI + */ +export type HideVariableInTheUI3 = boolean; +/** + * Default value for variable. Can be overridden by the user in the UI + */ +export type DefaultValue3 = boolean | string; +/** + * Allowed string values for enum-type formVariables + */ +export type AllowedValues3 = string[]; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL9 = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod9 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +/** + * Name of the header + */ +export type Name14 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value18 = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders9 = HeaderItems9[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName9 = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey9 = string; +/** + * JSON path to the array containing options for parsing + */ +export type OptionsArrayPath3 = string; +/** + * Relative JSON path to values for each item in the options array to be used as UI dropdown labels + */ +export type Label6 = string; +/** + * Relative JSON path to values for each item in the options array to be used as dropdown values + */ +export type Value19 = string; +/** + * Key for the form variable that this form field depends on + */ +export type VariableKey3 = string; +/** + * Which form variable type is the variable key defined or located in? + */ +export type VariableLocation3 = "approvalFormVariables" | "environmentFormVariables" | "formVariables"; +/** + * Action to be taken when your defined conditions evaluates to true + */ +export type Action3 = "hideField" | "showField"; +/** + * Name of the operator for evaluating a condition. + */ +export type Operator3 = + | "lessThan" + | "lessThanOrEqualTo" + | "greaterThan" + | "greaterThanOrEqualTo" + | "equalTo" + | "notEqual" + | "contains" + | "startsWith" + | "endsWith"; +/** + * Target value that conditions are evaluated against + */ +export type Value20 = string; +/** + * Conditional configurations to be evaluated to decide whether an action should taken for the form field. + */ +export type Conditions3 = { + operator: Operator3; + value: Value20; + [k: string]: unknown; +}[]; +/** + * Dependency configuration to control the state and visibility of the form field. + */ +export type DependsOn3 = { + variableKey: VariableKey3; + variableLocation: VariableLocation3; + action: Action3; + conditions: Conditions3; + [k: string]: unknown; +}[]; +/** + * Label of the multi select option + */ +export type Label7 = string; +/** + * Value of the multi select option + */ +export type Value21 = string; +export type OptionsArray7 = MultiSelectOptionItem3[]; +/** + * Default options to be selected when the multi select is first rendered + */ +export type MultiSelectDefaultOptions3 = string[]; +/** + * Variables marked as hideEmpty won't be shown in the UI if they are empty + */ +export type HideValueInUIWhenEmpty3 = boolean; +/** + * Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store + */ +export type ProviderFormVariables = FormVariable3[]; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL10 = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod10 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +/** + * Name of the header + */ +export type Name15 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value22 = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders10 = HeaderItems10[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName10 = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey10 = string; +export type SuccessPointer = string; +export type ErrorsPointer = string; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL11 = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod11 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +/** + * Name of the header + */ +export type Name16 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value23 = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders11 = HeaderItems11[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName11 = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey11 = string; +/** + * Optional prefix to wrap payload data with (used for some integrations) + */ +export type Prefix = string; +/** + * Optional suffix to wrap payload data with (used for some integrations) + */ +export type Suffix = string; +/** + * Sentence-cased title to show for all links for this integration + */ +export type LinkGroupHeader = string; +/** + * Title of the message + */ +export type Title = string; +/** + * Text or markup content describing how links can be created for this integration + */ +export type LeadText = string; +/** + * Data type for the metadata attribute + */ +export type Type4 = "string" | "uri"; +/** + * Url of the image. Handlebars template notation can be used to reference metadata fields. + */ +export type SourceUrl = string; +/** + * Indicates whether the image should be rendered as an icon + */ +export type IsIcon = boolean; +/** + * Indicates whether the image should be rendered as an avatar + */ +export type IsAvatar = boolean; +/** + * Template string used to render a visual block in LaunchDarkly UI to display a name + */ +export type Name17 = string; +/** + * Text to be displayed for the element. The text can contain template variables + */ +export type Text = string; +/** + * Indicates whether the element should be bolded + */ +export type IsBold = boolean; +/** + * Indicates whether the element should be rendered as a timestamp + */ +export type IsTimestamp = boolean; +/** + * URL to be set for the element which also indicates the element should be rendered as a hyperlink + */ +export type Url = string; +/** + * An array of elements to be combined to create a title block + */ +export type Elements = UIBlockElement[]; +/** + * Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI + */ +export type LinkToReference = boolean; +/** + * Markdown string used to render a visual block in LaunchDarkly UI to display a link description + */ +export type Description9 = string; +/** + * Text to be displayed for the element. The text can contain template variables + */ +export type Text1 = string; +/** + * Indicates whether the element should be bolded + */ +export type IsBold1 = boolean; +/** + * Indicates whether the element should be rendered as a timestamp + */ +export type IsTimestamp1 = boolean; +/** + * URL to be set for the element which also indicates the element should be rendered as a hyperlink + */ +export type Url1 = string; +/** + * An array of elements to be combined to create a context block + */ +export type Elements1 = UIBlockElement1[]; +/** + * This capability will disable in-app editing for the integration + */ +export type HideConfiguration = boolean; +/** + * This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. + */ +export type ExternalConfigurationURL = string; +/** + * URL to redirect to for external creation flow + */ +export type CreateURL = string; +/** + * URL to redirect to for external edit flow + */ +export type EditURL = string; +/** + * JSON string to be returned as a response + */ +export type ResponseBody = string; +/** + * JSON pointer to the LaunchDarkly environment id + */ +export type EnvironmentIdPath = string; +/** + * JSON pointer to the LaunchDarkly context kind + */ +export type ContextKindPath = string; +/** + * JSON pointer to the cohort id + */ +export type CohortIdPath = string; +/** + * JSON pointer to the cohort name + */ +export type CohortNamePath = string; +/** + * JSON pointer to the cohort URL path + */ +export type CohortUrlPath = string; +/** + * JSON pointer to the array containing members to be added or removed from the segment + */ +export type MemberArrayPath1 = string; +/** + * JSON pointer to the array containing members to be added to the segment. Required if removeMemberArrayPath is specified + */ +export type AddMemberArrayPath = string; +/** + * JSON pointer to the array containing members to be removed to the segment. Required if addMemberArrayPath is specified + */ +export type RemoveMemberArrayPath = string; +/** + * JSON pointer to the property that will be checked by the matcher property + */ +export type Path = string; +/** + * Regex indicating the action to be taken for the members in the segment. If it matches the value of path property, the members of the incoming segment will be added otherwise they will be removed + */ +export type Matcher = string; +/** + * JSON pointer to the member id + */ +export type MemberIdPath = string; +/** + * JSON pointer to the property in member array payload indicating whether the member should be added or removed + */ +export type BooleanMembershipPath = string; +/** + * JSON pointer to the cohort name. Overrides the cohort name for a single member + */ +export type CohortNamePath1 = string; +/** + * JSON pointer to the cohort id. Overrides the cohort id for a single member + */ +export type CohortIdPath1 = string; +/** + * Describes what type of database LaunchDarkly will sync big segments to + */ +export type DatabaseStyle = "redis" | "dynamoDB"; +/** + * Template to use for imports from Split + */ +export type SplitTemplate = string; +/** + * Template to use for imports from Split + */ +export type SplitDetailsTemplate = string; +/** + * Template to use for imports from StatSig + */ +export type StatSigTemplate = string; +/** + * Whether errors received while importing should be displayed in the error log in LaunchDarkly UI + */ +export type IncludeErrorResponseBody1 = boolean; +/** + * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + */ +export type URL12 = string; +/** + * HTTP method to use when LaunchDarkly makes the request to your endpoint + */ +export type HTTPMethod12 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +/** + * Name of the header + */ +export type Name18 = string; +/** + * Value of the header. Form variables can be substituted in using {{variableName}} + */ +export type Value24 = string; +/** + * Headers to send with the webhook request + */ +export type HTTPHeaders12 = HeaderItems12[]; +/** + * The name of the HMAC signature header + */ +export type HMACSignatureHeaderName12 = string; +/** + * The name of the form variable field that corresponds to the HMAC encryption secret + */ +export type HMACSecretFormVariableKey12 = string; +/** + * Template to use for measuredRolloutRegressionDetected events + */ +export type MeasuredRolloutRegressionDetectedTemplate = string; +/** + * Template to use for measuredRolloutReverted events + */ +export type MeasuredRolloutRevertedTemplate = string; +/** + * Template to use for errorMonitoringNewIssueFound events + */ +export type ErrorMonitoringNewIssueFoundTemplate = string; +/** + * Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI + */ +export type IncludeErrorResponseBody2 = boolean; +/** + * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. + */ +export type OAuthIntegrationKey = string; +/** + * Whether the integration allows integration configurations. Will apply to all capabilities on the manifest. + */ +export type AllowIntegrationConfigurations = boolean; + +/** + * Describes the capabilities and intent of a LaunchDarkly integration + */ +export interface LaunchDarklyIntegrationsManifest { + name: IntegrationName; + version: Version; + overview: ShortDescription; + description: LongDescription; + details?: LearnMoreDetails; + author: Author; + supportEmail: SupportEmail; + links: Links; + categories: Categories; + icons: Icons; + legacy?: Legacy; + otherCapabilities?: OtherCapabilities; + requiresOAuth?: RequiresOAuth; + hideOnIntegrationsPage?: HideOnIntegrationsPage; + formVariables?: FormVariables; + capabilities?: Capabilities; + oauthIntegrationKey?: OAuthIntegrationKey; + allowIntegrationConfigurations?: AllowIntegrationConfigurations; + [k: string]: unknown; +} +/** + * A set of reference links supporting your integration + */ +export interface Links { + site: Website; + launchdarklyDocs?: LaunchDarklyDocumentation; + privacyPolicy: PrivacyPolicy; + supportWebsite?: SupportWebsite; + [k: string]: unknown; +} +/** + * Logos describing your integration in SVG format + */ +export interface Icons { + square: SquareLogo; + horizontal: HorizontalLogo; + [k: string]: unknown; +} +/** + * Legacy integration */ export interface Legacy { kind: Kind; @@ -827,207 +1632,553 @@ export interface FormVariable { [k: string]: unknown; } /** - * Parser and endpoint for handling dynamicEnum + * Parser and endpoint for handling dynamicEnum + */ +export interface DynamicOptions { + endpoint: Endpoint; + parser: DynamicOptionsParser; + [k: string]: unknown; +} +/** + * Properties that describe an HTTP request to an external endpoint + */ +export interface Endpoint { + url: URL; + method: HTTPMethod; + headers?: HTTPHeaders; + hmacSignature?: HMACSignature; + [k: string]: unknown; +} +/** + * A name and value pair to send as headers with the hook request + */ +export interface HeaderItems { + name: Name1; + value: Value; + [k: string]: unknown; +} +/** + * Whether or not and how to configure HMAC validation on outgoing webhooks + */ +export interface HMACSignature { + headerName?: HMACSignatureHeaderName; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey; + [k: string]: unknown; +} +/** + * Mapping of property names to location in JSON response + */ +export interface DynamicOptionsParser { + optionsPath: OptionsArrayPath; + optionsItems: OptionsArray; + [k: string]: unknown; +} +export interface OptionsArray { + label: Label; + value: Value1; + [k: string]: unknown; +} +/** + * A multi select option item + */ +export interface MultiSelectOptionItem { + label: Label1; + value: Value3; + [k: string]: unknown; +} +/** + * Specify which capabilities you'd like your integration to have + */ +export interface Capabilities { + auditLogEventsHook?: AuditLogEventsHook; + reservedCustomProperties?: ReservedCustomProperties; + trigger?: Trigger; + approval?: Approval; + featureStore?: FeatureStore; + flagLink?: FlagLink; + hideConfiguration?: HideConfiguration; + externalConfigurationURL?: ExternalConfigurationURL; + externalConfigurationPages?: ExternalConfigurationPages; + syncedSegment?: SyncedSegment; + bigSegmentStore?: BigSegmentStore; + flagImport?: FlagImport; + eventsHook?: EventsHook; + [k: string]: unknown; +} +/** + * This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint. + */ +export interface AuditLogEventsHook { + endpoint?: Endpoint1; + templates: WebhookBodyTemplate; + defaultPolicy?: DefaultPolicy; + includeErrorResponseBody?: IncludeErrorResponseBody; + deliveryMethod?: DeliveryMethod; + useStandardWebhookPayload?: UseStandardWebhookPayload; + [k: string]: unknown; +} +/** + * Properties that describe an HTTP request to an external endpoint + */ +export interface Endpoint1 { + url: URL1; + method: HTTPMethod1; + headers?: HTTPHeaders1; + hmacSignature?: HMACSignature1; + [k: string]: unknown; +} +/** + * A name and value pair to send as headers with the hook request + */ +export interface HeaderItems1 { + name: Name2; + value: Value4; + [k: string]: unknown; +} +/** + * Whether or not and how to configure HMAC validation on outgoing webhooks + */ +export interface HMACSignature1 { + headerName?: HMACSignatureHeaderName1; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey1; + [k: string]: unknown; +} +/** + * Templates to use for body of the webhook request + */ +export interface WebhookBodyTemplate { + flag?: FlagTemplate; + project?: ProjectTemplate; + environment?: EnvironmentTemplate; + default?: DefaultTemplate; + validation?: ValidationTemplate; + member?: MemberTemplate; + [k: string]: unknown; +} +/** + * A LaunchDarkly policy. See https://docs.launchdarkly.com/home/members/role-policies for more information. + */ +export interface Policy { + actions?: Actions; + effect?: Effect; + notActions?: NotActions; + notResources?: NotResources; + resources?: Resources; + [k: string]: unknown; +} +/** + * This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly + */ +export interface Trigger { + documentation: DocumentationLink; + auth?: Authentication; + defaultEventName?: DefaultEventName; + testEventNameRegexp?: TestEventNameRegex; + parser?: TriggerParser; + [k: string]: unknown; +} +/** + * Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer + */ +export interface TriggerParser { + eventName?: EventNamePointer; + value?: ValuePointer; + url?: URLPointer; + [k: string]: unknown; +} +/** + * This capability enables integration-driven flag change approvals + */ +export interface Approval { + name?: ApprovalSystemName; + environmentFormVariables?: EnvironmentFormVariables; + approvalFormVariables?: ApprovalFormVariables; + allowAdditionalApprovalFormVariables?: AllowAdditionalApprovalFormVariablesForCreationRequestModal; + allowApprovalIntegrationConfigurations?: AllowUsersToConfigureIntegrationConfigurationsForApprovals; + creationRequest: CreationRequest; + statusRequest: StatusRequest; + postApplyRequest: PostApplyRequest; + deletionRequest: DeletionRequest; + memberListRequest?: MemberListRequest; + [k: string]: unknown; +} +/** + * A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration. + */ +export interface FormVariable1 { + key: Key2; + name: Name4; + type: Type1; + description: Description3; + placeholder?: Description4; + isSecret?: IsThisVariableASecret1; + disableAfterSaving?: DisableAfterSaving1; + isOptional?: IsThisVariableOptional1; + isHidden?: HideVariableInTheUI1; + defaultValue?: DefaultValue1; + allowedValues?: AllowedValues1; + dynamicOptions?: DynamicOptions1; + dependsOn?: DependsOn1; + multiselectOptions?: OptionsArray3; + multiselectDefaultOptions?: MultiSelectDefaultOptions1; + hideEmpty?: HideValueInUIWhenEmpty1; + [k: string]: unknown; +} +/** + * Parser and endpoint for handling dynamicEnum + */ +export interface DynamicOptions1 { + endpoint: Endpoint2; + parser: DynamicOptionsParser1; + [k: string]: unknown; +} +/** + * Properties that describe an HTTP request to an external endpoint + */ +export interface Endpoint2 { + url: URL2; + method: HTTPMethod2; + headers?: HTTPHeaders2; + hmacSignature?: HMACSignature2; + [k: string]: unknown; +} +/** + * A name and value pair to send as headers with the hook request + */ +export interface HeaderItems2 { + name: Name5; + value: Value5; + [k: string]: unknown; +} +/** + * Whether or not and how to configure HMAC validation on outgoing webhooks + */ +export interface HMACSignature2 { + headerName?: HMACSignatureHeaderName2; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey2; + [k: string]: unknown; +} +/** + * Mapping of property names to location in JSON response + */ +export interface DynamicOptionsParser1 { + optionsPath: OptionsArrayPath1; + optionsItems: OptionsArray2; + [k: string]: unknown; +} +export interface OptionsArray2 { + label: Label2; + value: Value6; + [k: string]: unknown; +} +/** + * A multi select option item + */ +export interface MultiSelectOptionItem1 { + label: Label3; + value: Value8; + [k: string]: unknown; +} +/** + * A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration. + */ +export interface FormVariable2 { + key: Key3; + name: Name6; + type: Type2; + description: Description5; + placeholder?: Description6; + isSecret?: IsThisVariableASecret2; + disableAfterSaving?: DisableAfterSaving2; + isOptional?: IsThisVariableOptional2; + isHidden?: HideVariableInTheUI2; + defaultValue?: DefaultValue2; + allowedValues?: AllowedValues2; + dynamicOptions?: DynamicOptions2; + dependsOn?: DependsOn2; + multiselectOptions?: OptionsArray5; + multiselectDefaultOptions?: MultiSelectDefaultOptions2; + hideEmpty?: HideValueInUIWhenEmpty2; + [k: string]: unknown; +} +/** + * Parser and endpoint for handling dynamicEnum + */ +export interface DynamicOptions2 { + endpoint: Endpoint3; + parser: DynamicOptionsParser2; + [k: string]: unknown; +} +/** + * Properties that describe an HTTP request to an external endpoint + */ +export interface Endpoint3 { + url: URL3; + method: HTTPMethod3; + headers?: HTTPHeaders3; + hmacSignature?: HMACSignature3; + [k: string]: unknown; +} +/** + * A name and value pair to send as headers with the hook request + */ +export interface HeaderItems3 { + name: Name7; + value: Value9; + [k: string]: unknown; +} +/** + * Whether or not and how to configure HMAC validation on outgoing webhooks + */ +export interface HMACSignature3 { + headerName?: HMACSignatureHeaderName3; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey3; + [k: string]: unknown; +} +/** + * Mapping of property names to location in JSON response + */ +export interface DynamicOptionsParser2 { + optionsPath: OptionsArrayPath2; + optionsItems: OptionsArray4; + [k: string]: unknown; +} +export interface OptionsArray4 { + label: Label4; + value: Value10; + [k: string]: unknown; +} +/** + * A multi select option item + */ +export interface MultiSelectOptionItem2 { + label: Label5; + value: Value12; + [k: string]: unknown; +} +/** + * Describes the approval creation HTTP request and the parser used to process the JSON response */ -export interface DynamicOptions { - endpoint: Endpoint; - parser: DynamicOptionsParser; +export interface CreationRequest { + endpoint: Endpoint4; + jsonBody?: JSONBody; + parser?: ApprovalParser; [k: string]: unknown; } /** * Properties that describe an HTTP request to an external endpoint */ -export interface Endpoint { - url: URL; - method: HTTPMethod; - headers?: HTTPHeaders; - hmacSignature?: HMACSignature; +export interface Endpoint4 { + url: URL4; + method: HTTPMethod4; + headers?: HTTPHeaders4; + hmacSignature?: HMACSignature4; [k: string]: unknown; } /** * A name and value pair to send as headers with the hook request */ -export interface HeaderItems { - name: Name1; - value: Value; +export interface HeaderItems4 { + name: Name8; + value: Value13; [k: string]: unknown; } /** * Whether or not and how to configure HMAC validation on outgoing webhooks */ -export interface HMACSignature { - headerName?: HMACSignatureHeaderName; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey; +export interface HMACSignature4 { + headerName?: HMACSignatureHeaderName4; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey4; [k: string]: unknown; } /** - * Mapping of property names to location in JSON response + * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer */ -export interface DynamicOptionsParser { - optionsPath: OptionsArrayPath; - optionsItems: OptionsArray; +export interface ApprovalParser { + approvalId?: ApprovalIDPointer; + statusValue: StatusValuePointer; + statusDisplay?: StatusValueDisplayPointer; + approvalMatcher: ApprovalMatcher; + rejectionMatcher?: RejectionMatcher; + urlTemplate?: URLTemplate; [k: string]: unknown; } -export interface OptionsArray { - label: Label; - value: Value1; +/** + * Describes the approval status check HTTP request and the parser used to determine if the approval should be consider approved or rejected + */ +export interface StatusRequest { + endpoint: Endpoint5; + jsonBody?: JSONBody1; + parser: ApprovalParser1; [k: string]: unknown; } /** - * A multi select option item + * Properties that describe an HTTP request to an external endpoint */ -export interface MultiSelectOptionItem { - label: Label1; - value: Value3; +export interface Endpoint5 { + url: URL5; + method: HTTPMethod5; + headers?: HTTPHeaders5; + hmacSignature?: HMACSignature5; [k: string]: unknown; } /** - * Specify which capabilities you'd like your integration to have + * A name and value pair to send as headers with the hook request */ -export interface Capabilities { - auditLogEventsHook?: AuditLogEventsHook; - reservedCustomProperties?: ReservedCustomProperties; - trigger?: Trigger; - approval?: Approval; - featureStore?: FeatureStore; - flagLink?: FlagLink; - hideConfiguration?: HideConfiguration; - externalConfigurationURL?: ExternalConfigurationURL; - externalConfigurationPages?: ExternalConfigurationPages; - syncedSegment?: SyncedSegment; - bigSegmentStore?: BigSegmentStore; - flagImport?: FlagImport; - eventsHook?: EventsHook; +export interface HeaderItems5 { + name: Name9; + value: Value14; [k: string]: unknown; } /** - * This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint. + * Whether or not and how to configure HMAC validation on outgoing webhooks */ -export interface AuditLogEventsHook { - endpoint?: Endpoint; - templates: WebhookBodyTemplate; - defaultPolicy?: DefaultPolicy; - includeErrorResponseBody?: IncludeErrorResponseBody; - deliveryMethod?: DeliveryMethod; - useStandardWebhookPayload?: UseStandardWebhookPayload; +export interface HMACSignature5 { + headerName?: HMACSignatureHeaderName5; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey5; [k: string]: unknown; } /** - * Templates to use for body of the webhook request + * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer */ -export interface WebhookBodyTemplate { - flag?: FlagTemplate; - project?: ProjectTemplate; - environment?: EnvironmentTemplate; - default?: DefaultTemplate; - validation?: ValidationTemplate; - member?: MemberTemplate; +export interface ApprovalParser1 { + approvalId?: ApprovalIDPointer1; + statusValue: StatusValuePointer1; + statusDisplay?: StatusValueDisplayPointer1; + approvalMatcher: ApprovalMatcher1; + rejectionMatcher?: RejectionMatcher1; + urlTemplate?: URLTemplate1; [k: string]: unknown; } /** - * A LaunchDarkly policy. See https://docs.launchdarkly.com/home/members/role-policies for more information. + * Describes the HTTP request to make after the changes have been applied in LaunchDarkly */ -export interface Policy { - actions?: Actions; - effect?: Effect; - notActions?: NotActions; - notResources?: NotResources; - resources?: Resources; +export interface PostApplyRequest { + endpoint: Endpoint6; + jsonBody?: JSONBody2; + parser: ApprovalParser2; [k: string]: unknown; } /** - * This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly + * Properties that describe an HTTP request to an external endpoint */ -export interface Trigger { - documentation: DocumentationLink; - auth?: Authentication; - defaultEventName?: DefaultEventName; - testEventNameRegexp?: TestEventNameRegex; - parser?: TriggerParser; +export interface Endpoint6 { + url: URL6; + method: HTTPMethod6; + headers?: HTTPHeaders6; + hmacSignature?: HMACSignature6; [k: string]: unknown; } /** - * Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer + * A name and value pair to send as headers with the hook request */ -export interface TriggerParser { - eventName?: EventNamePointer; - value?: ValuePointer; - url?: URLPointer; +export interface HeaderItems6 { + name: Name10; + value: Value15; [k: string]: unknown; } /** - * This capability enables integration-driven flag change approvals + * Whether or not and how to configure HMAC validation on outgoing webhooks */ -export interface Approval { - name?: ApprovalSystemName; - environmentFormVariables?: EnvironmentFormVariables; - approvalFormVariables?: ApprovalFormVariables; - allowAdditionalApprovalFormVariables?: AllowAdditionalApprovalFormVariablesForCreationRequestModal; - allowApprovalIntegrationConfigurations?: AllowUsersToConfigureIntegrationConfigurationsForApprovals; - creationRequest: CreationRequest; - statusRequest: StatusRequest; - postApplyRequest: PostApplyRequest; - deletionRequest: DeletionRequest; - memberListRequest?: MemberListRequest; +export interface HMACSignature6 { + headerName?: HMACSignatureHeaderName6; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey6; [k: string]: unknown; } /** - * Describes the approval creation HTTP request and the parser used to process the JSON response + * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer */ -export interface CreationRequest { - endpoint: Endpoint; - jsonBody?: JSONBody; - parser?: ApprovalParser; +export interface ApprovalParser2 { + approvalId?: ApprovalIDPointer2; + statusValue: StatusValuePointer2; + statusDisplay?: StatusValueDisplayPointer2; + approvalMatcher: ApprovalMatcher2; + rejectionMatcher?: RejectionMatcher2; + urlTemplate?: URLTemplate2; [k: string]: unknown; } /** - * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer + * Describes the HTTP request for the deletion of the external approval entity */ -export interface ApprovalParser { - approvalId?: ApprovalIDPointer; - statusValue: StatusValuePointer; - statusDisplay?: StatusValueDisplayPointer; - approvalMatcher: ApprovalMatcher; - rejectionMatcher?: RejectionMatcher; - urlTemplate?: URLTemplate; +export interface DeletionRequest { + endpoint: Endpoint7; + jsonBody?: JSONBody3; + parser: ApprovalParser3; [k: string]: unknown; } /** - * Describes the approval status check HTTP request and the parser used to determine if the approval should be consider approved or rejected + * Properties that describe an HTTP request to an external endpoint */ -export interface StatusRequest { - endpoint: Endpoint; - jsonBody?: JSONBody; - parser: ApprovalParser; +export interface Endpoint7 { + url: URL7; + method: HTTPMethod7; + headers?: HTTPHeaders7; + hmacSignature?: HMACSignature7; [k: string]: unknown; } /** - * Describes the HTTP request to make after the changes have been applied in LaunchDarkly + * A name and value pair to send as headers with the hook request */ -export interface PostApplyRequest { - endpoint: Endpoint; - jsonBody?: JSONBody; - parser: ApprovalParser; +export interface HeaderItems7 { + name: Name11; + value: Value16; [k: string]: unknown; } /** - * Describes the HTTP request for the deletion of the external approval entity + * Whether or not and how to configure HMAC validation on outgoing webhooks */ -export interface DeletionRequest { - endpoint: Endpoint; - jsonBody?: JSONBody; - parser: ApprovalParser; +export interface HMACSignature7 { + headerName?: HMACSignatureHeaderName7; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey7; + [k: string]: unknown; +} +/** + * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer + */ +export interface ApprovalParser3 { + approvalId?: ApprovalIDPointer3; + statusValue: StatusValuePointer3; + statusDisplay?: StatusValueDisplayPointer3; + approvalMatcher: ApprovalMatcher3; + rejectionMatcher?: RejectionMatcher3; + urlTemplate?: URLTemplate3; [k: string]: unknown; } /** * Describes the HTTP request to get integration users for mapping to Launchdarkly users */ export interface MemberListRequest { - endpoint: Endpoint; - jsonBody?: JSONBody; + endpoint: Endpoint8; + jsonBody?: JSONBody4; parser: MemberListParser; [k: string]: unknown; } +/** + * Properties that describe an HTTP request to an external endpoint + */ +export interface Endpoint8 { + url: URL8; + method: HTTPMethod8; + headers?: HTTPHeaders8; + hmacSignature?: HMACSignature8; + [k: string]: unknown; +} +/** + * A name and value pair to send as headers with the hook request + */ +export interface HeaderItems8 { + name: Name12; + value: Value17; + [k: string]: unknown; +} +/** + * Whether or not and how to configure HMAC validation on outgoing webhooks + */ +export interface HMACSignature8 { + headerName?: HMACSignatureHeaderName8; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey8; + [k: string]: unknown; +} /** * Describes a mapping of integration member information to a location in the JSON response payload specified by a JSON pointer */ @@ -1050,14 +2201,117 @@ export interface FeatureStore { featureStoreRequest: FeatureStoreRequest; [k: string]: unknown; } +/** + * A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration. + */ +export interface FormVariable3 { + key: Key4; + name: Name13; + type: Type3; + description: Description7; + placeholder?: Description8; + isSecret?: IsThisVariableASecret3; + disableAfterSaving?: DisableAfterSaving3; + isOptional?: IsThisVariableOptional3; + isHidden?: HideVariableInTheUI3; + defaultValue?: DefaultValue3; + allowedValues?: AllowedValues3; + dynamicOptions?: DynamicOptions3; + dependsOn?: DependsOn3; + multiselectOptions?: OptionsArray7; + multiselectDefaultOptions?: MultiSelectDefaultOptions3; + hideEmpty?: HideValueInUIWhenEmpty3; + [k: string]: unknown; +} +/** + * Parser and endpoint for handling dynamicEnum + */ +export interface DynamicOptions3 { + endpoint: Endpoint9; + parser: DynamicOptionsParser3; + [k: string]: unknown; +} +/** + * Properties that describe an HTTP request to an external endpoint + */ +export interface Endpoint9 { + url: URL9; + method: HTTPMethod9; + headers?: HTTPHeaders9; + hmacSignature?: HMACSignature9; + [k: string]: unknown; +} +/** + * A name and value pair to send as headers with the hook request + */ +export interface HeaderItems9 { + name: Name14; + value: Value18; + [k: string]: unknown; +} +/** + * Whether or not and how to configure HMAC validation on outgoing webhooks + */ +export interface HMACSignature9 { + headerName?: HMACSignatureHeaderName9; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey9; + [k: string]: unknown; +} +/** + * Mapping of property names to location in JSON response + */ +export interface DynamicOptionsParser3 { + optionsPath: OptionsArrayPath3; + optionsItems: OptionsArray6; + [k: string]: unknown; +} +export interface OptionsArray6 { + label: Label6; + value: Value19; + [k: string]: unknown; +} +/** + * A multi select option item + */ +export interface MultiSelectOptionItem3 { + label: Label7; + value: Value21; + [k: string]: unknown; +} /** * Details needed to make a request to test that the provided form variables are valid */ export interface ValidationRequest { - endpoint: Endpoint; + endpoint: Endpoint10; parser: FeatureStoreValidationParser; [k: string]: unknown; } +/** + * Properties that describe an HTTP request to an external endpoint + */ +export interface Endpoint10 { + url: URL10; + method: HTTPMethod10; + headers?: HTTPHeaders10; + hmacSignature?: HMACSignature10; + [k: string]: unknown; +} +/** + * A name and value pair to send as headers with the hook request + */ +export interface HeaderItems10 { + name: Name15; + value: Value22; + [k: string]: unknown; +} +/** + * Whether or not and how to configure HMAC validation on outgoing webhooks + */ +export interface HMACSignature10 { + headerName?: HMACSignatureHeaderName10; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey10; + [k: string]: unknown; +} /** * Mapping to success/errors value(s) in a JSON response body */ @@ -1070,11 +2324,37 @@ export interface FeatureStoreValidationParser { * Details needed to make a request to deliver the flag payload to the feature store */ export interface FeatureStoreRequest { - endpoint: Endpoint; + endpoint: Endpoint11; payloadPrefix?: Prefix; payloadSuffix?: Suffix; [k: string]: unknown; } +/** + * Properties that describe an HTTP request to an external endpoint + */ +export interface Endpoint11 { + url: URL11; + method: HTTPMethod11; + headers?: HTTPHeaders11; + hmacSignature?: HMACSignature11; + [k: string]: unknown; +} +/** + * A name and value pair to send as headers with the hook request + */ +export interface HeaderItems11 { + name: Name16; + value: Value23; + [k: string]: unknown; +} +/** + * Whether or not and how to configure HMAC validation on outgoing webhooks + */ +export interface HMACSignature11 { + headerName?: HMACSignatureHeaderName11; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey11; + [k: string]: unknown; +} /** * This capability is used to manage inbound flag links */ @@ -1098,7 +2378,7 @@ export interface EmptyState { */ export interface FlagLinkMetadata { [k: string]: { - type: Type1; + type: Type4; [k: string]: unknown; }; } @@ -1107,9 +2387,9 @@ export interface FlagLinkMetadata { */ export interface UIBlocks { image?: Image; - name?: Name3; + name?: Name17; title?: Title1; - description?: Description3; + description?: Description9; context?: FlagLinkContext; [k: string]: unknown; } @@ -1147,6 +2427,16 @@ export interface FlagLinkContext { elements: Elements1; [k: string]: unknown; } +/** + * A sub component of a UI block that can be combined with other elements to form a UI block + */ +export interface UIBlockElement1 { + text: Text1; + isBold?: IsBold1; + isTimestamp?: IsTimestamp1; + url?: Url1; + [k: string]: unknown; +} /** * This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. It supports different URLs for create and edit. */ @@ -1225,9 +2515,35 @@ export interface FlagImportBodyTemplate { * This capability will enable LaunchDarkly to send webhooks to your endpoint when particular events are observed. */ export interface EventsHook { - endpoint: Endpoint; + endpoint: Endpoint12; templates: EDAEventsWebhookBodyTemplate; - includeErrorResponseBody?: IncludeErrorResponseBody; + includeErrorResponseBody?: IncludeErrorResponseBody2; + [k: string]: unknown; +} +/** + * Properties that describe an HTTP request to an external endpoint + */ +export interface Endpoint12 { + url: URL12; + method: HTTPMethod12; + headers?: HTTPHeaders12; + hmacSignature?: HMACSignature12; + [k: string]: unknown; +} +/** + * A name and value pair to send as headers with the hook request + */ +export interface HeaderItems12 { + name: Name18; + value: Value24; + [k: string]: unknown; +} +/** + * Whether or not and how to configure HMAC validation on outgoing webhooks + */ +export interface HMACSignature12 { + headerName?: HMACSignatureHeaderName12; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey12; [k: string]: unknown; } /** From 8251fc4f63925be6f7da3c76fd8ae66141276b0f Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Mon, 25 Nov 2024 15:11:00 -0600 Subject: [PATCH 874/936] add hidden, secret, private key for validation reasons --- integrations/snowflake-experimentation/manifest.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index b29d3929..13ebb2f4 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -39,6 +39,14 @@ "description": "This is your public key description", "type": "generated", "hideEmpty": true + }, + { + "key": "privateKey", + "name": "Private key", + "description": "This is your private key description", + "type": "string", + "isHidden": true, + "isSecret": true } ] } From 4fbd3772e20c5b19f069f6044b97cc3ecf447858 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Wed, 27 Nov 2024 11:46:00 +0000 Subject: [PATCH 875/936] servicenow-c0: Add project key and name (#622) --- integrations/servicenow-c0/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 139c44e6..52ffc121 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -80,7 +80,7 @@ } ] }, - "jsonBody": "{ \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\\n\\nLaunchDarkly Approval Request: {{{_links.approval.href}}}\\nChange History: {{{_links.history.href}}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", + "jsonBody": "{ \"assignment_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_requesting_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"u_creating_group\": \"{{{customProperties.servicenowAssignmentGroup.values.[0]}}}\", \"opened_by\": \"{{{member.emailLocalPart}}}\", \"requested_by\": \"{{{member.emailLocalPart}}}\", \"assigned_to\": \"{{{member.emailLocalPart}}}\", \"description\": \"\\nBusiness Justification: Updating {{flag.name}} flag for {{customProperties.servicenowAppId.values.[0]}} Application.\\n\\nProject: {{{project.name}}} ({{project.key}})\\n{{{details.plainText}}}\\nRequested By: {{member.displayName}}\\nEmail Address: {{member.email}}\\n\\nLaunchDarkly Approval Request: {{{_links.approval.href}}}\\nChange History: {{{_links.history.href}}}\", \"short_description\": \"Updating Feature Flag for {{customProperties.servicenowAppId.values.[0]}}\", \"u_template\": \"{{environmentFormVariables.template}}\", \"start_date\": \"{{formatWithOffset timestamp.milliseconds 5 'simple'}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 300 'simple'}}\", \"u_uuid\": \"ld-{{timestamp.milliseconds}}\", \"approval\": \"Requested for Approval\", \"u_affected_ci\": \"{{{customProperties.servicenowAppId.values.[0]}}}\"}", "parser": { "approvalId": "/result/0/sys_id", "statusValue": "/result/0/status", From 814feddf469e83b948620f48e9c4d9d629d91986 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 28 Nov 2024 15:09:59 +0000 Subject: [PATCH 876/936] [IDE-722] Migrating from Circle to GHA (#623) * Start migrating from Circle to GHA * Run on every push * Try adding pre-commit * Move pre-commit-ci and try to break * Fix prettier * Give jobs names * Start adding upload job * Add upload job * fix permissions on upload job * Remove CircleCI * Remove CircleCI from README * refactor deploy workflow * Add workflow call * Make sure upload is successful before deployment * Remove main check * Name Build and Test Job * Only upload and deploy on main * trigger build --- .circleci/config.yml | 74 ------------------- .github/workflows/build_and_test.yml | 40 ++++++++++ .github/workflows/upload_and_deploy.yml | 41 ++++++++++ ....pre-commit-ci.yaml => .pre-commit-ci.yaml | 0 README.md | 2 - 5 files changed, 81 insertions(+), 76 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .github/workflows/build_and_test.yml create mode 100644 .github/workflows/upload_and_deploy.yml rename .circleci/.pre-commit-ci.yaml => .pre-commit-ci.yaml (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index f9fba611..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,74 +0,0 @@ -version: 2.1 - -orbs: - node: circleci/node@4.7.0 - aws-cli: circleci/aws-cli@3.1 - linter: thekevjames/linter@1.0.49 - -jobs: - build: - executor: - name: node/default - tag: '16.13' - steps: - - checkout - - node/install-packages - - run: - name: prettier - command: npm run prettier:check - - run: - name: Run tests - command: npm run test:ci - environment: - JEST_JUNIT_OUTPUT_DIR: ./reports/junit/ - when: always - - store_test_results: - path: ./reports/junit/ - - store_artifacts: - path: ./reports/junit - upload-to-s3: - executor: aws-cli/default - environment: - AWS_DEFAULT_REGION: us-east-1 - steps: - - checkout - - aws-cli/setup: - role-arn: arn:aws:iam::554582317989:role/circleci-integration-framework-private - - run: - name: Upload artifacts to s3 - command: | - if [ "$CIRCLE_REPOSITORY_URL" = "git@github.com:launchdarkly/integration-framework-private.git" ]; then - ./scripts/upload_artifacts_to_s3.sh - fi - send-webhook: - docker: - - image: cimg/base:2020.01 - steps: - - checkout - - run: - name: Send webhook - command: | - if [ "$CIRCLE_REPOSITORY_URL" = "git@github.com:launchdarkly/integration-framework-private.git" ]; then - ./scripts/send_webhook.sh - fi - -workflows: - build-and-deploy: - jobs: - - linter/pre-commit: - config_file: .circleci/.pre-commit-ci.yaml - - build - - upload-to-s3: - requires: - - build - context: org-global - filters: - branches: - only: main - - send-webhook: - requires: - - upload-to-s3 - context: org-global - filters: - branches: - only: main diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml new file mode 100644 index 00000000..88350d33 --- /dev/null +++ b/.github/workflows/build_and_test.yml @@ -0,0 +1,40 @@ +name: Build and test + +on: + pull_request: + workflow_call: + +jobs: + pre-commit: + name: Pre-commit + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1 + with: + extra_args: '-c .pre-commit-ci.yaml' + + build: + name: Build and test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + with: + node-version: 16 + - name: Install dependencies + run: npm ci + - name: Prettier + run: npm run prettier:check + - name: Run tests + run: npm run test:ci + env: + JEST_JUNIT_OUTPUT_DIR: ./reports/junit/ + - name: Build schema + run: npm run build + - name: Store test results + uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + if: always() + with: + name: test-results + path: ./reports/junit/ diff --git a/.github/workflows/upload_and_deploy.yml b/.github/workflows/upload_and_deploy.yml new file mode 100644 index 00000000..d8adf4e0 --- /dev/null +++ b/.github/workflows/upload_and_deploy.yml @@ -0,0 +1,41 @@ +name: Upload artifacts and trigger deployment + +on: + push: + branches: [main] + +jobs: + build-and-test: + name: Build and test + uses: ./.github/workflows/build_and_test.yml + + upload-to-s3: + name: Upload to S3 + runs-on: ubuntu-latest + needs: [build-and-test] + if: github.repository == 'launchdarkly/integration-framework-private' + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Assume AWS role + uses: launchdarkly/common-actions/aws-auth@1a4ed44fb65ee340cfe86234b79fc1bf606bfe25 + with: + role-session-name: 'UploadToS3' + iam-role-arn: 'arn:aws:iam::554582317989:role/github-actions-integration-framework-private' + - name: Upload artifacts to S3 + run: ./scripts/upload_artifacts_to_s3.sh + + trigger-deployment: + name: Trigger deployment + runs-on: ubuntu-latest + needs: [build-and-test, upload-to-s3] + if: github.repository == 'launchdarkly/integration-framework-private' + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Send webhook + run: ./scripts/send_webhook.sh + env: + WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }} + THUMB_SEEKER_TOKEN: ${{ secrets.THUMB_SEEKER_TOKEN }} diff --git a/.circleci/.pre-commit-ci.yaml b/.pre-commit-ci.yaml similarity index 100% rename from .circleci/.pre-commit-ci.yaml rename to .pre-commit-ci.yaml diff --git a/README.md b/README.md index 2760aebe..70cb6b38 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # LaunchDarkly Integration Framework -[![CircleCI](https://circleci.com/gh/launchdarkly/integration-framework.svg?style=svg&circle-token=9a44436c3b22e7fb6a22df1ad9a2455a0d6f2d34)](https://circleci.com/gh/launchdarkly/integration-framework) - Feature flags give you control over your deployment and rollout. They can also provide context to third-party tools that show you how your application reacts to flag changes. You can integrate these tools with LaunchDarkly using the LaunchDarkly integration framework. For additional background, read [Using the LaunchDarkly integration framework](https://docs.launchdarkly.com/integrations/building-integrations) in our LaunchDarkly product documentation. This repository contains LaunchDarkly integrations built by our community. Most of these integrations consume events from LaunchDarkly to provide the external tools with more context. From e84b934d3abfd9827b1510393be34ad4bc1f91cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2024 15:11:13 +0000 Subject: [PATCH 877/936] Bump semver and nodemon Bumps [semver](https://github.com/npm/node-semver) to 7.6.3 and updates ancestor dependency [nodemon](https://github.com/remy/nodemon). These dependencies need to be updated together. Updates `semver` from 7.0.0 to 7.6.3 - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v7.0.0...v7.6.3) Updates `nodemon` from 2.0.22 to 3.1.7 - [Release notes](https://github.com/remy/nodemon/releases) - [Commits](https://github.com/remy/nodemon/compare/v2.0.22...v3.1.7) --- updated-dependencies: - dependency-name: semver dependency-type: indirect - dependency-name: nodemon dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- package-lock.json | 158 ++++++++++------------------------------------ package.json | 2 +- 2 files changed, 34 insertions(+), 126 deletions(-) diff --git a/package-lock.json b/package-lock.json index 60dd1685..5d55402e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "json-schema-to-typescript": "^10.0.0", "jsonpointer": "^5.0.1", "lodash": "^4.17.21", - "nodemon": "^2.0.22", + "nodemon": "^3.1.7", "plop": "^3.1.1", "prettier": "^2.0.1", "rimraf": "^5.0.1", @@ -4020,18 +4020,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -4572,18 +4560,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -4954,18 +4930,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -5243,18 +5207,18 @@ "dev": true }, "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", "dev": true, "dependencies": { "chokidar": "^3.5.2", - "debug": "^3.2.7", + "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -5263,22 +5227,13 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8.10.0" + "node": ">=10" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nodemon" } }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/nodemon/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -6251,12 +6206,15 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/send": { @@ -6394,24 +6352,15 @@ "dev": true }, "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "dependencies": { - "semver": "~7.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/sisteransi": { @@ -10269,14 +10218,6 @@ "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } } }, "istanbul-lib-report": { @@ -10688,14 +10629,6 @@ "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } } }, "jest-util": { @@ -10989,14 +10922,6 @@ "dev": true, "requires": { "semver": "^7.5.3" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } } }, "make-error": { @@ -11222,32 +11147,23 @@ "dev": true }, "nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", "dev": true, "requires": { "chokidar": "^3.5.2", - "debug": "^3.2.7", + "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -11922,9 +11838,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true }, "send": { @@ -12042,20 +11958,12 @@ "dev": true }, "simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "requires": { - "semver": "~7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } + "semver": "^7.5.3" } }, "sisteransi": { diff --git a/package.json b/package.json index 67a04748..a8cd70d9 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "json-schema-to-typescript": "^10.0.0", "jsonpointer": "^5.0.1", "lodash": "^4.17.21", - "nodemon": "^2.0.22", + "nodemon": "^3.1.7", "plop": "^3.1.1", "prettier": "^2.0.1", "rimraf": "^5.0.1", From 550fffafe87a9de400487e35a0fc4ee7321b83d1 Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Mon, 2 Dec 2024 11:13:48 -0600 Subject: [PATCH 878/936] name change --- integrations/snowflake-experimentation/manifest.json | 2 +- manifest.schema.d.ts | 4 ++-- manifest.schema.json | 2 +- schemas/base.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 13ebb2f4..55b2bdd9 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -16,7 +16,7 @@ "square": "assets/images/square.svg", "horizontal": "assets/images/horizontal.svg" }, - "otherCapabilities": ["nativeExperimentation"], + "otherCapabilities": ["warehouseExperimentation"], "formVariables": [ { "key": "snowflakeHostAddress", diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index cc76b499..5032bfdb 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -193,8 +193,8 @@ export type Kind = "codeRefs" | "datadog" | "dataExport" | "slackWebhooks" | "we * Capabilities not configured by manifests */ export type OtherCapabilities = [ - "codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks" | "nativeExperimentation", - ...("codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks" | "nativeExperimentation")[] + "codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks" | "warehouseExperimentation", + ...("codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks" | "warehouseExperimentation")[] ]; /** * Whether the integration authenticates using OAuth diff --git a/manifest.schema.json b/manifest.schema.json index 6a65ce88..a34ee3db 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -252,7 +252,7 @@ "ide", "sso", "webhooks", - "nativeExperimentation" + "warehouseExperimentation" ] } }, diff --git a/schemas/base.json b/schemas/base.json index eae6132b..a01e3b0f 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -230,7 +230,7 @@ "ide", "sso", "webhooks", - "nativeExperimentation" + "warehouseExperimentation" ] } }, From 8dbbb5c4c7fc5341247b5da5fc96050cd729916d Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Mon, 2 Dec 2024 11:19:04 -0600 Subject: [PATCH 879/936] build --- manifest.schema.d.ts | 1960 +++++++----------------------------------- 1 file changed, 309 insertions(+), 1651 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 5032bfdb..04831029 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -365,34 +365,6 @@ export type HideValueInUIWhenEmpty = boolean; * Form variables will be rendered on the integration configuration page. These are variables you need an admin to supply when they enable the integration. Examples of a form variable include `apiToken` or `url`. */ export type FormVariables = FormVariable[]; -/** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - */ -export type URL1 = string; -/** - * HTTP method to use when LaunchDarkly makes the request to your endpoint - */ -export type HTTPMethod1 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; -/** - * Name of the header - */ -export type Name2 = string; -/** - * Value of the header. Form variables can be substituted in using {{variableName}} - */ -export type Value4 = string; -/** - * Headers to send with the webhook request - */ -export type HTTPHeaders1 = HeaderItems1[]; -/** - * The name of the HMAC signature header - */ -export type HMACSignatureHeaderName1 = string; -/** - * The name of the form variable field that corresponds to the HMAC encryption secret - */ -export type HMACSecretFormVariableKey1 = string; /** * Template to use for flag events */ @@ -456,7 +428,7 @@ export type UseStandardWebhookPayload = boolean; /** * The reserved custom property's display name. */ -export type Name3 = string; +export type Name2 = string; /** * The custom property's API response key. */ @@ -469,7 +441,7 @@ export type Description2 = string; * This capability will reserve integration-specific custom property options in the global flag setting configuration. These custom properties will only be presented to users after they have have configured an integration subscription. Read https://docs.launchdarkly.com/home/connecting/custom-properties for more information on custom properties */ export type ReservedCustomProperties = { - name: Name3; + name: Name2; key: Key1; description?: Description2; [k: string]: unknown; @@ -507,1676 +479,527 @@ export type URLPointer = string; */ export type ApprovalSystemName = string; /** - * A key will be used as the token name when the variable is substituted + * Environment-specific form variables that render on the environment approval settings modal */ -export type Key2 = string; +export type EnvironmentFormVariables = FormVariable[]; /** - * A descriptive name that will be used as the form label on the UI + * Approval-specific form variables that render on the approval request creation modal */ -export type Name4 = string; +export type ApprovalFormVariables = FormVariable[]; /** - * The type of the variable + * If true, the user can define additional approval form variable fields with which to populate the approval creation request */ -export type Type1 = - | "string" - | "boolean" - | "uri" - | "enum" - | "oauth" - | "dynamicEnum" - | "generated" - | "environmentSelector" - | "multiselect"; +export type AllowAdditionalApprovalFormVariablesForCreationRequestModal = boolean; /** - * Describes the variable in the UI. Markdown links allowed. + * If true, the user can create integration configurations associated with this integration's approval capability. Requires formVariables to be defined */ -export type Description3 = string; +export type AllowUsersToConfigureIntegrationConfigurationsForApprovals = boolean; /** - * Placeholder value to use in the form element if applicable + * Template string used to render the JSON request body */ -export type Description4 = string; +export type JSONBody = string; /** - * Secret variables will be masked in the UI + * Externally-created approval entity ID */ -export type IsThisVariableASecret1 = boolean; +export type ApprovalIDPointer = string; /** - * Variables marked as disabled after saving won't be editable after they are saved + * JSON pointer to a status value */ -export type DisableAfterSaving1 = boolean; +export type StatusValuePointer = string; /** - * Variables marked as optional won't be required on the UI + * JSON pointer to a human-readable status */ -export type IsThisVariableOptional1 = boolean; +export type StatusValueDisplayPointer = string; /** - * Variables marked as hidden won't be displayed on the UI + * regex pattern used to determine if the approval should be considered 'approved' */ -export type HideVariableInTheUI1 = boolean; +export type ApprovalMatcher = string; /** - * Default value for variable. Can be overridden by the user in the UI + * regex pattern used to determine if the approval should be considered 'rejected' */ -export type DefaultValue1 = boolean | string; +export type RejectionMatcher = string; /** - * Allowed string values for enum-type formVariables + * expected format for the external creation request URL. Values can be substituted in using {{value}} */ -export type AllowedValues1 = string[]; +export type URLTemplate = string; /** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + * JSON path to the array containing integration member details */ -export type URL2 = string; +export type MemberArrayPath = string; /** - * HTTP method to use when LaunchDarkly makes the request to your endpoint + * Relative JSON path to the email field in each member item in the array */ -export type HTTPMethod2 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +export type Email = string; /** - * Name of the header + * Relative JSON path to the integration member ID field in each member item in the array */ -export type Name5 = string; +export type MemberID = string; /** - * Value of the header. Form variables can be substituted in using {{variableName}} + * Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store */ -export type Value5 = string; +export type ProviderFormVariables = FormVariable[]; +export type SuccessPointer = string; +export type ErrorsPointer = string; /** - * Headers to send with the webhook request + * Optional prefix to wrap payload data with (used for some integrations) */ -export type HTTPHeaders2 = HeaderItems2[]; +export type Prefix = string; /** - * The name of the HMAC signature header + * Optional suffix to wrap payload data with (used for some integrations) */ -export type HMACSignatureHeaderName2 = string; +export type Suffix = string; /** - * The name of the form variable field that corresponds to the HMAC encryption secret + * Sentence-cased title to show for all links for this integration */ -export type HMACSecretFormVariableKey2 = string; +export type LinkGroupHeader = string; /** - * JSON path to the array containing options for parsing + * Title of the message */ -export type OptionsArrayPath1 = string; +export type Title = string; /** - * Relative JSON path to values for each item in the options array to be used as UI dropdown labels + * Text or markup content describing how links can be created for this integration */ -export type Label2 = string; +export type LeadText = string; /** - * Relative JSON path to values for each item in the options array to be used as dropdown values + * Data type for the metadata attribute */ -export type Value6 = string; +export type Type1 = "string" | "uri"; /** - * Key for the form variable that this form field depends on + * Url of the image. Handlebars template notation can be used to reference metadata fields. */ -export type VariableKey1 = string; +export type SourceUrl = string; /** - * Which form variable type is the variable key defined or located in? + * Indicates whether the image should be rendered as an icon */ -export type VariableLocation1 = "approvalFormVariables" | "environmentFormVariables" | "formVariables"; +export type IsIcon = boolean; /** - * Action to be taken when your defined conditions evaluates to true + * Indicates whether the image should be rendered as an avatar */ -export type Action1 = "hideField" | "showField"; +export type IsAvatar = boolean; /** - * Name of the operator for evaluating a condition. + * Template string used to render a visual block in LaunchDarkly UI to display a name */ -export type Operator1 = - | "lessThan" - | "lessThanOrEqualTo" - | "greaterThan" - | "greaterThanOrEqualTo" - | "equalTo" - | "notEqual" - | "contains" - | "startsWith" - | "endsWith"; +export type Name3 = string; /** - * Target value that conditions are evaluated against + * Text to be displayed for the element. The text can contain template variables */ -export type Value7 = string; +export type Text = string; /** - * Conditional configurations to be evaluated to decide whether an action should taken for the form field. + * Indicates whether the element should be bolded */ -export type Conditions1 = { - operator: Operator1; - value: Value7; - [k: string]: unknown; -}[]; +export type IsBold = boolean; /** - * Dependency configuration to control the state and visibility of the form field. + * Indicates whether the element should be rendered as a timestamp */ -export type DependsOn1 = { - variableKey: VariableKey1; - variableLocation: VariableLocation1; - action: Action1; - conditions: Conditions1; - [k: string]: unknown; -}[]; +export type IsTimestamp = boolean; /** - * Label of the multi select option + * URL to be set for the element which also indicates the element should be rendered as a hyperlink */ -export type Label3 = string; +export type Url = string; /** - * Value of the multi select option + * An array of elements to be combined to create a title block */ -export type Value8 = string; -export type OptionsArray3 = MultiSelectOptionItem1[]; +export type Elements = UIBlockElement[]; /** - * Default options to be selected when the multi select is first rendered + * Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI */ -export type MultiSelectDefaultOptions1 = string[]; +export type LinkToReference = boolean; /** - * Variables marked as hideEmpty won't be shown in the UI if they are empty + * Markdown string used to render a visual block in LaunchDarkly UI to display a link description */ -export type HideValueInUIWhenEmpty1 = boolean; +export type Description3 = string; /** - * Environment-specific form variables that render on the environment approval settings modal + * An array of elements to be combined to create a context block */ -export type EnvironmentFormVariables = FormVariable1[]; +export type Elements1 = UIBlockElement[]; /** - * A key will be used as the token name when the variable is substituted + * This capability will disable in-app editing for the integration */ -export type Key3 = string; +export type HideConfiguration = boolean; /** - * A descriptive name that will be used as the form label on the UI + * This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. */ -export type Name6 = string; +export type ExternalConfigurationURL = string; /** - * The type of the variable + * URL to redirect to for external creation flow */ -export type Type2 = - | "string" - | "boolean" - | "uri" - | "enum" - | "oauth" - | "dynamicEnum" - | "generated" - | "environmentSelector" - | "multiselect"; +export type CreateURL = string; /** - * Describes the variable in the UI. Markdown links allowed. + * URL to redirect to for external edit flow */ -export type Description5 = string; +export type EditURL = string; /** - * Placeholder value to use in the form element if applicable + * JSON string to be returned as a response */ -export type Description6 = string; +export type ResponseBody = string; /** - * Secret variables will be masked in the UI + * JSON pointer to the LaunchDarkly environment id */ -export type IsThisVariableASecret2 = boolean; +export type EnvironmentIdPath = string; /** - * Variables marked as disabled after saving won't be editable after they are saved + * JSON pointer to the LaunchDarkly context kind */ -export type DisableAfterSaving2 = boolean; +export type ContextKindPath = string; /** - * Variables marked as optional won't be required on the UI + * JSON pointer to the cohort id */ -export type IsThisVariableOptional2 = boolean; +export type CohortIdPath = string; /** - * Variables marked as hidden won't be displayed on the UI + * JSON pointer to the cohort name */ -export type HideVariableInTheUI2 = boolean; +export type CohortNamePath = string; /** - * Default value for variable. Can be overridden by the user in the UI + * JSON pointer to the cohort URL path */ -export type DefaultValue2 = boolean | string; +export type CohortUrlPath = string; /** - * Allowed string values for enum-type formVariables + * JSON pointer to the array containing members to be added or removed from the segment */ -export type AllowedValues2 = string[]; +export type MemberArrayPath1 = string; /** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. + * JSON pointer to the array containing members to be added to the segment. Required if removeMemberArrayPath is specified */ -export type URL3 = string; +export type AddMemberArrayPath = string; /** - * HTTP method to use when LaunchDarkly makes the request to your endpoint + * JSON pointer to the array containing members to be removed to the segment. Required if addMemberArrayPath is specified */ -export type HTTPMethod3 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; +export type RemoveMemberArrayPath = string; /** - * Name of the header + * JSON pointer to the property that will be checked by the matcher property */ -export type Name7 = string; +export type Path = string; /** - * Value of the header. Form variables can be substituted in using {{variableName}} + * Regex indicating the action to be taken for the members in the segment. If it matches the value of path property, the members of the incoming segment will be added otherwise they will be removed */ -export type Value9 = string; +export type Matcher = string; /** - * Headers to send with the webhook request + * JSON pointer to the member id */ -export type HTTPHeaders3 = HeaderItems3[]; +export type MemberIdPath = string; /** - * The name of the HMAC signature header + * JSON pointer to the property in member array payload indicating whether the member should be added or removed */ -export type HMACSignatureHeaderName3 = string; +export type BooleanMembershipPath = string; /** - * The name of the form variable field that corresponds to the HMAC encryption secret + * JSON pointer to the cohort name. Overrides the cohort name for a single member */ -export type HMACSecretFormVariableKey3 = string; +export type CohortNamePath1 = string; /** - * JSON path to the array containing options for parsing + * JSON pointer to the cohort id. Overrides the cohort id for a single member */ -export type OptionsArrayPath2 = string; +export type CohortIdPath1 = string; /** - * Relative JSON path to values for each item in the options array to be used as UI dropdown labels + * Describes what type of database LaunchDarkly will sync big segments to */ -export type Label4 = string; +export type DatabaseStyle = "redis" | "dynamoDB"; /** - * Relative JSON path to values for each item in the options array to be used as dropdown values + * Template to use for imports from Split */ -export type Value10 = string; +export type SplitTemplate = string; /** - * Key for the form variable that this form field depends on + * Template to use for imports from Split */ -export type VariableKey2 = string; +export type SplitDetailsTemplate = string; /** - * Which form variable type is the variable key defined or located in? + * Template to use for imports from StatSig */ -export type VariableLocation2 = "approvalFormVariables" | "environmentFormVariables" | "formVariables"; +export type StatSigTemplate = string; /** - * Action to be taken when your defined conditions evaluates to true + * Whether errors received while importing should be displayed in the error log in LaunchDarkly UI */ -export type Action2 = "hideField" | "showField"; +export type IncludeErrorResponseBody1 = boolean; /** - * Name of the operator for evaluating a condition. + * Template to use for measuredRolloutRegressionDetected events */ -export type Operator2 = - | "lessThan" - | "lessThanOrEqualTo" - | "greaterThan" - | "greaterThanOrEqualTo" - | "equalTo" - | "notEqual" - | "contains" - | "startsWith" - | "endsWith"; +export type MeasuredRolloutRegressionDetectedTemplate = string; /** - * Target value that conditions are evaluated against + * Template to use for measuredRolloutReverted events */ -export type Value11 = string; +export type MeasuredRolloutRevertedTemplate = string; /** - * Conditional configurations to be evaluated to decide whether an action should taken for the form field. + * Template to use for errorMonitoringNewIssueFound events */ -export type Conditions2 = { - operator: Operator2; - value: Value11; - [k: string]: unknown; -}[]; +export type ErrorMonitoringNewIssueFoundTemplate = string; /** - * Dependency configuration to control the state and visibility of the form field. + * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ -export type DependsOn2 = { - variableKey: VariableKey2; - variableLocation: VariableLocation2; - action: Action2; - conditions: Conditions2; - [k: string]: unknown; -}[]; +export type OAuthIntegrationKey = string; /** - * Label of the multi select option + * Whether the integration allows integration configurations. Will apply to all capabilities on the manifest. */ -export type Label5 = string; +export type AllowIntegrationConfigurations = boolean; + /** - * Value of the multi select option + * Describes the capabilities and intent of a LaunchDarkly integration */ -export type Value12 = string; -export type OptionsArray5 = MultiSelectOptionItem2[]; -/** - * Default options to be selected when the multi select is first rendered - */ -export type MultiSelectDefaultOptions2 = string[]; -/** - * Variables marked as hideEmpty won't be shown in the UI if they are empty - */ -export type HideValueInUIWhenEmpty2 = boolean; -/** - * Approval-specific form variables that render on the approval request creation modal - */ -export type ApprovalFormVariables = FormVariable2[]; -/** - * If true, the user can define additional approval form variable fields with which to populate the approval creation request - */ -export type AllowAdditionalApprovalFormVariablesForCreationRequestModal = boolean; -/** - * If true, the user can create integration configurations associated with this integration's approval capability. Requires formVariables to be defined - */ -export type AllowUsersToConfigureIntegrationConfigurationsForApprovals = boolean; -/** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - */ -export type URL4 = string; -/** - * HTTP method to use when LaunchDarkly makes the request to your endpoint - */ -export type HTTPMethod4 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; -/** - * Name of the header - */ -export type Name8 = string; -/** - * Value of the header. Form variables can be substituted in using {{variableName}} - */ -export type Value13 = string; -/** - * Headers to send with the webhook request - */ -export type HTTPHeaders4 = HeaderItems4[]; -/** - * The name of the HMAC signature header - */ -export type HMACSignatureHeaderName4 = string; -/** - * The name of the form variable field that corresponds to the HMAC encryption secret - */ -export type HMACSecretFormVariableKey4 = string; -/** - * Template string used to render the JSON request body - */ -export type JSONBody = string; -/** - * Externally-created approval entity ID - */ -export type ApprovalIDPointer = string; -/** - * JSON pointer to a status value - */ -export type StatusValuePointer = string; -/** - * JSON pointer to a human-readable status - */ -export type StatusValueDisplayPointer = string; -/** - * regex pattern used to determine if the approval should be considered 'approved' - */ -export type ApprovalMatcher = string; -/** - * regex pattern used to determine if the approval should be considered 'rejected' - */ -export type RejectionMatcher = string; -/** - * expected format for the external creation request URL. Values can be substituted in using {{value}} - */ -export type URLTemplate = string; -/** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - */ -export type URL5 = string; -/** - * HTTP method to use when LaunchDarkly makes the request to your endpoint - */ -export type HTTPMethod5 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; -/** - * Name of the header - */ -export type Name9 = string; -/** - * Value of the header. Form variables can be substituted in using {{variableName}} - */ -export type Value14 = string; -/** - * Headers to send with the webhook request - */ -export type HTTPHeaders5 = HeaderItems5[]; -/** - * The name of the HMAC signature header - */ -export type HMACSignatureHeaderName5 = string; -/** - * The name of the form variable field that corresponds to the HMAC encryption secret - */ -export type HMACSecretFormVariableKey5 = string; -/** - * Template string used to render the JSON request body - */ -export type JSONBody1 = string; -/** - * Externally-created approval entity ID - */ -export type ApprovalIDPointer1 = string; -/** - * JSON pointer to a status value - */ -export type StatusValuePointer1 = string; -/** - * JSON pointer to a human-readable status - */ -export type StatusValueDisplayPointer1 = string; -/** - * regex pattern used to determine if the approval should be considered 'approved' - */ -export type ApprovalMatcher1 = string; -/** - * regex pattern used to determine if the approval should be considered 'rejected' - */ -export type RejectionMatcher1 = string; -/** - * expected format for the external creation request URL. Values can be substituted in using {{value}} - */ -export type URLTemplate1 = string; -/** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - */ -export type URL6 = string; -/** - * HTTP method to use when LaunchDarkly makes the request to your endpoint - */ -export type HTTPMethod6 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; -/** - * Name of the header - */ -export type Name10 = string; -/** - * Value of the header. Form variables can be substituted in using {{variableName}} - */ -export type Value15 = string; -/** - * Headers to send with the webhook request - */ -export type HTTPHeaders6 = HeaderItems6[]; -/** - * The name of the HMAC signature header - */ -export type HMACSignatureHeaderName6 = string; -/** - * The name of the form variable field that corresponds to the HMAC encryption secret - */ -export type HMACSecretFormVariableKey6 = string; -/** - * Template string used to render the JSON request body - */ -export type JSONBody2 = string; -/** - * Externally-created approval entity ID - */ -export type ApprovalIDPointer2 = string; -/** - * JSON pointer to a status value - */ -export type StatusValuePointer2 = string; -/** - * JSON pointer to a human-readable status - */ -export type StatusValueDisplayPointer2 = string; -/** - * regex pattern used to determine if the approval should be considered 'approved' - */ -export type ApprovalMatcher2 = string; -/** - * regex pattern used to determine if the approval should be considered 'rejected' - */ -export type RejectionMatcher2 = string; -/** - * expected format for the external creation request URL. Values can be substituted in using {{value}} - */ -export type URLTemplate2 = string; -/** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - */ -export type URL7 = string; -/** - * HTTP method to use when LaunchDarkly makes the request to your endpoint - */ -export type HTTPMethod7 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; -/** - * Name of the header - */ -export type Name11 = string; -/** - * Value of the header. Form variables can be substituted in using {{variableName}} - */ -export type Value16 = string; -/** - * Headers to send with the webhook request - */ -export type HTTPHeaders7 = HeaderItems7[]; -/** - * The name of the HMAC signature header - */ -export type HMACSignatureHeaderName7 = string; -/** - * The name of the form variable field that corresponds to the HMAC encryption secret - */ -export type HMACSecretFormVariableKey7 = string; -/** - * Template string used to render the JSON request body - */ -export type JSONBody3 = string; -/** - * Externally-created approval entity ID - */ -export type ApprovalIDPointer3 = string; -/** - * JSON pointer to a status value - */ -export type StatusValuePointer3 = string; -/** - * JSON pointer to a human-readable status - */ -export type StatusValueDisplayPointer3 = string; -/** - * regex pattern used to determine if the approval should be considered 'approved' - */ -export type ApprovalMatcher3 = string; -/** - * regex pattern used to determine if the approval should be considered 'rejected' - */ -export type RejectionMatcher3 = string; -/** - * expected format for the external creation request URL. Values can be substituted in using {{value}} - */ -export type URLTemplate3 = string; -/** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - */ -export type URL8 = string; -/** - * HTTP method to use when LaunchDarkly makes the request to your endpoint - */ -export type HTTPMethod8 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; -/** - * Name of the header - */ -export type Name12 = string; -/** - * Value of the header. Form variables can be substituted in using {{variableName}} - */ -export type Value17 = string; -/** - * Headers to send with the webhook request - */ -export type HTTPHeaders8 = HeaderItems8[]; -/** - * The name of the HMAC signature header - */ -export type HMACSignatureHeaderName8 = string; -/** - * The name of the form variable field that corresponds to the HMAC encryption secret - */ -export type HMACSecretFormVariableKey8 = string; -/** - * Template string used to render the JSON request body - */ -export type JSONBody4 = string; -/** - * JSON path to the array containing integration member details - */ -export type MemberArrayPath = string; -/** - * Relative JSON path to the email field in each member item in the array - */ -export type Email = string; -/** - * Relative JSON path to the integration member ID field in each member item in the array - */ -export type MemberID = string; -/** - * A key will be used as the token name when the variable is substituted - */ -export type Key4 = string; -/** - * A descriptive name that will be used as the form label on the UI - */ -export type Name13 = string; -/** - * The type of the variable - */ -export type Type3 = - | "string" - | "boolean" - | "uri" - | "enum" - | "oauth" - | "dynamicEnum" - | "generated" - | "environmentSelector" - | "multiselect"; -/** - * Describes the variable in the UI. Markdown links allowed. - */ -export type Description7 = string; -/** - * Placeholder value to use in the form element if applicable - */ -export type Description8 = string; -/** - * Secret variables will be masked in the UI - */ -export type IsThisVariableASecret3 = boolean; -/** - * Variables marked as disabled after saving won't be editable after they are saved - */ -export type DisableAfterSaving3 = boolean; -/** - * Variables marked as optional won't be required on the UI - */ -export type IsThisVariableOptional3 = boolean; -/** - * Variables marked as hidden won't be displayed on the UI - */ -export type HideVariableInTheUI3 = boolean; -/** - * Default value for variable. Can be overridden by the user in the UI - */ -export type DefaultValue3 = boolean | string; -/** - * Allowed string values for enum-type formVariables - */ -export type AllowedValues3 = string[]; -/** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - */ -export type URL9 = string; -/** - * HTTP method to use when LaunchDarkly makes the request to your endpoint - */ -export type HTTPMethod9 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; -/** - * Name of the header - */ -export type Name14 = string; -/** - * Value of the header. Form variables can be substituted in using {{variableName}} - */ -export type Value18 = string; -/** - * Headers to send with the webhook request - */ -export type HTTPHeaders9 = HeaderItems9[]; -/** - * The name of the HMAC signature header - */ -export type HMACSignatureHeaderName9 = string; -/** - * The name of the form variable field that corresponds to the HMAC encryption secret - */ -export type HMACSecretFormVariableKey9 = string; -/** - * JSON path to the array containing options for parsing - */ -export type OptionsArrayPath3 = string; -/** - * Relative JSON path to values for each item in the options array to be used as UI dropdown labels - */ -export type Label6 = string; -/** - * Relative JSON path to values for each item in the options array to be used as dropdown values - */ -export type Value19 = string; -/** - * Key for the form variable that this form field depends on - */ -export type VariableKey3 = string; -/** - * Which form variable type is the variable key defined or located in? - */ -export type VariableLocation3 = "approvalFormVariables" | "environmentFormVariables" | "formVariables"; -/** - * Action to be taken when your defined conditions evaluates to true - */ -export type Action3 = "hideField" | "showField"; -/** - * Name of the operator for evaluating a condition. - */ -export type Operator3 = - | "lessThan" - | "lessThanOrEqualTo" - | "greaterThan" - | "greaterThanOrEqualTo" - | "equalTo" - | "notEqual" - | "contains" - | "startsWith" - | "endsWith"; -/** - * Target value that conditions are evaluated against - */ -export type Value20 = string; -/** - * Conditional configurations to be evaluated to decide whether an action should taken for the form field. - */ -export type Conditions3 = { - operator: Operator3; - value: Value20; - [k: string]: unknown; -}[]; -/** - * Dependency configuration to control the state and visibility of the form field. - */ -export type DependsOn3 = { - variableKey: VariableKey3; - variableLocation: VariableLocation3; - action: Action3; - conditions: Conditions3; - [k: string]: unknown; -}[]; -/** - * Label of the multi select option - */ -export type Label7 = string; -/** - * Value of the multi select option - */ -export type Value21 = string; -export type OptionsArray7 = MultiSelectOptionItem3[]; -/** - * Default options to be selected when the multi select is first rendered - */ -export type MultiSelectDefaultOptions3 = string[]; -/** - * Variables marked as hideEmpty won't be shown in the UI if they are empty - */ -export type HideValueInUIWhenEmpty3 = boolean; -/** - * Provider specific configuration that LaunchDarkly needs in order to write feature flag data to the provider's data store - */ -export type ProviderFormVariables = FormVariable3[]; -/** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - */ -export type URL10 = string; -/** - * HTTP method to use when LaunchDarkly makes the request to your endpoint - */ -export type HTTPMethod10 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; -/** - * Name of the header - */ -export type Name15 = string; -/** - * Value of the header. Form variables can be substituted in using {{variableName}} - */ -export type Value22 = string; -/** - * Headers to send with the webhook request - */ -export type HTTPHeaders10 = HeaderItems10[]; -/** - * The name of the HMAC signature header - */ -export type HMACSignatureHeaderName10 = string; -/** - * The name of the form variable field that corresponds to the HMAC encryption secret - */ -export type HMACSecretFormVariableKey10 = string; -export type SuccessPointer = string; -export type ErrorsPointer = string; -/** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - */ -export type URL11 = string; -/** - * HTTP method to use when LaunchDarkly makes the request to your endpoint - */ -export type HTTPMethod11 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; -/** - * Name of the header - */ -export type Name16 = string; -/** - * Value of the header. Form variables can be substituted in using {{variableName}} - */ -export type Value23 = string; -/** - * Headers to send with the webhook request - */ -export type HTTPHeaders11 = HeaderItems11[]; -/** - * The name of the HMAC signature header - */ -export type HMACSignatureHeaderName11 = string; -/** - * The name of the form variable field that corresponds to the HMAC encryption secret - */ -export type HMACSecretFormVariableKey11 = string; -/** - * Optional prefix to wrap payload data with (used for some integrations) - */ -export type Prefix = string; -/** - * Optional suffix to wrap payload data with (used for some integrations) - */ -export type Suffix = string; -/** - * Sentence-cased title to show for all links for this integration - */ -export type LinkGroupHeader = string; -/** - * Title of the message - */ -export type Title = string; -/** - * Text or markup content describing how links can be created for this integration - */ -export type LeadText = string; -/** - * Data type for the metadata attribute - */ -export type Type4 = "string" | "uri"; -/** - * Url of the image. Handlebars template notation can be used to reference metadata fields. - */ -export type SourceUrl = string; -/** - * Indicates whether the image should be rendered as an icon - */ -export type IsIcon = boolean; -/** - * Indicates whether the image should be rendered as an avatar - */ -export type IsAvatar = boolean; -/** - * Template string used to render a visual block in LaunchDarkly UI to display a name - */ -export type Name17 = string; -/** - * Text to be displayed for the element. The text can contain template variables - */ -export type Text = string; -/** - * Indicates whether the element should be bolded - */ -export type IsBold = boolean; -/** - * Indicates whether the element should be rendered as a timestamp - */ -export type IsTimestamp = boolean; -/** - * URL to be set for the element which also indicates the element should be rendered as a hyperlink - */ -export type Url = string; -/** - * An array of elements to be combined to create a title block - */ -export type Elements = UIBlockElement[]; -/** - * Indicates whether the title should be displayed as a hyperlink in LaunchDarkly UI - */ -export type LinkToReference = boolean; -/** - * Markdown string used to render a visual block in LaunchDarkly UI to display a link description - */ -export type Description9 = string; -/** - * Text to be displayed for the element. The text can contain template variables - */ -export type Text1 = string; -/** - * Indicates whether the element should be bolded - */ -export type IsBold1 = boolean; -/** - * Indicates whether the element should be rendered as a timestamp - */ -export type IsTimestamp1 = boolean; -/** - * URL to be set for the element which also indicates the element should be rendered as a hyperlink - */ -export type Url1 = string; -/** - * An array of elements to be combined to create a context block - */ -export type Elements1 = UIBlockElement1[]; -/** - * This capability will disable in-app editing for the integration - */ -export type HideConfiguration = boolean; -/** - * This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. - */ -export type ExternalConfigurationURL = string; -/** - * URL to redirect to for external creation flow - */ -export type CreateURL = string; -/** - * URL to redirect to for external edit flow - */ -export type EditURL = string; -/** - * JSON string to be returned as a response - */ -export type ResponseBody = string; -/** - * JSON pointer to the LaunchDarkly environment id - */ -export type EnvironmentIdPath = string; -/** - * JSON pointer to the LaunchDarkly context kind - */ -export type ContextKindPath = string; -/** - * JSON pointer to the cohort id - */ -export type CohortIdPath = string; -/** - * JSON pointer to the cohort name - */ -export type CohortNamePath = string; -/** - * JSON pointer to the cohort URL path - */ -export type CohortUrlPath = string; -/** - * JSON pointer to the array containing members to be added or removed from the segment - */ -export type MemberArrayPath1 = string; -/** - * JSON pointer to the array containing members to be added to the segment. Required if removeMemberArrayPath is specified - */ -export type AddMemberArrayPath = string; -/** - * JSON pointer to the array containing members to be removed to the segment. Required if addMemberArrayPath is specified - */ -export type RemoveMemberArrayPath = string; -/** - * JSON pointer to the property that will be checked by the matcher property - */ -export type Path = string; -/** - * Regex indicating the action to be taken for the members in the segment. If it matches the value of path property, the members of the incoming segment will be added otherwise they will be removed - */ -export type Matcher = string; -/** - * JSON pointer to the member id - */ -export type MemberIdPath = string; -/** - * JSON pointer to the property in member array payload indicating whether the member should be added or removed - */ -export type BooleanMembershipPath = string; -/** - * JSON pointer to the cohort name. Overrides the cohort name for a single member - */ -export type CohortNamePath1 = string; -/** - * JSON pointer to the cohort id. Overrides the cohort id for a single member - */ -export type CohortIdPath1 = string; -/** - * Describes what type of database LaunchDarkly will sync big segments to - */ -export type DatabaseStyle = "redis" | "dynamoDB"; -/** - * Template to use for imports from Split - */ -export type SplitTemplate = string; -/** - * Template to use for imports from Split - */ -export type SplitDetailsTemplate = string; -/** - * Template to use for imports from StatSig - */ -export type StatSigTemplate = string; -/** - * Whether errors received while importing should be displayed in the error log in LaunchDarkly UI - */ -export type IncludeErrorResponseBody1 = boolean; -/** - * URL to send the request to. You can use {{template markup}} to inject a formVariable into the url. - */ -export type URL12 = string; -/** - * HTTP method to use when LaunchDarkly makes the request to your endpoint - */ -export type HTTPMethod12 = "POST" | "PUT" | "PATCH" | "GET" | "DELETE"; -/** - * Name of the header - */ -export type Name18 = string; -/** - * Value of the header. Form variables can be substituted in using {{variableName}} - */ -export type Value24 = string; -/** - * Headers to send with the webhook request - */ -export type HTTPHeaders12 = HeaderItems12[]; -/** - * The name of the HMAC signature header - */ -export type HMACSignatureHeaderName12 = string; -/** - * The name of the form variable field that corresponds to the HMAC encryption secret - */ -export type HMACSecretFormVariableKey12 = string; -/** - * Template to use for measuredRolloutRegressionDetected events - */ -export type MeasuredRolloutRegressionDetectedTemplate = string; -/** - * Template to use for measuredRolloutReverted events - */ -export type MeasuredRolloutRevertedTemplate = string; -/** - * Template to use for errorMonitoringNewIssueFound events - */ -export type ErrorMonitoringNewIssueFoundTemplate = string; -/** - * Whether errors received from your endpoint should be displayed in the error log in LaunchDarkly UI - */ -export type IncludeErrorResponseBody2 = boolean; -/** - * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. - */ -export type OAuthIntegrationKey = string; -/** - * Whether the integration allows integration configurations. Will apply to all capabilities on the manifest. - */ -export type AllowIntegrationConfigurations = boolean; - -/** - * Describes the capabilities and intent of a LaunchDarkly integration - */ -export interface LaunchDarklyIntegrationsManifest { - name: IntegrationName; - version: Version; - overview: ShortDescription; - description: LongDescription; - details?: LearnMoreDetails; - author: Author; - supportEmail: SupportEmail; - links: Links; - categories: Categories; - icons: Icons; - legacy?: Legacy; - otherCapabilities?: OtherCapabilities; - requiresOAuth?: RequiresOAuth; - hideOnIntegrationsPage?: HideOnIntegrationsPage; - formVariables?: FormVariables; - capabilities?: Capabilities; - oauthIntegrationKey?: OAuthIntegrationKey; - allowIntegrationConfigurations?: AllowIntegrationConfigurations; - [k: string]: unknown; -} -/** - * A set of reference links supporting your integration - */ -export interface Links { - site: Website; - launchdarklyDocs?: LaunchDarklyDocumentation; - privacyPolicy: PrivacyPolicy; - supportWebsite?: SupportWebsite; - [k: string]: unknown; -} -/** - * Logos describing your integration in SVG format - */ -export interface Icons { - square: SquareLogo; - horizontal: HorizontalLogo; - [k: string]: unknown; -} -/** - * Legacy integration - */ -export interface Legacy { - kind: Kind; - [k: string]: unknown; -} -/** - * A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration. - */ -export interface FormVariable { - key: Key; - name: Name; - type: Type; - description: Description; - placeholder?: Description1; - isSecret?: IsThisVariableASecret; - disableAfterSaving?: DisableAfterSaving; - isOptional?: IsThisVariableOptional; - isHidden?: HideVariableInTheUI; - defaultValue?: DefaultValue; - allowedValues?: AllowedValues; - dynamicOptions?: DynamicOptions; - dependsOn?: DependsOn; - multiselectOptions?: OptionsArray1; - multiselectDefaultOptions?: MultiSelectDefaultOptions; - hideEmpty?: HideValueInUIWhenEmpty; - [k: string]: unknown; -} -/** - * Parser and endpoint for handling dynamicEnum - */ -export interface DynamicOptions { - endpoint: Endpoint; - parser: DynamicOptionsParser; - [k: string]: unknown; -} -/** - * Properties that describe an HTTP request to an external endpoint - */ -export interface Endpoint { - url: URL; - method: HTTPMethod; - headers?: HTTPHeaders; - hmacSignature?: HMACSignature; - [k: string]: unknown; -} -/** - * A name and value pair to send as headers with the hook request - */ -export interface HeaderItems { - name: Name1; - value: Value; - [k: string]: unknown; -} -/** - * Whether or not and how to configure HMAC validation on outgoing webhooks - */ -export interface HMACSignature { - headerName?: HMACSignatureHeaderName; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey; - [k: string]: unknown; -} -/** - * Mapping of property names to location in JSON response - */ -export interface DynamicOptionsParser { - optionsPath: OptionsArrayPath; - optionsItems: OptionsArray; - [k: string]: unknown; -} -export interface OptionsArray { - label: Label; - value: Value1; - [k: string]: unknown; -} -/** - * A multi select option item - */ -export interface MultiSelectOptionItem { - label: Label1; - value: Value3; - [k: string]: unknown; -} -/** - * Specify which capabilities you'd like your integration to have - */ -export interface Capabilities { - auditLogEventsHook?: AuditLogEventsHook; - reservedCustomProperties?: ReservedCustomProperties; - trigger?: Trigger; - approval?: Approval; - featureStore?: FeatureStore; - flagLink?: FlagLink; - hideConfiguration?: HideConfiguration; - externalConfigurationURL?: ExternalConfigurationURL; - externalConfigurationPages?: ExternalConfigurationPages; - syncedSegment?: SyncedSegment; - bigSegmentStore?: BigSegmentStore; - flagImport?: FlagImport; - eventsHook?: EventsHook; - [k: string]: unknown; -} -/** - * This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint. - */ -export interface AuditLogEventsHook { - endpoint?: Endpoint1; - templates: WebhookBodyTemplate; - defaultPolicy?: DefaultPolicy; - includeErrorResponseBody?: IncludeErrorResponseBody; - deliveryMethod?: DeliveryMethod; - useStandardWebhookPayload?: UseStandardWebhookPayload; - [k: string]: unknown; -} -/** - * Properties that describe an HTTP request to an external endpoint - */ -export interface Endpoint1 { - url: URL1; - method: HTTPMethod1; - headers?: HTTPHeaders1; - hmacSignature?: HMACSignature1; - [k: string]: unknown; -} -/** - * A name and value pair to send as headers with the hook request - */ -export interface HeaderItems1 { - name: Name2; - value: Value4; - [k: string]: unknown; -} -/** - * Whether or not and how to configure HMAC validation on outgoing webhooks - */ -export interface HMACSignature1 { - headerName?: HMACSignatureHeaderName1; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey1; - [k: string]: unknown; -} -/** - * Templates to use for body of the webhook request - */ -export interface WebhookBodyTemplate { - flag?: FlagTemplate; - project?: ProjectTemplate; - environment?: EnvironmentTemplate; - default?: DefaultTemplate; - validation?: ValidationTemplate; - member?: MemberTemplate; - [k: string]: unknown; -} -/** - * A LaunchDarkly policy. See https://docs.launchdarkly.com/home/members/role-policies for more information. - */ -export interface Policy { - actions?: Actions; - effect?: Effect; - notActions?: NotActions; - notResources?: NotResources; - resources?: Resources; - [k: string]: unknown; -} -/** - * This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly - */ -export interface Trigger { - documentation: DocumentationLink; - auth?: Authentication; - defaultEventName?: DefaultEventName; - testEventNameRegexp?: TestEventNameRegex; - parser?: TriggerParser; - [k: string]: unknown; -} -/** - * Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer - */ -export interface TriggerParser { - eventName?: EventNamePointer; - value?: ValuePointer; - url?: URLPointer; - [k: string]: unknown; -} -/** - * This capability enables integration-driven flag change approvals - */ -export interface Approval { - name?: ApprovalSystemName; - environmentFormVariables?: EnvironmentFormVariables; - approvalFormVariables?: ApprovalFormVariables; - allowAdditionalApprovalFormVariables?: AllowAdditionalApprovalFormVariablesForCreationRequestModal; - allowApprovalIntegrationConfigurations?: AllowUsersToConfigureIntegrationConfigurationsForApprovals; - creationRequest: CreationRequest; - statusRequest: StatusRequest; - postApplyRequest: PostApplyRequest; - deletionRequest: DeletionRequest; - memberListRequest?: MemberListRequest; - [k: string]: unknown; -} -/** - * A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration. - */ -export interface FormVariable1 { - key: Key2; - name: Name4; - type: Type1; - description: Description3; - placeholder?: Description4; - isSecret?: IsThisVariableASecret1; - disableAfterSaving?: DisableAfterSaving1; - isOptional?: IsThisVariableOptional1; - isHidden?: HideVariableInTheUI1; - defaultValue?: DefaultValue1; - allowedValues?: AllowedValues1; - dynamicOptions?: DynamicOptions1; - dependsOn?: DependsOn1; - multiselectOptions?: OptionsArray3; - multiselectDefaultOptions?: MultiSelectDefaultOptions1; - hideEmpty?: HideValueInUIWhenEmpty1; - [k: string]: unknown; -} -/** - * Parser and endpoint for handling dynamicEnum - */ -export interface DynamicOptions1 { - endpoint: Endpoint2; - parser: DynamicOptionsParser1; - [k: string]: unknown; -} -/** - * Properties that describe an HTTP request to an external endpoint - */ -export interface Endpoint2 { - url: URL2; - method: HTTPMethod2; - headers?: HTTPHeaders2; - hmacSignature?: HMACSignature2; - [k: string]: unknown; -} -/** - * A name and value pair to send as headers with the hook request - */ -export interface HeaderItems2 { - name: Name5; - value: Value5; - [k: string]: unknown; -} -/** - * Whether or not and how to configure HMAC validation on outgoing webhooks - */ -export interface HMACSignature2 { - headerName?: HMACSignatureHeaderName2; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey2; - [k: string]: unknown; -} -/** - * Mapping of property names to location in JSON response - */ -export interface DynamicOptionsParser1 { - optionsPath: OptionsArrayPath1; - optionsItems: OptionsArray2; - [k: string]: unknown; -} -export interface OptionsArray2 { - label: Label2; - value: Value6; - [k: string]: unknown; -} -/** - * A multi select option item - */ -export interface MultiSelectOptionItem1 { - label: Label3; - value: Value8; - [k: string]: unknown; -} -/** - * A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration. - */ -export interface FormVariable2 { - key: Key3; - name: Name6; - type: Type2; - description: Description5; - placeholder?: Description6; - isSecret?: IsThisVariableASecret2; - disableAfterSaving?: DisableAfterSaving2; - isOptional?: IsThisVariableOptional2; - isHidden?: HideVariableInTheUI2; - defaultValue?: DefaultValue2; - allowedValues?: AllowedValues2; - dynamicOptions?: DynamicOptions2; - dependsOn?: DependsOn2; - multiselectOptions?: OptionsArray5; - multiselectDefaultOptions?: MultiSelectDefaultOptions2; - hideEmpty?: HideValueInUIWhenEmpty2; - [k: string]: unknown; -} -/** - * Parser and endpoint for handling dynamicEnum - */ -export interface DynamicOptions2 { - endpoint: Endpoint3; - parser: DynamicOptionsParser2; - [k: string]: unknown; -} -/** - * Properties that describe an HTTP request to an external endpoint - */ -export interface Endpoint3 { - url: URL3; - method: HTTPMethod3; - headers?: HTTPHeaders3; - hmacSignature?: HMACSignature3; - [k: string]: unknown; -} -/** - * A name and value pair to send as headers with the hook request - */ -export interface HeaderItems3 { - name: Name7; - value: Value9; - [k: string]: unknown; -} -/** - * Whether or not and how to configure HMAC validation on outgoing webhooks - */ -export interface HMACSignature3 { - headerName?: HMACSignatureHeaderName3; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey3; - [k: string]: unknown; -} -/** - * Mapping of property names to location in JSON response - */ -export interface DynamicOptionsParser2 { - optionsPath: OptionsArrayPath2; - optionsItems: OptionsArray4; - [k: string]: unknown; -} -export interface OptionsArray4 { - label: Label4; - value: Value10; - [k: string]: unknown; -} -/** - * A multi select option item - */ -export interface MultiSelectOptionItem2 { - label: Label5; - value: Value12; - [k: string]: unknown; -} -/** - * Describes the approval creation HTTP request and the parser used to process the JSON response - */ -export interface CreationRequest { - endpoint: Endpoint4; - jsonBody?: JSONBody; - parser?: ApprovalParser; +export interface LaunchDarklyIntegrationsManifest { + name: IntegrationName; + version: Version; + overview: ShortDescription; + description: LongDescription; + details?: LearnMoreDetails; + author: Author; + supportEmail: SupportEmail; + links: Links; + categories: Categories; + icons: Icons; + legacy?: Legacy; + otherCapabilities?: OtherCapabilities; + requiresOAuth?: RequiresOAuth; + hideOnIntegrationsPage?: HideOnIntegrationsPage; + formVariables?: FormVariables; + capabilities?: Capabilities; + oauthIntegrationKey?: OAuthIntegrationKey; + allowIntegrationConfigurations?: AllowIntegrationConfigurations; [k: string]: unknown; } /** - * Properties that describe an HTTP request to an external endpoint + * A set of reference links supporting your integration */ -export interface Endpoint4 { - url: URL4; - method: HTTPMethod4; - headers?: HTTPHeaders4; - hmacSignature?: HMACSignature4; +export interface Links { + site: Website; + launchdarklyDocs?: LaunchDarklyDocumentation; + privacyPolicy: PrivacyPolicy; + supportWebsite?: SupportWebsite; [k: string]: unknown; } /** - * A name and value pair to send as headers with the hook request + * Logos describing your integration in SVG format */ -export interface HeaderItems4 { - name: Name8; - value: Value13; +export interface Icons { + square: SquareLogo; + horizontal: HorizontalLogo; [k: string]: unknown; } /** - * Whether or not and how to configure HMAC validation on outgoing webhooks + * Legacy integration */ -export interface HMACSignature4 { - headerName?: HMACSignatureHeaderName4; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey4; +export interface Legacy { + kind: Kind; [k: string]: unknown; } /** - * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer + * A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration. */ -export interface ApprovalParser { - approvalId?: ApprovalIDPointer; - statusValue: StatusValuePointer; - statusDisplay?: StatusValueDisplayPointer; - approvalMatcher: ApprovalMatcher; - rejectionMatcher?: RejectionMatcher; - urlTemplate?: URLTemplate; +export interface FormVariable { + key: Key; + name: Name; + type: Type; + description: Description; + placeholder?: Description1; + isSecret?: IsThisVariableASecret; + disableAfterSaving?: DisableAfterSaving; + isOptional?: IsThisVariableOptional; + isHidden?: HideVariableInTheUI; + defaultValue?: DefaultValue; + allowedValues?: AllowedValues; + dynamicOptions?: DynamicOptions; + dependsOn?: DependsOn; + multiselectOptions?: OptionsArray1; + multiselectDefaultOptions?: MultiSelectDefaultOptions; + hideEmpty?: HideValueInUIWhenEmpty; [k: string]: unknown; } /** - * Describes the approval status check HTTP request and the parser used to determine if the approval should be consider approved or rejected + * Parser and endpoint for handling dynamicEnum */ -export interface StatusRequest { - endpoint: Endpoint5; - jsonBody?: JSONBody1; - parser: ApprovalParser1; +export interface DynamicOptions { + endpoint: Endpoint; + parser: DynamicOptionsParser; [k: string]: unknown; } /** * Properties that describe an HTTP request to an external endpoint */ -export interface Endpoint5 { - url: URL5; - method: HTTPMethod5; - headers?: HTTPHeaders5; - hmacSignature?: HMACSignature5; +export interface Endpoint { + url: URL; + method: HTTPMethod; + headers?: HTTPHeaders; + hmacSignature?: HMACSignature; [k: string]: unknown; } /** * A name and value pair to send as headers with the hook request */ -export interface HeaderItems5 { - name: Name9; - value: Value14; +export interface HeaderItems { + name: Name1; + value: Value; [k: string]: unknown; } /** * Whether or not and how to configure HMAC validation on outgoing webhooks */ -export interface HMACSignature5 { - headerName?: HMACSignatureHeaderName5; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey5; +export interface HMACSignature { + headerName?: HMACSignatureHeaderName; + hmacSecretFormVariableKey?: HMACSecretFormVariableKey; [k: string]: unknown; } /** - * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer + * Mapping of property names to location in JSON response */ -export interface ApprovalParser1 { - approvalId?: ApprovalIDPointer1; - statusValue: StatusValuePointer1; - statusDisplay?: StatusValueDisplayPointer1; - approvalMatcher: ApprovalMatcher1; - rejectionMatcher?: RejectionMatcher1; - urlTemplate?: URLTemplate1; +export interface DynamicOptionsParser { + optionsPath: OptionsArrayPath; + optionsItems: OptionsArray; + [k: string]: unknown; +} +export interface OptionsArray { + label: Label; + value: Value1; [k: string]: unknown; } /** - * Describes the HTTP request to make after the changes have been applied in LaunchDarkly + * A multi select option item */ -export interface PostApplyRequest { - endpoint: Endpoint6; - jsonBody?: JSONBody2; - parser: ApprovalParser2; +export interface MultiSelectOptionItem { + label: Label1; + value: Value3; [k: string]: unknown; } /** - * Properties that describe an HTTP request to an external endpoint + * Specify which capabilities you'd like your integration to have */ -export interface Endpoint6 { - url: URL6; - method: HTTPMethod6; - headers?: HTTPHeaders6; - hmacSignature?: HMACSignature6; +export interface Capabilities { + auditLogEventsHook?: AuditLogEventsHook; + reservedCustomProperties?: ReservedCustomProperties; + trigger?: Trigger; + approval?: Approval; + featureStore?: FeatureStore; + flagLink?: FlagLink; + hideConfiguration?: HideConfiguration; + externalConfigurationURL?: ExternalConfigurationURL; + externalConfigurationPages?: ExternalConfigurationPages; + syncedSegment?: SyncedSegment; + bigSegmentStore?: BigSegmentStore; + flagImport?: FlagImport; + eventsHook?: EventsHook; [k: string]: unknown; } /** - * A name and value pair to send as headers with the hook request + * This capability will enable LaunchDarkly to send audit log event webhooks to your endpoint. */ -export interface HeaderItems6 { - name: Name10; - value: Value15; +export interface AuditLogEventsHook { + endpoint?: Endpoint; + templates: WebhookBodyTemplate; + defaultPolicy?: DefaultPolicy; + includeErrorResponseBody?: IncludeErrorResponseBody; + deliveryMethod?: DeliveryMethod; + useStandardWebhookPayload?: UseStandardWebhookPayload; [k: string]: unknown; } /** - * Whether or not and how to configure HMAC validation on outgoing webhooks + * Templates to use for body of the webhook request */ -export interface HMACSignature6 { - headerName?: HMACSignatureHeaderName6; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey6; +export interface WebhookBodyTemplate { + flag?: FlagTemplate; + project?: ProjectTemplate; + environment?: EnvironmentTemplate; + default?: DefaultTemplate; + validation?: ValidationTemplate; + member?: MemberTemplate; [k: string]: unknown; } /** - * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer + * A LaunchDarkly policy. See https://docs.launchdarkly.com/home/members/role-policies for more information. */ -export interface ApprovalParser2 { - approvalId?: ApprovalIDPointer2; - statusValue: StatusValuePointer2; - statusDisplay?: StatusValueDisplayPointer2; - approvalMatcher: ApprovalMatcher2; - rejectionMatcher?: RejectionMatcher2; - urlTemplate?: URLTemplate2; +export interface Policy { + actions?: Actions; + effect?: Effect; + notActions?: NotActions; + notResources?: NotResources; + resources?: Resources; [k: string]: unknown; } /** - * Describes the HTTP request for the deletion of the external approval entity + * This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly */ -export interface DeletionRequest { - endpoint: Endpoint7; - jsonBody?: JSONBody3; - parser: ApprovalParser3; +export interface Trigger { + documentation: DocumentationLink; + auth?: Authentication; + defaultEventName?: DefaultEventName; + testEventNameRegexp?: TestEventNameRegex; + parser?: TriggerParser; [k: string]: unknown; } /** - * Properties that describe an HTTP request to an external endpoint + * Describes a mapping of property name to a location in the JSON response payload specified by a JSON pointer */ -export interface Endpoint7 { - url: URL7; - method: HTTPMethod7; - headers?: HTTPHeaders7; - hmacSignature?: HMACSignature7; +export interface TriggerParser { + eventName?: EventNamePointer; + value?: ValuePointer; + url?: URLPointer; [k: string]: unknown; } /** - * A name and value pair to send as headers with the hook request + * This capability enables integration-driven flag change approvals */ -export interface HeaderItems7 { - name: Name11; - value: Value16; +export interface Approval { + name?: ApprovalSystemName; + environmentFormVariables?: EnvironmentFormVariables; + approvalFormVariables?: ApprovalFormVariables; + allowAdditionalApprovalFormVariables?: AllowAdditionalApprovalFormVariablesForCreationRequestModal; + allowApprovalIntegrationConfigurations?: AllowUsersToConfigureIntegrationConfigurationsForApprovals; + creationRequest: CreationRequest; + statusRequest: StatusRequest; + postApplyRequest: PostApplyRequest; + deletionRequest: DeletionRequest; + memberListRequest?: MemberListRequest; [k: string]: unknown; } /** - * Whether or not and how to configure HMAC validation on outgoing webhooks + * Describes the approval creation HTTP request and the parser used to process the JSON response */ -export interface HMACSignature7 { - headerName?: HMACSignatureHeaderName7; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey7; +export interface CreationRequest { + endpoint: Endpoint; + jsonBody?: JSONBody; + parser?: ApprovalParser; [k: string]: unknown; } /** * Describes a mapping of property names to a location in the JSON response payload specified by a JSON pointer */ -export interface ApprovalParser3 { - approvalId?: ApprovalIDPointer3; - statusValue: StatusValuePointer3; - statusDisplay?: StatusValueDisplayPointer3; - approvalMatcher: ApprovalMatcher3; - rejectionMatcher?: RejectionMatcher3; - urlTemplate?: URLTemplate3; +export interface ApprovalParser { + approvalId?: ApprovalIDPointer; + statusValue: StatusValuePointer; + statusDisplay?: StatusValueDisplayPointer; + approvalMatcher: ApprovalMatcher; + rejectionMatcher?: RejectionMatcher; + urlTemplate?: URLTemplate; [k: string]: unknown; } /** - * Describes the HTTP request to get integration users for mapping to Launchdarkly users + * Describes the approval status check HTTP request and the parser used to determine if the approval should be consider approved or rejected */ -export interface MemberListRequest { - endpoint: Endpoint8; - jsonBody?: JSONBody4; - parser: MemberListParser; +export interface StatusRequest { + endpoint: Endpoint; + jsonBody?: JSONBody; + parser: ApprovalParser; [k: string]: unknown; } /** - * Properties that describe an HTTP request to an external endpoint + * Describes the HTTP request to make after the changes have been applied in LaunchDarkly */ -export interface Endpoint8 { - url: URL8; - method: HTTPMethod8; - headers?: HTTPHeaders8; - hmacSignature?: HMACSignature8; +export interface PostApplyRequest { + endpoint: Endpoint; + jsonBody?: JSONBody; + parser: ApprovalParser; [k: string]: unknown; } /** - * A name and value pair to send as headers with the hook request + * Describes the HTTP request for the deletion of the external approval entity */ -export interface HeaderItems8 { - name: Name12; - value: Value17; +export interface DeletionRequest { + endpoint: Endpoint; + jsonBody?: JSONBody; + parser: ApprovalParser; [k: string]: unknown; } /** - * Whether or not and how to configure HMAC validation on outgoing webhooks + * Describes the HTTP request to get integration users for mapping to Launchdarkly users */ -export interface HMACSignature8 { - headerName?: HMACSignatureHeaderName8; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey8; +export interface MemberListRequest { + endpoint: Endpoint; + jsonBody?: JSONBody; + parser: MemberListParser; [k: string]: unknown; } /** @@ -2201,117 +1024,14 @@ export interface FeatureStore { featureStoreRequest: FeatureStoreRequest; [k: string]: unknown; } -/** - * A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration. - */ -export interface FormVariable3 { - key: Key4; - name: Name13; - type: Type3; - description: Description7; - placeholder?: Description8; - isSecret?: IsThisVariableASecret3; - disableAfterSaving?: DisableAfterSaving3; - isOptional?: IsThisVariableOptional3; - isHidden?: HideVariableInTheUI3; - defaultValue?: DefaultValue3; - allowedValues?: AllowedValues3; - dynamicOptions?: DynamicOptions3; - dependsOn?: DependsOn3; - multiselectOptions?: OptionsArray7; - multiselectDefaultOptions?: MultiSelectDefaultOptions3; - hideEmpty?: HideValueInUIWhenEmpty3; - [k: string]: unknown; -} -/** - * Parser and endpoint for handling dynamicEnum - */ -export interface DynamicOptions3 { - endpoint: Endpoint9; - parser: DynamicOptionsParser3; - [k: string]: unknown; -} -/** - * Properties that describe an HTTP request to an external endpoint - */ -export interface Endpoint9 { - url: URL9; - method: HTTPMethod9; - headers?: HTTPHeaders9; - hmacSignature?: HMACSignature9; - [k: string]: unknown; -} -/** - * A name and value pair to send as headers with the hook request - */ -export interface HeaderItems9 { - name: Name14; - value: Value18; - [k: string]: unknown; -} -/** - * Whether or not and how to configure HMAC validation on outgoing webhooks - */ -export interface HMACSignature9 { - headerName?: HMACSignatureHeaderName9; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey9; - [k: string]: unknown; -} -/** - * Mapping of property names to location in JSON response - */ -export interface DynamicOptionsParser3 { - optionsPath: OptionsArrayPath3; - optionsItems: OptionsArray6; - [k: string]: unknown; -} -export interface OptionsArray6 { - label: Label6; - value: Value19; - [k: string]: unknown; -} -/** - * A multi select option item - */ -export interface MultiSelectOptionItem3 { - label: Label7; - value: Value21; - [k: string]: unknown; -} /** * Details needed to make a request to test that the provided form variables are valid */ export interface ValidationRequest { - endpoint: Endpoint10; + endpoint: Endpoint; parser: FeatureStoreValidationParser; [k: string]: unknown; } -/** - * Properties that describe an HTTP request to an external endpoint - */ -export interface Endpoint10 { - url: URL10; - method: HTTPMethod10; - headers?: HTTPHeaders10; - hmacSignature?: HMACSignature10; - [k: string]: unknown; -} -/** - * A name and value pair to send as headers with the hook request - */ -export interface HeaderItems10 { - name: Name15; - value: Value22; - [k: string]: unknown; -} -/** - * Whether or not and how to configure HMAC validation on outgoing webhooks - */ -export interface HMACSignature10 { - headerName?: HMACSignatureHeaderName10; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey10; - [k: string]: unknown; -} /** * Mapping to success/errors value(s) in a JSON response body */ @@ -2324,37 +1044,11 @@ export interface FeatureStoreValidationParser { * Details needed to make a request to deliver the flag payload to the feature store */ export interface FeatureStoreRequest { - endpoint: Endpoint11; + endpoint: Endpoint; payloadPrefix?: Prefix; payloadSuffix?: Suffix; [k: string]: unknown; } -/** - * Properties that describe an HTTP request to an external endpoint - */ -export interface Endpoint11 { - url: URL11; - method: HTTPMethod11; - headers?: HTTPHeaders11; - hmacSignature?: HMACSignature11; - [k: string]: unknown; -} -/** - * A name and value pair to send as headers with the hook request - */ -export interface HeaderItems11 { - name: Name16; - value: Value23; - [k: string]: unknown; -} -/** - * Whether or not and how to configure HMAC validation on outgoing webhooks - */ -export interface HMACSignature11 { - headerName?: HMACSignatureHeaderName11; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey11; - [k: string]: unknown; -} /** * This capability is used to manage inbound flag links */ @@ -2378,7 +1072,7 @@ export interface EmptyState { */ export interface FlagLinkMetadata { [k: string]: { - type: Type4; + type: Type1; [k: string]: unknown; }; } @@ -2387,9 +1081,9 @@ export interface FlagLinkMetadata { */ export interface UIBlocks { image?: Image; - name?: Name17; + name?: Name3; title?: Title1; - description?: Description9; + description?: Description3; context?: FlagLinkContext; [k: string]: unknown; } @@ -2427,16 +1121,6 @@ export interface FlagLinkContext { elements: Elements1; [k: string]: unknown; } -/** - * A sub component of a UI block that can be combined with other elements to form a UI block - */ -export interface UIBlockElement1 { - text: Text1; - isBold?: IsBold1; - isTimestamp?: IsTimestamp1; - url?: Url1; - [k: string]: unknown; -} /** * This capability will redirect users to an external URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. It supports different URLs for create and edit. */ @@ -2515,35 +1199,9 @@ export interface FlagImportBodyTemplate { * This capability will enable LaunchDarkly to send webhooks to your endpoint when particular events are observed. */ export interface EventsHook { - endpoint: Endpoint12; + endpoint: Endpoint; templates: EDAEventsWebhookBodyTemplate; - includeErrorResponseBody?: IncludeErrorResponseBody2; - [k: string]: unknown; -} -/** - * Properties that describe an HTTP request to an external endpoint - */ -export interface Endpoint12 { - url: URL12; - method: HTTPMethod12; - headers?: HTTPHeaders12; - hmacSignature?: HMACSignature12; - [k: string]: unknown; -} -/** - * A name and value pair to send as headers with the hook request - */ -export interface HeaderItems12 { - name: Name18; - value: Value24; - [k: string]: unknown; -} -/** - * Whether or not and how to configure HMAC validation on outgoing webhooks - */ -export interface HMACSignature12 { - headerName?: HMACSignatureHeaderName12; - hmacSecretFormVariableKey?: HMACSecretFormVariableKey12; + includeErrorResponseBody?: IncludeErrorResponseBody; [k: string]: unknown; } /** From 530f0e93bbdc14650802a34706d1919b28ea8fa6 Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Mon, 2 Dec 2024 12:52:52 -0600 Subject: [PATCH 880/936] change integration type from snowflake-export to snowflake-v2 --- .../assets/images/horizontal.svg | 0 .../{snowflake-export => snowflake-v2}/assets/images/square.svg | 0 integrations/{snowflake-export => snowflake-v2}/manifest.json | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename integrations/{snowflake-export => snowflake-v2}/assets/images/horizontal.svg (100%) rename integrations/{snowflake-export => snowflake-v2}/assets/images/square.svg (100%) rename integrations/{snowflake-export => snowflake-v2}/manifest.json (100%) diff --git a/integrations/snowflake-export/assets/images/horizontal.svg b/integrations/snowflake-v2/assets/images/horizontal.svg similarity index 100% rename from integrations/snowflake-export/assets/images/horizontal.svg rename to integrations/snowflake-v2/assets/images/horizontal.svg diff --git a/integrations/snowflake-export/assets/images/square.svg b/integrations/snowflake-v2/assets/images/square.svg similarity index 100% rename from integrations/snowflake-export/assets/images/square.svg rename to integrations/snowflake-v2/assets/images/square.svg diff --git a/integrations/snowflake-export/manifest.json b/integrations/snowflake-v2/manifest.json similarity index 100% rename from integrations/snowflake-export/manifest.json rename to integrations/snowflake-v2/manifest.json From cee6b5aac31fad4ddca9f2c8bea767a4ff0ad672 Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Tue, 3 Dec 2024 15:47:33 -0600 Subject: [PATCH 881/936] update RSA key isOptional values --- integrations/snowflake-experimentation/manifest.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 55b2bdd9..4ae2252d 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -38,7 +38,8 @@ "name": "Public key", "description": "This is your public key description", "type": "generated", - "hideEmpty": true + "hideEmpty": true, + "isOptional": true }, { "key": "privateKey", @@ -46,7 +47,8 @@ "description": "This is your private key description", "type": "string", "isHidden": true, - "isSecret": true + "isSecret": true, + "isOptional": true } ] } From add504759b832fbe8f28cc07c8a440975adec54e Mon Sep 17 00:00:00 2001 From: Autumn Winders Date: Tue, 3 Dec 2024 15:53:19 -0600 Subject: [PATCH 882/936] add default value --- integrations/snowflake-experimentation/manifest.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 4ae2252d..d700f1ed 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -39,6 +39,7 @@ "description": "This is your public key description", "type": "generated", "hideEmpty": true, + "defaultValue": "", "isOptional": true }, { @@ -48,6 +49,7 @@ "type": "string", "isHidden": true, "isSecret": true, + "defaultValue": "", "isOptional": true } ] From c22cb0999b621bb8c5da0d657eb45e78861d5bcb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:38:55 -0800 Subject: [PATCH 883/936] Bump path-to-regexp and express (#627) Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) to 0.1.12 and updates ancestor dependency [express](https://github.com/expressjs/express). These dependencies need to be updated together. Updates `path-to-regexp` from 0.1.10 to 0.1.12 - [Release notes](https://github.com/pillarjs/path-to-regexp/releases) - [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md) - [Commits](https://github.com/pillarjs/path-to-regexp/compare/v0.1.10...v0.1.12) Updates `express` from 4.21.1 to 4.21.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/4.21.2/History.md) - [Commits](https://github.com/expressjs/express/compare/4.21.1...4.21.2) --- updated-dependencies: - dependency-name: path-to-regexp dependency-type: indirect - dependency-name: express dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 34 +++++++++++++++++++--------------- package.json | 2 +- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5d55402e..d875f83b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "dateformat": "^4.5.1", - "express": "^4.21.1", + "express": "^4.21.2", "url-parse": "^1.5.9" }, "devDependencies": { @@ -2827,9 +2827,9 @@ } }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -2850,7 +2850,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -2865,6 +2865,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -5713,9 +5717,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -9351,9 +9355,9 @@ } }, "express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -9374,7 +9378,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -11504,9 +11508,9 @@ } }, "path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, "path-type": { "version": "4.0.0", diff --git a/package.json b/package.json index a8cd70d9..9d9c8bba 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ }, "dependencies": { "dateformat": "^4.5.1", - "express": "^4.21.1", + "express": "^4.21.2", "url-parse": "^1.5.9" } } From 96723b70dce035b7e5e0aad2081f055c6a94059f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 13:59:12 -0800 Subject: [PATCH 884/936] Bump cross-spawn from 7.0.3 to 7.0.6 (#617) Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6. - [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md) - [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6) --- updated-dependencies: - dependency-name: cross-spawn dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d875f83b..bc3c5a15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2343,9 +2343,9 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -8990,9 +8990,9 @@ "dev": true }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", From 69fde336a1c597bdc5e99bb495ec5c1f6e749672 Mon Sep 17 00:00:00 2001 From: awinders-launchdarkly <168487029+awinders-launchdarkly@users.noreply.github.com> Date: Tue, 10 Dec 2024 09:18:55 -0600 Subject: [PATCH 885/936] add new capability (#628) --- integrations/snowflake-v2/manifest.json | 2 +- manifest.schema.d.ts | 13 +++++++++++-- manifest.schema.json | 3 ++- schemas/base.json | 3 ++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/integrations/snowflake-v2/manifest.json b/integrations/snowflake-v2/manifest.json index fb00fb24..de997390 100644 --- a/integrations/snowflake-v2/manifest.json +++ b/integrations/snowflake-v2/manifest.json @@ -19,5 +19,5 @@ "legacy": { "kind": "dataExport" }, - "otherCapabilities": ["dataExport"] + "otherCapabilities": ["dataExport", "warehouseExport"] } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 04831029..d9591e2a 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -193,8 +193,17 @@ export type Kind = "codeRefs" | "datadog" | "dataExport" | "slackWebhooks" | "we * Capabilities not configured by manifests */ export type OtherCapabilities = [ - "codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks" | "warehouseExperimentation", - ...("codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks" | "warehouseExperimentation")[] + "codeRefs" | "dataExport" | "external" | "ide" | "sso" | "webhooks" | "warehouseExperimentation" | "warehouseExport", + ...( + | "codeRefs" + | "dataExport" + | "external" + | "ide" + | "sso" + | "webhooks" + | "warehouseExperimentation" + | "warehouseExport" + )[] ]; /** * Whether the integration authenticates using OAuth diff --git a/manifest.schema.json b/manifest.schema.json index a34ee3db..1c58d5ec 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -252,7 +252,8 @@ "ide", "sso", "webhooks", - "warehouseExperimentation" + "warehouseExperimentation", + "warehouseExport" ] } }, diff --git a/schemas/base.json b/schemas/base.json index a01e3b0f..cc82afeb 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -230,7 +230,8 @@ "ide", "sso", "webhooks", - "warehouseExperimentation" + "warehouseExperimentation", + "warehouseExport" ] } }, From 6fe353b632e2a6c5f65fca801a33ac7b28ce135d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Tue, 10 Dec 2024 15:59:14 +0000 Subject: [PATCH 886/936] [REL-4728] Create manifest for Fastly POC (#629) * Add first draft of Fastly manifest * Remove validation request * Update description of store ID field --- integrations/fastly/assets/horizontal.svg | 4 ++ integrations/fastly/assets/square.svg | 4 ++ integrations/fastly/manifest.json | 56 +++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 integrations/fastly/assets/horizontal.svg create mode 100644 integrations/fastly/assets/square.svg create mode 100644 integrations/fastly/manifest.json diff --git a/integrations/fastly/assets/horizontal.svg b/integrations/fastly/assets/horizontal.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/fastly/assets/horizontal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/fastly/assets/square.svg b/integrations/fastly/assets/square.svg new file mode 100644 index 00000000..799ca37f --- /dev/null +++ b/integrations/fastly/assets/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/fastly/manifest.json b/integrations/fastly/manifest.json new file mode 100644 index 00000000..202dd8e6 --- /dev/null +++ b/integrations/fastly/manifest.json @@ -0,0 +1,56 @@ +{ + "name": "Fastly", + "version": "1.0.0", + "overview": "Evaluate feature flags and bootstrap the LaunchDarkly Javascript SDK from Fastly Compute.", + "description": "Evaluate feature flags and bootstrap the LaunchDarkly Javascript SDK from Fastly Workers by storing flag data in Fastly's KV offering.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.fastly.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/fastly", + "privacyPolicy": "https://www.fastly.com/privacy" + }, + "categories": ["infrastructure"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "capabilities": { + "featureStore": { + "formVariables": [ + { + "key": "storeId", + "name": "KV Store ID", + "description": "The ID of the KV store to use for flag data.", + "type": "string", + "placeholder": "e.g. e6379ca0-17c2-4f58-bb8d-06ea232b01b5", + "isSecret": false + }, + { + "key": "apiToken", + "name": "API Token", + "description": "Enter a Fastly API token with Engineer permissions. Instructions for generating a [Fastly API token](https://www.fastly.com/documentation/reference/api/auth-tokens).", + "placeholder": "e.g. 8M7wS6hCpXVc-DoRnPPY_UCWPgy8aea4Wy6kCe5T", + "type": "string", + "isSecret": true + } + ], + "featureStoreRequest": { + "endpoint": { + "url": "https://api.fastly.com/resources/stores/kv/{{storeId}}/keys/{{_featureStoreKey}}", + "method": "PUT", + "headers": [ + { + "name": "Fastly-Key", + "value": "{{apiToken}}" + }, + { + "name": "Content-Type", + "value": "text/plain" + } + ] + } + } + } + } +} From 3b3ab08a242522b8118b93c6327c6385ebfaa414 Mon Sep 17 00:00:00 2001 From: Claire Anderson <22226315+cmaija@users.noreply.github.com> Date: Wed, 18 Dec 2024 15:54:56 -0800 Subject: [PATCH 887/936] (feat) SNE: Persist sync task id on SNE config (#631) Co-authored-by: Claire Anderson --- integrations/snowflake-experimentation/manifest.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index d700f1ed..19135382 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -51,6 +51,15 @@ "isSecret": true, "defaultValue": "", "isOptional": true + }, + { + "key": "syncTaskId", + "name": "Sync Task Id", + "description": "The task id of the sync task", + "type": "string", + "isHidden": true, + "isOptional": true, + "defaultValue": "" } ] } From 8c92ff5b63ddbe6a27a2129bf9c18e4a51719b20 Mon Sep 17 00:00:00 2001 From: awinders-launchdarkly <168487029+awinders-launchdarkly@users.noreply.github.com> Date: Tue, 7 Jan 2025 12:31:10 -0600 Subject: [PATCH 888/936] [EXPT-1536] change placeholder (#630) * change placeholder * disable after saving * update description * sentence case * more new copy * update private key description * fix overwrite * change word --- .../snowflake-experimentation/manifest.json | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 19135382..4729cc39 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -20,23 +20,25 @@ "formVariables": [ { "key": "snowflakeHostAddress", - "name": "Snowflake Host Address", - "description": "Description string", - "placeholder": "--your-value--.--region--.snowflakecomputing.com", + "name": "Snowflake host address", + "description": "Find the host address in the Snowflake UI under the Snowflake > Account menu.", + "placeholder": "https://..snowflakecomputing.com", "type": "string", + "disableAfterSaving": true, "isSecret": false }, { "key": "selectedEnv", "type": "environmentSelector", - "name": "Environment selector", - "description": "The LaunchDarkly environment to connect experimentation data to", + "name": "Project and environment", + "description": "Select your LaunchDarkly project and environment. You cannot edit this after you save the configuration.", + "disableAfterSaving": true, "isOptional": false }, { "key": "publicKey", "name": "Public key", - "description": "This is your public key description", + "description": "Copy this key into the Snowflake native app, in Step 3.", "type": "generated", "hideEmpty": true, "defaultValue": "", @@ -45,7 +47,7 @@ { "key": "privateKey", "name": "Private key", - "description": "This is your private key description", + "description": "The private key of the user created by the Snowflake connected app. Used internally for connecting to Snowflake.", "type": "string", "isHidden": true, "isSecret": true, From 8b353e37dd047335666ba47355dddbc3c8a4b27b Mon Sep 17 00:00:00 2001 From: Claire Anderson <22226315+cmaija@users.noreply.github.com> Date: Tue, 7 Jan 2025 12:45:18 -0800 Subject: [PATCH 889/936] (feat) add event last seen task id to manifest (#632) Co-authored-by: Claire Anderson Co-authored-by: Elizabeth Chatman --- integrations/snowflake-experimentation/manifest.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 4729cc39..5780f681 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -62,6 +62,15 @@ "isHidden": true, "isOptional": true, "defaultValue": "" + }, + { + "key": "eventTaskId", + "name": "Event Last Seen Task Id", + "description": "The task id of the event last seen task", + "type": "string", + "isHidden": true, + "isOptional": true, + "defaultValue": "" } ] } From 9c60786f61d46ccd06774b87a33a34f057f6eb70 Mon Sep 17 00:00:00 2001 From: awinders-launchdarkly <168487029+awinders-launchdarkly@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:00:26 -0600 Subject: [PATCH 890/936] copy changes for snowflake experimentation (#634) * copy changes for snowflake experimentation * update names and descriptions * update description --- integrations/snowflake-experimentation/manifest.json | 10 +++++----- integrations/snowflake-v2/manifest.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 5780f681..c8b09a5e 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -1,7 +1,7 @@ { - "name": "Snowflake", + "name": "Snowflake Native Experimentation", "version": "1.0.0", - "overview": "Analyze your Snowflake experimentation data with LaunchDarkly.", + "overview": "Run experiments in LaunchDarkly using Snowflake warehouse data to power your results.", "description": "Enable LaunchDarkly's experimentation platform to read and analyze data from your Snowflake data warehouse", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", @@ -20,8 +20,8 @@ "formVariables": [ { "key": "snowflakeHostAddress", - "name": "Snowflake host address", - "description": "Find the host address in the Snowflake UI under the Snowflake > Account menu.", + "name": "Snowflake account URL", + "description": "Find the account URL in the Snowflake UI under the Snowflake > Account menu.", "placeholder": "https://..snowflakecomputing.com", "type": "string", "disableAfterSaving": true, @@ -38,7 +38,7 @@ { "key": "publicKey", "name": "Public key", - "description": "Copy this key into the Snowflake native app, in Step 3.", + "description": "Copy this key into the Snowflake LaunchDarkly Experimentation app in step 4", "type": "generated", "hideEmpty": true, "defaultValue": "", diff --git a/integrations/snowflake-v2/manifest.json b/integrations/snowflake-v2/manifest.json index de997390..a4f0d2bb 100644 --- a/integrations/snowflake-v2/manifest.json +++ b/integrations/snowflake-v2/manifest.json @@ -1,7 +1,7 @@ { - "name": "Snowflake Export", + "name": "Snowflake Data Export", "version": "1.0.0", - "overview": "Export data to snowflake.", + "overview": "Run analysis in your warehouse enriched by experiment traffic data or detailed flag eval events.", "description": "Export Launchdarkly data to your Snowflake warehouse.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", From 09a3c1913138dd2478e9b6d6cae61a6c5cb7b873 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 16 Jan 2025 17:43:19 +0100 Subject: [PATCH 891/936] [REL-5363] add new flagCleanup capability (#635) * add new flagCleanup capability * fix formvariables * prettier --- manifest.schema.d.ts | 12 + manifest.schema.json | 488 +++++++++++++++++++++++++- schemas/base.json | 6 +- schemas/capabilities/flagCleanup.json | 24 ++ 4 files changed, 528 insertions(+), 2 deletions(-) create mode 100644 schemas/capabilities/flagCleanup.json diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index d9591e2a..bcdcbe3b 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -729,6 +729,10 @@ export type MeasuredRolloutRevertedTemplate = string; * Template to use for errorMonitoringNewIssueFound events */ export type ErrorMonitoringNewIssueFoundTemplate = string; +/** + * Form variables to use for flag cleanup + */ +export type FlagCleanupFormVariables = FormVariable[]; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -881,6 +885,7 @@ export interface Capabilities { bigSegmentStore?: BigSegmentStore; flagImport?: FlagImport; eventsHook?: EventsHook; + flagCleanup?: FlagCleanup; [k: string]: unknown; } /** @@ -1222,3 +1227,10 @@ export interface EDAEventsWebhookBodyTemplate { errorMonitoringNewIssueFound?: ErrorMonitoringNewIssueFoundTemplate; [k: string]: unknown; } +/** + * This capability allows LaunchDarkly to cleanup feature flags + */ +export interface FlagCleanup { + formVariables?: FlagCleanupFormVariables; + [k: string]: unknown; +} diff --git a/manifest.schema.json b/manifest.schema.json index 1c58d5ec..884a0d62 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -762,7 +762,8 @@ "syncedSegment", "bigSegmentStore", "flagImport", - "eventsHook" + "eventsHook", + "flagCleanup" ] }, "properties": { @@ -4791,6 +4792,491 @@ "templates", "endpoint" ] + }, + "flagCleanup": { + "$id": "#/properties/capability/flag-cleanup", + "title": "Flag Cleanup", + "description": "This capability allows LaunchDarkly to cleanup feature flags", + "type": "object", + "propertyNames": { + "enum": [ + "formVariables" + ] + }, + "properties": { + "formVariables": { + "$id": "#/capabilities/flag-cleanup/form-variables", + "title": "Flag Cleanup Form Variables", + "description": "Form variables to use for flag cleanup", + "type": "array", + "items": { + "$id": "#/definitions/form-variable", + "title": "Form variable", + "description": "A form variable describes an object property that the LaunchDarkly admin will be prompted for when they configure an integration.", + "type": "object", + "propertyNames": { + "enum": [ + "key", + "name", + "type", + "description", + "placeholder", + "isSecret", + "isHidden", + "isOptional", + "defaultValue", + "allowedValues", + "dynamicOptions", + "dependsOn", + "multiselectOptions", + "multiselectDefaultOptions", + "disableAfterSaving", + "hideEmpty" + ] + }, + "properties": { + "key": { + "$id": "#/definitions/form-variable/key", + "title": "Key", + "type": "string", + "description": "A key will be used as the token name when the variable is substituted", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "name": { + "$id": "#/definitions/form-variable/name", + "title": "Name", + "type": "string", + "description": "A descriptive name that will be used as the form label on the UI", + "maxLength": 50 + }, + "type": { + "$id": "#/definitions/form-variable/type", + "title": "Type", + "type": "string", + "description": "The type of the variable", + "enum": [ + "string", + "boolean", + "uri", + "enum", + "oauth", + "dynamicEnum", + "generated", + "environmentSelector", + "multiselect" + ] + }, + "description": { + "$id": "#/definitions/form-variable/description", + "title": "Description", + "type": "string", + "description": "Describes the variable in the UI. Markdown links allowed.", + "maxLength": 250 + }, + "placeholder": { + "$id": "#/definitions/form-variable/placeholder", + "title": "Description", + "type": "string", + "description": "Placeholder value to use in the form element if applicable" + }, + "isSecret": { + "$id": "#/definitions/form-variable/is-secret", + "title": "Is this variable a secret?", + "type": "boolean", + "description": "Secret variables will be masked in the UI", + "default": false + }, + "disableAfterSaving": { + "$id": "#/definitions/form-variable/disable-after-saving", + "title": "Disable after saving", + "type": "boolean", + "description": "Variables marked as disabled after saving won't be editable after they are saved", + "default": false + }, + "isOptional": { + "$id": "#/definitions/form-variable/is-optional", + "title": "Is this variable optional?", + "type": "boolean", + "description": "Variables marked as optional won't be required on the UI", + "default": false + }, + "isHidden": { + "$id": "#/definitions/form-variable/is-hidden", + "title": "Hide variable in the UI", + "type": "boolean", + "description": "Variables marked as hidden won't be displayed on the UI", + "default": false + }, + "defaultValue": { + "$id": "#/definitions/form-variable/default-value", + "title": "Default value", + "type": [ + "boolean", + "string" + ], + "description": "Default value for variable. Can be overridden by the user in the UI" + }, + "allowedValues": { + "$id": "#/definitions/form-variable/allowed-values", + "title": "Allowed values", + "type": "array", + "description": "Allowed string values for enum-type formVariables", + "items": { + "type": "string" + } + }, + "dynamicOptions": { + "$id": "#/definitions/form-variable/dynamic-options", + "title": "Dynamic options", + "type": "object", + "description": "Parser and endpoint for handling dynamicEnum", + "propertyNames": { + "enum": [ + "endpoint", + "parser" + ] + }, + "required": [ + "endpoint", + "parser" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers", + "hmacSignature" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } + } + }, + "required": [ + "url", + "method" + ] + }, + "parser": { + "$id": "#/definitions/form-variable/dynamic-options/parser", + "title": "Dynamic options parser", + "description": "Mapping of property names to location in JSON response", + "type": "object", + "required": [ + "optionsPath", + "optionsItems" + ], + "propertyNames": { + "enum": [ + "optionsPath", + "optionsItems" + ] + }, + "properties": { + "optionsPath": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-path", + "title": "Options array path", + "description": "JSON path to the array containing options for parsing", + "type": "string" + }, + "optionsItems": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items", + "title": "Options array", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/label", + "title": "Label", + "description": "Relative JSON path to values for each item in the options array to be used as UI dropdown labels", + "type": "string" + }, + "value": { + "$id": "#/definitions/form-variable/dynamic-options/parser/options-items/value", + "title": "Value", + "description": "Relative JSON path to values for each item in the options array to be used as dropdown values", + "type": "string" + } + } + } + } + } + } + }, + "dependsOn": { + "$id": "#/definitions/form-variable/depends-on", + "title": "Depends on", + "type": "array", + "description": "Dependency configuration to control the state and visibility of the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "variableKey", + "variableLocation", + "conditions", + "action" + ] + }, + "required": [ + "variableKey", + "variableLocation", + "conditions", + "action" + ], + "properties": { + "variableKey": { + "$id": "#/definitions/form-variable/depends-on/dependee-key", + "title": "Variable key", + "type": "string", + "description": "Key for the form variable that this form field depends on", + "maxLength": 20, + "pattern": "^[^\\s]*$" + }, + "variableLocation": { + "$id": "#/definitions/form-variable/depends-on/dependee-key-location", + "title": "Variable Location", + "type": "string", + "description": "Which form variable type is the variable key defined or located in?", + "enum": [ + "approvalFormVariables", + "environmentFormVariables", + "formVariables" + ] + }, + "action": { + "$id": "#/definitions/form-variable/depends-on/action", + "title": "Action", + "type": "string", + "enum": [ + "hideField", + "showField" + ], + "description": "Action to be taken when your defined conditions evaluates to true" + }, + "conditions": { + "$id": "#/definitions/form-variable/depends-on/conditions", + "title": "Conditions", + "type": "array", + "description": "Conditional configurations to be evaluated to decide whether an action should taken for the form field.", + "items": { + "type": "object", + "propertyNames": { + "enum": [ + "operator", + "value" + ] + }, + "required": [ + "operator", + "value" + ], + "properties": { + "operator": { + "$id": "#/definitions/form-variable/depends-on/conditions/operator", + "title": "Operator", + "type": "string", + "description": "Name of the operator for evaluating a condition.", + "enum": [ + "lessThan", + "lessThanOrEqualTo", + "greaterThan", + "greaterThanOrEqualTo", + "equalTo", + "notEqual", + "contains", + "startsWith", + "endsWith" + ] + }, + "value": { + "$id": "#/definitions/form-variable/depends-on/conditions/value", + "title": "Value", + "type": "string", + "maxLength": 250, + "description": "Target value that conditions are evaluated against" + } + } + } + } + } + } + }, + "multiselectOptions": { + "$id": "#/definitions/form-variable/multi-select-options", + "title": "Options array", + "type": "array", + "items": { + "$id": "#/definitions/multiselect-option-item", + "title": "Multi select option item", + "description": "A multi select option item", + "type": "object", + "propertyNames": { + "enum": [ + "label", + "value" + ] + }, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "$id": "#/definitions/multiselect-option-item/label", + "title": "Label", + "description": "Label of the multi select option", + "type": "string" + }, + "value": { + "$id": "#/definitions/multiselect-option-item/value", + "title": "Value", + "description": "Value of the multi select option", + "type": "string" + } + } + } + }, + "multiselectDefaultOptions": { + "$id": "#/definitions/form-variable/multiselect-default-options", + "title": "Multi select default options", + "type": "array", + "description": "Default options to be selected when the multi select is first rendered", + "items": { + "type": "string" + } + }, + "hideEmpty": { + "$id": "#/definitions/form-variable/hide-empty", + "title": "Hide value in UI when empty", + "type": "boolean", + "description": "Variables marked as hideEmpty won't be shown in the UI if they are empty", + "default": false + } + }, + "required": [ + "key", + "name", + "type", + "description" + ] + }, + "default": [] + } + } } } }, diff --git a/schemas/base.json b/schemas/base.json index cc82afeb..cfb9f32f 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -278,7 +278,8 @@ "syncedSegment", "bigSegmentStore", "flagImport", - "eventsHook" + "eventsHook", + "flagCleanup" ] }, "properties": { @@ -320,6 +321,9 @@ }, "eventsHook": { "$ref": "schemas/capabilities/eventsHook.json#/eventsHook" + }, + "flagCleanup": { + "$ref": "schemas/capabilities/flagCleanup.json#/flagCleanup" } } }, diff --git a/schemas/capabilities/flagCleanup.json b/schemas/capabilities/flagCleanup.json new file mode 100644 index 00000000..9ae25f35 --- /dev/null +++ b/schemas/capabilities/flagCleanup.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "flagCleanup": { + "$id": "#/properties/capability/flag-cleanup", + "title": "Flag Cleanup", + "description": "This capability allows LaunchDarkly to cleanup feature flags", + "type": "object", + "propertyNames": { + "enum": ["formVariables"] + }, + "properties": { + "formVariables": { + "$id": "#/capabilities/flag-cleanup/form-variables", + "title": "Flag Cleanup Form Variables", + "description": "Form variables to use for flag cleanup", + "type": "array", + "items": { + "$ref": "../definitions.json#/formVariable" + }, + "default": [] + } + } + } +} From 38ea8fc79cd400e1adf7bd3cb24b654004d65a1b Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 17 Jan 2025 11:31:18 +0100 Subject: [PATCH 892/936] [REL-5366] Ffeldberg/rel 5366/add a manifest for the gitar integration (#636) * add manifest for gitar integration * allow integration configurations for manifest * fix manifest * remove other capabilities --- integrations/gitar/LICENSE.md | 13 +++++++ .../gitar/assets/images/horizontal.svg | 8 +++++ integrations/gitar/assets/images/square.svg | 4 +++ integrations/gitar/manifest.json | 34 +++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 integrations/gitar/LICENSE.md create mode 100644 integrations/gitar/assets/images/horizontal.svg create mode 100644 integrations/gitar/assets/images/square.svg create mode 100644 integrations/gitar/manifest.json diff --git a/integrations/gitar/LICENSE.md b/integrations/gitar/LICENSE.md new file mode 100644 index 00000000..9826bf24 --- /dev/null +++ b/integrations/gitar/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2025 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/gitar/assets/images/horizontal.svg b/integrations/gitar/assets/images/horizontal.svg new file mode 100644 index 00000000..fd8d7781 --- /dev/null +++ b/integrations/gitar/assets/images/horizontal.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/integrations/gitar/assets/images/square.svg b/integrations/gitar/assets/images/square.svg new file mode 100644 index 00000000..b3c7dcb6 --- /dev/null +++ b/integrations/gitar/assets/images/square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/integrations/gitar/manifest.json b/integrations/gitar/manifest.json new file mode 100644 index 00000000..fba0b60e --- /dev/null +++ b/integrations/gitar/manifest.json @@ -0,0 +1,34 @@ +{ + "name": "Gitar", + "version": "1.0.0", + "overview": "Use the Gitar Github App in order to automatically clean up LaunchDarkly flags in your code.", + "description": "Use the Gitar Github App in order to automatically clean up LaunchDarkly flags in your code", + "details": "Use the Gitar Github App in order to automatically clean up LaunchDarkly flags in your code", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://gitar.ai", + "launchdarklyDocs": "https://docs.launchdarkly.com/home/", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["automation", "code-references", "developer-tools"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/square.svg" + }, + "capabilities": { + "flagCleanup": { + "formVariables": [ + { + "name": "Gitar API Key", + "key": "gitarToken", + "type": "string", + "isSecret": true, + "description": "The API key for your Gitar account", + "isOptional": false + } + ] + } + }, + "allowIntegrationConfigurations": true +} From 1af29ee7cdd5f7e41c50c3bfe91d5249e44fcf37 Mon Sep 17 00:00:00 2001 From: Fabian Date: Fri, 17 Jan 2025 16:09:08 +0100 Subject: [PATCH 893/936] [REL-5366] add field for github org name and move formVariables (#637) * add field for github org name * move formVariables up --- integrations/gitar/manifest.json | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/integrations/gitar/manifest.json b/integrations/gitar/manifest.json index fba0b60e..28a03ad7 100644 --- a/integrations/gitar/manifest.json +++ b/integrations/gitar/manifest.json @@ -17,18 +17,25 @@ "horizontal": "assets/images/square.svg" }, "capabilities": { - "flagCleanup": { - "formVariables": [ - { - "name": "Gitar API Key", - "key": "gitarToken", - "type": "string", - "isSecret": true, - "description": "The API key for your Gitar account", - "isOptional": false - } - ] - } + "flagCleanup": {} }, + "formVariables": [ + { + "name": "Gitar API Key", + "key": "gitarToken", + "type": "string", + "isSecret": true, + "description": "The API key for your Gitar account", + "isOptional": false + }, + { + "name": "Github Organisation Name", + "key": "githubOrgName", + "type": "string", + "isSecret": false, + "description": "The name of the Github organisation you want to clean up", + "isOptional": false + } + ], "allowIntegrationConfigurations": true } From e2d2e4a1de7a25663eef0837da73012ebf91a6c8 Mon Sep 17 00:00:00 2001 From: awinders-launchdarkly <168487029+awinders-launchdarkly@users.noreply.github.com> Date: Fri, 24 Jan 2025 11:52:38 -0600 Subject: [PATCH 894/936] add new form variable to better support public keys (#638) --- manifest.schema.d.ts | 3 ++- manifest.schema.json | 15 ++++++++++----- schemas/definitions.json | 3 ++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index bcdcbe3b..32a12e7f 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -233,7 +233,8 @@ export type Type = | "dynamicEnum" | "generated" | "environmentSelector" - | "multiselect"; + | "multiselect" + | "publicKey"; /** * Describes the variable in the UI. Markdown links allowed. */ diff --git a/manifest.schema.json b/manifest.schema.json index 884a0d62..f630b3fa 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -331,7 +331,8 @@ "dynamicEnum", "generated", "environmentSelector", - "multiselect" + "multiselect", + "publicKey" ] }, "description": { @@ -1309,7 +1310,8 @@ "dynamicEnum", "generated", "environmentSelector", - "multiselect" + "multiselect", + "publicKey" ] }, "description": { @@ -1781,7 +1783,8 @@ "dynamicEnum", "generated", "environmentSelector", - "multiselect" + "multiselect", + "publicKey" ] }, "description": { @@ -3289,7 +3292,8 @@ "dynamicEnum", "generated", "environmentSelector", - "multiselect" + "multiselect", + "publicKey" ] }, "description": { @@ -4864,7 +4868,8 @@ "dynamicEnum", "generated", "environmentSelector", - "multiselect" + "multiselect", + "publicKey" ] }, "description": { diff --git a/schemas/definitions.json b/schemas/definitions.json index 9108d2d1..fcd3c401 100644 --- a/schemas/definitions.json +++ b/schemas/definitions.json @@ -188,7 +188,8 @@ "dynamicEnum", "generated", "environmentSelector", - "multiselect" + "multiselect", + "publicKey" ] }, "description": { From f61a7dd6a35e2270c62aebad7f70de462bf1ac66 Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 27 Jan 2025 11:04:49 +0100 Subject: [PATCH 895/936] [REL-5585] send date field for splunk integration (#639) * send date field for splunk integration * switch field name to timestamp --- integrations/splunk/templates/template.json.hbs | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/splunk/templates/template.json.hbs b/integrations/splunk/templates/template.json.hbs index fedd2d4a..c18bfcb6 100644 --- a/integrations/splunk/templates/template.json.hbs +++ b/integrations/splunk/templates/template.json.hbs @@ -5,6 +5,7 @@ "kind": "{{kind}}", "action": "{{{verbKind}}}", "description": "{{{details.plainText}}}", + "timestamp": "{{timestamp.seconds}}", {{#equal kind 'flag'}} "flag_name": "{{name}}", "flag_key": "{{key}}", From b4f2af781ced13db21e8f2f24937933bf25d8abf Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 31 Jan 2025 16:09:16 +0000 Subject: [PATCH 896/936] Update COCDEOWNERS (#640) --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index f32e2bbc..0da4a455 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,3 +1,3 @@ # These owners will be the default owners for everything in the repo. -* @launchdarkly/team-ecosystem @launchdarkly/team-release-backend +* @launchdarkly/team-enterprise From fc6ca9deb94bd3a514b54b9a05a425b975d9274a Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 31 Jan 2025 16:17:58 +0000 Subject: [PATCH 897/936] Backmerge public (#641) --- integrations/chronosphere/manifest.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/chronosphere/manifest.json b/integrations/chronosphere/manifest.json index bf3173e8..7b9dd5cf 100644 --- a/integrations/chronosphere/manifest.json +++ b/integrations/chronosphere/manifest.json @@ -39,12 +39,12 @@ { "name": "Content-Type", "value": "application/json" - }, - { - "name": "X-LD-Signature", - "value": "{{secretToken}}" } - ] + ], + "hmacSignature": { + "headerName": "X-LD-Signature", + "hmacSecretFormVariableKey": "secretToken" + } }, "templates": { "default": "templates/default.json.hbs" From 0cd31ec81fbdfca76b3bb90202ba6923cc922faa Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 7 Feb 2025 17:17:09 +0000 Subject: [PATCH 898/936] ServiceNow Normal: add the option to skip change window (#643) --- integrations/servicenow-normal/manifest.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/integrations/servicenow-normal/manifest.json b/integrations/servicenow-normal/manifest.json index f224abf1..da845a62 100644 --- a/integrations/servicenow-normal/manifest.json +++ b/integrations/servicenow-normal/manifest.json @@ -91,6 +91,14 @@ "type": "boolean", "defaultValue": false, "isOptional": true + }, + { + "key": "doNotSetDates", + "name": "Do not populate change window", + "description": "If unchecked, LaunchDarkly will automatically populate the change window on the ServiceNow Change Request.", + "type": "boolean", + "defaultValue": false, + "isOptional": true } ], "creationRequest": { @@ -104,7 +112,7 @@ } ] }, - "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", {{#if approvalFormVariables.implementationPlan}}\"implementation_plan\": \"{{{approvalFormVariables.implementationPlan}}}\",{{/if}} {{#if approvalFormVariables.configurationItem}}\"cmdb_ci\": \"{{{approvalFormVariables.configurationItem}}}\",{{/if}} \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\", \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\"}", + "jsonBody": "{\"short_description\": \"{{{title.plainText}}}\", {{#if approvalFormVariables.implementationPlan}}\"implementation_plan\": \"{{{approvalFormVariables.implementationPlan}}}\",{{/if}} {{#if approvalFormVariables.configurationItem}}\"cmdb_ci\": \"{{{approvalFormVariables.configurationItem}}}\",{{/if}} \"{{#if environmentFormVariables.detail_column}}{{environmentFormVariables.detail_column}}{{else}}justification{{/if}}\": \"{{_links.approval.href}}\\n\\n{{{details.plainText}}}\", \"requested_by\": \"{{{member.externalId}}}\" {{#unless environmentFormVariables.doNotSetDates}}, \"start_date\": \"{{timestamp.simple}}\", \"end_date\": \"{{formatWithOffset timestamp.milliseconds 301 'simple'}}\"{{/unless}} }", "parser": { "approvalId": "/result/sys_id/value", "statusValue": "/result/state/value", From a107c7ea2666b0465bfb13afb9e6ab9998dfc028 Mon Sep 17 00:00:00 2001 From: awinders-launchdarkly <168487029+awinders-launchdarkly@users.noreply.github.com> Date: Fri, 7 Feb 2025 14:14:43 -0600 Subject: [PATCH 899/936] use publicKey formvariable type (#644) --- integrations/snowflake-experimentation/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index c8b09a5e..148e7a35 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -39,7 +39,7 @@ "key": "publicKey", "name": "Public key", "description": "Copy this key into the Snowflake LaunchDarkly Experimentation app in step 4", - "type": "generated", + "type": "publicKey", "hideEmpty": true, "defaultValue": "", "isOptional": true From 5409b8e5fafbe40cd87955c5e53359e8e10b6d2d Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 10 Feb 2025 16:07:55 +0000 Subject: [PATCH 900/936] feat(fastly): add official assets (#645) * Add horizontal logo * Add official fastly svgs --- integrations/fastly/assets/horizontal.svg | 5 +---- integrations/fastly/assets/square.svg | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/integrations/fastly/assets/horizontal.svg b/integrations/fastly/assets/horizontal.svg index 799ca37f..ea959cb6 100644 --- a/integrations/fastly/assets/horizontal.svg +++ b/integrations/fastly/assets/horizontal.svg @@ -1,4 +1 @@ - - - - + diff --git a/integrations/fastly/assets/square.svg b/integrations/fastly/assets/square.svg index 799ca37f..1df2a51a 100644 --- a/integrations/fastly/assets/square.svg +++ b/integrations/fastly/assets/square.svg @@ -1,4 +1 @@ - - - - + From b2c5a1e3733482fb6cbb99f2ae4b090e2b465aca Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Mon, 17 Feb 2025 12:13:37 +0000 Subject: [PATCH 901/936] chore: disable Jira Issue linker comments (#646) --- .github/workflows/jira_linker.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/jira_linker.yml b/.github/workflows/jira_linker.yml index 309a5195..f4d7fdd5 100644 --- a/.github/workflows/jira_linker.yml +++ b/.github/workflows/jira_linker.yml @@ -9,9 +9,10 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'launchdarkly/integration-framework-private' steps: - - uses: launchdarkly-labs/ld-gh-actions-jira@7d61c90e8fc29c3ce8e3f0fb55d963afd084a359 + - uses: launchdarkly-labs/ld-gh-actions-jira@f32de8780a3f149939408afb1563663b9a80e902 with: github-token: ${{ secrets.GITHUB_TOKEN }} jira-base-url: https://launchdarkly.atlassian.net jira-username: ${{ secrets.JIRA_USERNAME }} jira-api-token: ${{ secrets.JIRA_API_TOKEN }} + update-description: true From d3c74cd1a5a122025c52639507ecb4676f1d38b6 Mon Sep 17 00:00:00 2001 From: Molly Date: Wed, 26 Feb 2025 09:25:22 -0800 Subject: [PATCH 902/936] [DOCS-835] docs: copy updates to Gitar manifest.json (#642) * GitHub casing; US English spelling * eventual docs link * Apply suggestions from code review --- integrations/gitar/manifest.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/integrations/gitar/manifest.json b/integrations/gitar/manifest.json index 28a03ad7..f8b74f56 100644 --- a/integrations/gitar/manifest.json +++ b/integrations/gitar/manifest.json @@ -1,14 +1,14 @@ { "name": "Gitar", "version": "1.0.0", - "overview": "Use the Gitar Github App in order to automatically clean up LaunchDarkly flags in your code.", - "description": "Use the Gitar Github App in order to automatically clean up LaunchDarkly flags in your code", - "details": "Use the Gitar Github App in order to automatically clean up LaunchDarkly flags in your code", + "overview": "Use the Gitar GitHub App in order to automatically clean up LaunchDarkly flags in your code.", + "description": "Use the Gitar GitHub App in order to automatically clean up LaunchDarkly flags in your code", + "details": "Use the Gitar GitHub App in order to automatically clean up LaunchDarkly flags in your code", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://gitar.ai", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/observability/code-cleanup", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["automation", "code-references", "developer-tools"], @@ -21,7 +21,7 @@ }, "formVariables": [ { - "name": "Gitar API Key", + "name": "Gitar API key", "key": "gitarToken", "type": "string", "isSecret": true, @@ -29,11 +29,11 @@ "isOptional": false }, { - "name": "Github Organisation Name", + "name": "GitHub organization name", "key": "githubOrgName", "type": "string", "isSecret": false, - "description": "The name of the Github organisation you want to clean up", + "description": "The name of the GitHub organization you want to clean up", "isOptional": false } ], From b97f55225023027292bdb730e57ef3311d85d6fe Mon Sep 17 00:00:00 2001 From: Molly Date: Wed, 26 Feb 2025 10:43:49 -0800 Subject: [PATCH 903/936] update launchdarklyDocs manifest links to use new URLs (#650) --- integrations/adfs/manifest.json | 2 +- integrations/akamai-edgeworkers/manifest.json | 2 +- integrations/amplitude/manifest.json | 2 +- integrations/ansible/manifest.json | 2 +- integrations/appdynamics/README.md | 2 +- integrations/appdynamics/manifest.json | 2 +- integrations/azure-devops/manifest.json | 2 +- integrations/azure-event-hubs/manifest.json | 2 +- integrations/azure-sso/manifest.json | 4 ++-- integrations/bitbucket-flags/manifest.json | 6 +++--- integrations/bitbucket/manifest.json | 2 +- integrations/bitrise/manifest.json | 2 +- integrations/census-synced-segments/manifest.json | 2 +- integrations/chronosphere/README.md | 2 +- integrations/chronosphere/manifest.json | 2 +- integrations/circleci-coderefs/manifest.json | 2 +- integrations/cloudflare/manifest.json | 2 +- integrations/cloudtrail/manifest.json | 4 ++-- integrations/compass/manifest.json | 2 +- integrations/confluence-embedded-pages/manifest.json | 2 +- integrations/cortex/manifest.json | 2 +- integrations/ctrlstack/manifest.json | 2 +- integrations/custom-approvals/manifest.json | 2 +- integrations/datadog-flag-trigger/manifest.json | 2 +- integrations/datadog-legacy/manifest.json | 2 +- integrations/datadog-private/README.md | 2 +- integrations/datadog-private/manifest.json | 2 +- integrations/datadog-rum/manifest.json | 2 +- integrations/datadog/README.md | 2 +- integrations/datadog/manifest.json | 4 ++-- integrations/ditto/manifest.json | 2 +- integrations/dynamodb/manifest.json | 2 +- integrations/dynatrace-cloud-automation/manifest.json | 4 ++-- integrations/dynatrace/README.md | 2 +- integrations/dynatrace/manifest.json | 4 ++-- integrations/elastic/README.md | 2 +- integrations/elastic/manifest.json | 2 +- .../example-synced-segment-integration1/manifest.json | 2 +- .../example-synced-segment-integration2/manifest.json | 2 +- integrations/fastly/manifest.json | 2 +- integrations/fulcrum/manifest.json | 2 +- integrations/fullstory/manifest.json | 2 +- integrations/generic-feature-store/manifest.json | 4 ++-- integrations/generic-trigger/README.md | 2 +- integrations/generic-trigger/manifest.json | 4 ++-- integrations/git/manifest.json | 2 +- integrations/github-actions-flag-evaluations/manifest.json | 2 +- integrations/github/manifest.json | 4 ++-- integrations/gitlab/manifest.json | 2 +- integrations/google-pubsub/manifest.json | 2 +- integrations/googleapps-sso/manifest.json | 2 +- integrations/grafana/README.md | 2 +- integrations/grafana/manifest.json | 2 +- integrations/heap-inbound/manifest.json | 2 +- integrations/heap/manifest.json | 2 +- integrations/hightouch/manifest.json | 2 +- integrations/honeycomb/README.md | 2 +- integrations/honeycomb/manifest.json | 4 ++-- integrations/intellij/manifest.json | 2 +- integrations/jira/manifest.json | 4 ++-- integrations/kinesis/manifest.json | 2 +- integrations/last9/manifest.json | 2 +- integrations/ld-to-git/manifest.json | 4 ++-- integrations/logdna/README.md | 2 +- integrations/logdna/manifest.json | 4 ++-- integrations/mparticle/manifest.json | 2 +- integrations/msteams-app/manifest.json | 2 +- integrations/msteams/README.md | 2 +- integrations/msteams/manifest.json | 4 ++-- integrations/netlify/manifest.json | 2 +- integrations/new-relic-apm-insights/README.md | 2 +- integrations/new-relic-apm-insights/manifest.json | 2 +- integrations/new-relic-apm/README.md | 2 +- integrations/new-relic-apm/manifest.json | 4 ++-- integrations/new-relic/README.md | 2 +- integrations/new-relic/manifest.json | 2 +- integrations/okta/manifest.json | 2 +- integrations/onelogin/manifest.json | 2 +- integrations/osano/manifest.json | 2 +- integrations/pagerduty-guardian-edition/manifest.json | 2 +- integrations/pagerduty/manifest.json | 2 +- integrations/pendo/manifest.json | 2 +- integrations/port/manifest.json | 2 +- integrations/redis/manifest.json | 2 +- integrations/release/manifest.json | 2 +- integrations/resmo/manifest.json | 2 +- integrations/roadie/manifest.json | 2 +- integrations/rudderstack/manifest.json | 2 +- integrations/segment-audiences/manifest.json | 2 +- integrations/segment-inbound/manifest.json | 2 +- integrations/segment/manifest.json | 2 +- integrations/sentry/manifest.json | 2 +- integrations/servicenow-app/manifest.json | 2 +- integrations/servicenow-c0/manifest.json | 4 ++-- integrations/servicenow-normal/manifest.json | 2 +- integrations/servicenow/manifest.json | 2 +- integrations/signalfx/README.md | 2 +- integrations/signalfx/manifest.json | 4 ++-- integrations/slack-app/manifest.json | 4 ++-- integrations/slack-webhooks/manifest.json | 2 +- integrations/sleuth/manifest.json | 2 +- integrations/snowflake-experimentation/manifest.json | 2 +- integrations/snowflake-v2/manifest.json | 2 +- integrations/snowflake/manifest.json | 2 +- integrations/snowplow/manifest.json | 2 +- integrations/split/manifest.json | 2 +- integrations/splunk/README.md | 2 +- integrations/splunk/manifest.json | 2 +- integrations/sprig/manifest.json | 2 +- integrations/sumatra-synced-segments/manifest.json | 2 +- integrations/tealium-inbound/manifest.json | 2 +- integrations/terraform-cloud/manifest.json | 2 +- integrations/terraform/manifest.json | 2 +- integrations/tray/manifest.json | 2 +- integrations/trello/manifest.json | 2 +- integrations/unleash/manifest.json | 2 +- integrations/vercel/manifest.json | 2 +- integrations/vscode/manifest.json | 2 +- integrations/webhooks/manifest.json | 4 ++-- integrations/zendesk/manifest.json | 2 +- integrations/zeotap/manifest.json | 2 +- 121 files changed, 141 insertions(+), 141 deletions(-) diff --git a/integrations/adfs/manifest.json b/integrations/adfs/manifest.json index a1c46048..70ec469d 100644 --- a/integrations/adfs/manifest.json +++ b/integrations/adfs/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://docs.microsoft.com/en-us/windows-server/identity/active-directory-federation-services", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/account-security/adfs", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/account/adfs", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/akamai-edgeworkers/manifest.json b/integrations/akamai-edgeworkers/manifest.json index 6e88cbe9..98de06e8 100644 --- a/integrations/akamai-edgeworkers/manifest.json +++ b/integrations/akamai-edgeworkers/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.akamai.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/akamai", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/akamai", "privacyPolicy": "https://www.akamai.com/legal/compliance/privacy-trust-center/" }, "categories": ["infrastructure"], diff --git a/integrations/amplitude/manifest.json b/integrations/amplitude/manifest.json index ac4e41cb..42e7bd1b 100644 --- a/integrations/amplitude/manifest.json +++ b/integrations/amplitude/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.amplitude.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/amplitude", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/amplitude", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, "categories": ["synced-segments"], diff --git a/integrations/ansible/manifest.json b/integrations/ansible/manifest.json index 28f01437..c5cd65e5 100644 --- a/integrations/ansible/manifest.json +++ b/integrations/ansible/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://galaxy.ansible.com/launchdarkly_labs/collection", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/ansible", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/ansible", "supportWebsite": "https://github.com/launchdarkly-labs/ansible-launchdarkly-collection/issues", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, diff --git a/integrations/appdynamics/README.md b/integrations/appdynamics/README.md index 19e20e1b..902d1697 100644 --- a/integrations/appdynamics/README.md +++ b/integrations/appdynamics/README.md @@ -1,6 +1,6 @@ # AppDynamics -[LaunchDarkly documentation](https://docs.launchdarkly.com/integrations/appdynamics) +[LaunchDarkly documentation](https://launchdarkly.com/docs/integrations/appdynamics) ## Setup diff --git a/integrations/appdynamics/manifest.json b/integrations/appdynamics/manifest.json index ee7a907d..e0d0703d 100644 --- a/integrations/appdynamics/manifest.json +++ b/integrations/appdynamics/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.appdynamics.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/appdynamics", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/appdynamics", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring"], diff --git a/integrations/azure-devops/manifest.json b/integrations/azure-devops/manifest.json index 3bef8d6d..1d017350 100644 --- a/integrations/azure-devops/manifest.json +++ b/integrations/azure-devops/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://azure.microsoft.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/azure-devops", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/azure-devops", "privacyPolicy": "https://privacy.microsoft.com/en-US/privacystatement" }, "categories": ["automation"], diff --git a/integrations/azure-event-hubs/manifest.json b/integrations/azure-event-hubs/manifest.json index b86c3cb1..e88ba5cd 100644 --- a/integrations/azure-event-hubs/manifest.json +++ b/integrations/azure-event-hubs/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://azure.microsoft.com/en-us/services/event-hubs/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/event-hub", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/data-export/event-hub", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/azure-sso/manifest.json b/integrations/azure-sso/manifest.json index dcc9af9f..d06043de 100644 --- a/integrations/azure-sso/manifest.json +++ b/integrations/azure-sso/manifest.json @@ -7,8 +7,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/home/account-security/azure", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/account-security/azure", + "site": "https://launchdarkly.com/docs/home/account/entra", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/account/entra", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/bitbucket-flags/manifest.json b/integrations/bitbucket-flags/manifest.json index 3ea82e12..ac812dae 100644 --- a/integrations/bitbucket-flags/manifest.json +++ b/integrations/bitbucket-flags/manifest.json @@ -8,9 +8,9 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://bitbucket.org/product/features/pipelines", - "supportWebsite": "https://docs.launchdarkly.com/integrations/bitbucket-pipelines", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/bitbucket-pipelines", - "privacyPolicy": "https://docs.launchdarkly.com/home/code/code-references#configuring-context-lines" + "supportWebsite": "https://launchdarkly.com/docs/integrations/bitbucket-pipelines", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/bitbucket-pipelines", + "privacyPolicy": "https://launchdarkly.com/docs/home/observability/code-references#configure-context-lines" }, "categories": ["automation", "developer-tools"], "icons": { diff --git a/integrations/bitbucket/manifest.json b/integrations/bitbucket/manifest.json index e891addc..16c38515 100644 --- a/integrations/bitbucket/manifest.json +++ b/integrations/bitbucket/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://bitbucket.org/product/features/pipelines", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/code/bitbucket", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/observability/bitbucket", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/bitrise/manifest.json b/integrations/bitrise/manifest.json index b0d2ccd1..bf51ecf1 100644 --- a/integrations/bitrise/manifest.json +++ b/integrations/bitrise/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@bitrise.io", "links": { "site": "https://bitrise.io", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/bitrise", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/bitrise", "privacyPolicy": "https://go.bitrise.io/privacy-policy" }, "categories": ["automation"], diff --git a/integrations/census-synced-segments/manifest.json b/integrations/census-synced-segments/manifest.json index e9bdfc83..3db091b3 100644 --- a/integrations/census-synced-segments/manifest.json +++ b/integrations/census-synced-segments/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@getcensus.com", "links": { "site": "https://www.getcensus.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/census", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/census", "privacyPolicy": "https://www.getcensus.com/legal/privacy-policy" }, "categories": ["data", "infrastructure", "automation"], diff --git a/integrations/chronosphere/README.md b/integrations/chronosphere/README.md index 5fcafc55..f9378613 100644 --- a/integrations/chronosphere/README.md +++ b/integrations/chronosphere/README.md @@ -1,5 +1,5 @@ # Chronosphere -[User documentation](https://docs.launchdarkly.com/integrations/chronosphere) +[User documentation](https://launchdarkly.com/docs/integrations/chronosphere) [API documentation](https://docs.chronosphere.io/documentation/explore/change-events/third-party#launchdarkly) diff --git a/integrations/chronosphere/manifest.json b/integrations/chronosphere/manifest.json index 7b9dd5cf..82088ecd 100644 --- a/integrations/chronosphere/manifest.json +++ b/integrations/chronosphere/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://chronosphere.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/chronosphere", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/chronosphere", "privacyPolicy": "https://chronosphere.io/privacy/" }, "categories": ["monitoring"], diff --git a/integrations/circleci-coderefs/manifest.json b/integrations/circleci-coderefs/manifest.json index 1c599c11..18a69d37 100644 --- a/integrations/circleci-coderefs/manifest.json +++ b/integrations/circleci-coderefs/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://circleci.com/orbs/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/code/circleci", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/observability/circleci", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/cloudflare/manifest.json b/integrations/cloudflare/manifest.json index c7776f47..973204a3 100644 --- a/integrations/cloudflare/manifest.json +++ b/integrations/cloudflare/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.cloudflare.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/cloudflare", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/cloudflare", "privacyPolicy": "https://www.cloudflare.com/privacypolicy/" }, "categories": ["infrastructure"], diff --git a/integrations/cloudtrail/manifest.json b/integrations/cloudtrail/manifest.json index a934864d..42030eeb 100644 --- a/integrations/cloudtrail/manifest.json +++ b/integrations/cloudtrail/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://aws.amazon.com/cloudtrail/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/cloudtrail", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/cloudtrail", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring", "analytics"], @@ -19,7 +19,7 @@ { "key": "externalId", "name": "External Id", - "description": "Use this [external id](https://docs.launchdarkly.com/integrations/cloudtrail) for your resource policy when setting up the integration in the AWS Console.", + "description": "Use this [external id](https://launchdarkly.com/docs/integrations/cloudtrail) for your resource policy when setting up the integration in the AWS Console.", "type": "generated" }, { diff --git a/integrations/compass/manifest.json b/integrations/compass/manifest.json index f7c5fbb9..cd5ffc0b 100644 --- a/integrations/compass/manifest.json +++ b/integrations/compass/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "compassfb@customerfeedback.atlassian.net", "links": { "site": "https://www.atlassian.com/software/compass", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/compass", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/compass", "supportWebsite": "https://community.atlassian.com/t5/Compass-Alpha/gh-p/compass-alpha", "privacyPolicy": "https://www.atlassian.com/legal/privacy-policy" }, diff --git a/integrations/confluence-embedded-pages/manifest.json b/integrations/confluence-embedded-pages/manifest.json index 6e736631..423df5db 100644 --- a/integrations/confluence-embedded-pages/manifest.json +++ b/integrations/confluence-embedded-pages/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.atlassian.com/software/confluence", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/confluence", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/confluence", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["developer-tools"], diff --git a/integrations/cortex/manifest.json b/integrations/cortex/manifest.json index 8b0fdde7..d1275ebf 100644 --- a/integrations/cortex/manifest.json +++ b/integrations/cortex/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@cortex.io", "links": { "site": "https://www.cortex.io/home", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/cortex", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/cortex", "supportWebsite": "https://support.getcortexapp.com/", "privacyPolicy": "https://www.cortex.io/legal/privacy-policy" }, diff --git a/integrations/ctrlstack/manifest.json b/integrations/ctrlstack/manifest.json index 2c7fe4cb..b4866eae 100644 --- a/integrations/ctrlstack/manifest.json +++ b/integrations/ctrlstack/manifest.json @@ -9,7 +9,7 @@ "links": { "site": "https://ctrlstack.com", "supportWebsite": "https://www.ctrlstack.com/contact/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/ctrlstack", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/ctrlstack", "privacyPolicy": "https://www.ctrlstack.com/terms-and-policy/" }, "categories": ["monitoring", "developer-tools"], diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index f8a2558e..f593e7c6 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://launchdarkly.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/custom-approvals", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/custom-approvals", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "icons": { diff --git a/integrations/datadog-flag-trigger/manifest.json b/integrations/datadog-flag-trigger/manifest.json index 46d454b4..498de345 100644 --- a/integrations/datadog-flag-trigger/manifest.json +++ b/integrations/datadog-flag-trigger/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.datadoghq.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog/triggers", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/datadog/triggers", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["developer-tools", "monitoring"], diff --git a/integrations/datadog-legacy/manifest.json b/integrations/datadog-legacy/manifest.json index c279c06a..74609534 100644 --- a/integrations/datadog-legacy/manifest.json +++ b/integrations/datadog-legacy/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.datadoghq.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/datadog", "privacyPolicy": "https://www.datadoghq.com/legal/privacy" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/datadog-private/README.md b/integrations/datadog-private/README.md index aeafb4ce..00cc976f 100644 --- a/integrations/datadog-private/README.md +++ b/integrations/datadog-private/README.md @@ -1,6 +1,6 @@ # Datadog -[User documentation](https://docs.launchdarkly.com/integrations/datadog) +[User documentation](https://launchdarkly.com/docs/integrations/datadog) [API documentation](https://docs.datadoghq.com/api/?lang=bash#events) diff --git a/integrations/datadog-private/manifest.json b/integrations/datadog-private/manifest.json index 3b9d7641..2cab26fd 100644 --- a/integrations/datadog-private/manifest.json +++ b/integrations/datadog-private/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.datadoghq.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/datadog/events", "privacyPolicy": "https://www.datadoghq.com/legal/privacy" }, "categories": ["monitoring"], diff --git a/integrations/datadog-rum/manifest.json b/integrations/datadog-rum/manifest.json index 6a7398ab..0947884b 100644 --- a/integrations/datadog-rum/manifest.json +++ b/integrations/datadog-rum/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@datadoghq.com", "links": { "site": "https://www.datadoghq.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog/rum", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/datadog/rum", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["developer-tools", "monitoring"], diff --git a/integrations/datadog/README.md b/integrations/datadog/README.md index 91a47d3a..b308ccdf 100644 --- a/integrations/datadog/README.md +++ b/integrations/datadog/README.md @@ -1,6 +1,6 @@ # Datadog -[User documentation](https://docs.launchdarkly.com/integrations/datadog) +[User documentation](https://launchdarkly.com/docs/integrations/datadog) [API documentation](https://docs.datadoghq.com/api/?lang=bash#events) diff --git a/integrations/datadog/manifest.json b/integrations/datadog/manifest.json index 8b9beb03..c49cce36 100644 --- a/integrations/datadog/manifest.json +++ b/integrations/datadog/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.datadoghq.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/datadog", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/datadog", "privacyPolicy": "https://www.datadoghq.com/legal/privacy" }, "categories": ["monitoring"], @@ -87,7 +87,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/datadog/triggers#connecting-a-flag-trigger-to-datadog", + "documentation": "https://launchdarkly.com/docs/integrations/datadog/triggers#connect-a-flag-trigger-to-datadog", "testEventNameRegexp": ".+ \\[TEST\\].+", "parser": { "eventName": "/title", diff --git a/integrations/ditto/manifest.json b/integrations/ditto/manifest.json index 5d76062a..c372b9f1 100644 --- a/integrations/ditto/manifest.json +++ b/integrations/ditto/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@dittowords.com", "links": { "site": "https://www.dittowords.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/ditto", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/ditto", "privacyPolicy": "https://www.dittowords.com/legal/privacy-policy" }, "categories": ["developer-tools"], diff --git a/integrations/dynamodb/manifest.json b/integrations/dynamodb/manifest.json index 353b746f..f629ceac 100644 --- a/integrations/dynamodb/manifest.json +++ b/integrations/dynamodb/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://aws.amazon.com/pm/dynamodb/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/dynamodb", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/dynamodb", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["big-segment-store", "data", "synced-segments"], diff --git a/integrations/dynatrace-cloud-automation/manifest.json b/integrations/dynatrace-cloud-automation/manifest.json index fa13e618..c1ad91d1 100644 --- a/integrations/dynatrace-cloud-automation/manifest.json +++ b/integrations/dynatrace-cloud-automation/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.dynatrace.com/platform/cloud-automation/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/dynatrace#cloud-automation", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/dynatrace", "privacyPolicy": "https://www.dynatrace.com/company/trust-center/privacy/" }, "categories": ["automation", "developer-tools"], @@ -17,7 +17,7 @@ }, "capabilities": { "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/dynatrace/triggers#connecting-a-launchdarkly-trigger-to-dynatrace", + "documentation": "https://launchdarkly.com/docs/integrations/dynatrace/triggers#connect-a-launchdarkly-trigger-to-dynatrace", "defaultEventName": "An event", "parser": { "eventName": "/eventName", diff --git a/integrations/dynatrace/README.md b/integrations/dynatrace/README.md index 09a8f6b1..3d439405 100644 --- a/integrations/dynatrace/README.md +++ b/integrations/dynatrace/README.md @@ -1,6 +1,6 @@ # Dynatrace -[User documentation](https://docs.launchdarkly.com/integrations/dynatrace) +[User documentation](https://launchdarkly.com/docs/integrations/dynatrace) [API documentation](https://www.dynatrace.com/support/help/extend-dynatrace/dynatrace-api/environment-api/events/post-event/) diff --git a/integrations/dynatrace/manifest.json b/integrations/dynatrace/manifest.json index 5af61b9b..6c5ce309 100644 --- a/integrations/dynatrace/manifest.json +++ b/integrations/dynatrace/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.dynatrace.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/dynatrace", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/dynatrace", "privacyPolicy": "https://www.dynatrace.com/company/trust-center/privacy/" }, "categories": ["monitoring"], @@ -172,7 +172,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/dynatrace/triggers#connecting-a-launchdarkly-trigger-to-dynatrace", + "documentation": "https://launchdarkly.com/docs/integrations/dynatrace/triggers#connect-a-launchdarkly-trigger-to-dynatrace", "testEventNameRegexp": "^Dynatrace problem notification test run$", "parser": { "eventName": "/title", diff --git a/integrations/elastic/README.md b/integrations/elastic/README.md index 9a68fe4a..cbae9a0c 100644 --- a/integrations/elastic/README.md +++ b/integrations/elastic/README.md @@ -1,6 +1,6 @@ # The Elastic (ELK) Stack integration -Documentation for this integration is available on the LaunchDarkly documentation site: [ELK Stack](https://docs.launchdarkly.com/integrations/elastic-stack) +Documentation for this integration is available on the LaunchDarkly documentation site: [ELK Stack](https://launchdarkly.com/docs/integrations/elastic-stack) API documentation for this integration is available on the Elastic documentation site: [Elastic Search](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) diff --git a/integrations/elastic/manifest.json b/integrations/elastic/manifest.json index c5a97aba..45da59b1 100644 --- a/integrations/elastic/manifest.json +++ b/integrations/elastic/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://elastic.co", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/elastic-stack", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/elastic-stack", "privacyPolicy": "https://www.elastic.co/legal/privacy-statement" }, "categories": ["monitoring", "notifications"], diff --git a/integrations/example-synced-segment-integration1/manifest.json b/integrations/example-synced-segment-integration1/manifest.json index c9009b9e..ad8d6a3f 100644 --- a/integrations/example-synced-segment-integration1/manifest.json +++ b/integrations/example-synced-segment-integration1/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.example.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/contexts/synced-segments", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/synced-segments", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, "categories": ["synced-segments"], diff --git a/integrations/example-synced-segment-integration2/manifest.json b/integrations/example-synced-segment-integration2/manifest.json index aadf8a22..95e1431c 100644 --- a/integrations/example-synced-segment-integration2/manifest.json +++ b/integrations/example-synced-segment-integration2/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.example.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/contexts/synced-segments", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/synced-segments", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, "categories": ["synced-segments"], diff --git a/integrations/fastly/manifest.json b/integrations/fastly/manifest.json index 202dd8e6..15ca2f68 100644 --- a/integrations/fastly/manifest.json +++ b/integrations/fastly/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.fastly.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/fastly", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/fastly", "privacyPolicy": "https://www.fastly.com/privacy" }, "categories": ["infrastructure"], diff --git a/integrations/fulcrum/manifest.json b/integrations/fulcrum/manifest.json index c194c3cb..bdd522a4 100644 --- a/integrations/fulcrum/manifest.json +++ b/integrations/fulcrum/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.getfulcrum.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/fulcrum", + "launchdarklyDocs": "https://launchdarkly.com/docs", "privacyPolicy": "https://launchdarkly.com/policies/privacy/", "supportWebsite": "https://docs.getfulcrum.io/guides/fulcrum-launchdarkly-sync" }, diff --git a/integrations/fullstory/manifest.json b/integrations/fullstory/manifest.json index d133600f..07ecc7e7 100644 --- a/integrations/fullstory/manifest.json +++ b/integrations/fullstory/manifest.json @@ -8,7 +8,7 @@ "links": { "supportWebsite": "https://help.fullstory.com/", "site": "https://www.fullstory.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/fullstory", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/fullstory", "privacyPolicy": "https://www.fullstory.com/legal/privacy-policy/" }, "categories": ["analytics"], diff --git a/integrations/generic-feature-store/manifest.json b/integrations/generic-feature-store/manifest.json index 114c3b92..cc25e775 100644 --- a/integrations/generic-feature-store/manifest.json +++ b/integrations/generic-feature-store/manifest.json @@ -6,8 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com", - "privacyPolicy": "https://docs.launchdarkly.com" + "site": "https://launchdarkly.com/docs", + "privacyPolicy": "https://launchdarkly.com/docs" }, "categories": ["infrastructure"], "icons": { diff --git a/integrations/generic-trigger/README.md b/integrations/generic-trigger/README.md index 50534944..6e8ad924 100644 --- a/integrations/generic-trigger/README.md +++ b/integrations/generic-trigger/README.md @@ -2,4 +2,4 @@ This integration allows *any* tool with outbound webhook capabilities to use LaunchDarkly's flag triggers feature. -To learn more, read [Creating a new flag trigger](https://docs.launchdarkly.com/home/feature-workflows/triggers#creating-a-new-flag-trigger). +To learn more, read [Creating flag triggers](https://launchdarkly.com/docs/home/releases/triggers-create). diff --git a/integrations/generic-trigger/manifest.json b/integrations/generic-trigger/manifest.json index f3d80881..83ff461a 100644 --- a/integrations/generic-trigger/manifest.json +++ b/integrations/generic-trigger/manifest.json @@ -7,7 +7,7 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "launchdarklyDocs": "https://docs.launchdarkly.com/home/feature-workflows/triggers", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/releases/triggers", "site": "https://launchdarkly.com", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, @@ -18,7 +18,7 @@ }, "capabilities": { "trigger": { - "documentation": "https://docs.launchdarkly.com/home/feature-workflows/triggers#creating-a-new-flag-trigger", + "documentation": "https://launchdarkly.com/docs/home/releases/triggers-create", "defaultEventName": "An event", "parser": { "eventName": "/eventName", diff --git a/integrations/git/manifest.json b/integrations/git/manifest.json index b95ec0a9..b1cb0f93 100644 --- a/integrations/git/manifest.json +++ b/integrations/git/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://github.com/launchdarkly/ld-find-code-refs/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/code/code-references", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/observability/code-references", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/github-actions-flag-evaluations/manifest.json b/integrations/github-actions-flag-evaluations/manifest.json index f001f2e6..b51ea7c9 100644 --- a/integrations/github-actions-flag-evaluations/manifest.json +++ b/integrations/github-actions-flag-evaluations/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://github.com/features/actions", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/github-actions-flag-evaluations", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/github-actions/flag-evaluations", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["automation"], diff --git a/integrations/github/manifest.json b/integrations/github/manifest.json index f92c7c7d..60c6414e 100644 --- a/integrations/github/manifest.json +++ b/integrations/github/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://github.com/features/actions", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/code/github-actions", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/github-actions", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], @@ -25,7 +25,7 @@ "header": "GitHub pull request", "emptyState": { "title": "No GitHub pull requests link to this flag.", - "leadText": "To enable the GitHub integration, [read the documentation](https://docs.launchdarkly.com/integrations/github-actions/find-code-references)" + "leadText": "To enable the GitHub integration, [read the documentation](https://launchdarkly.com/docs/integrations/github-actions/find-code-references)" }, "metadata": { "avatarUrl": { diff --git a/integrations/gitlab/manifest.json b/integrations/gitlab/manifest.json index 43a51b50..b60b101d 100644 --- a/integrations/gitlab/manifest.json +++ b/integrations/gitlab/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://about.gitlab.com/stages-devops-lifecycle/continuous-integration/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/code/gitlab", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/observability/gitlab", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["code-references"], diff --git a/integrations/google-pubsub/manifest.json b/integrations/google-pubsub/manifest.json index 83c6e71b..9adb094b 100644 --- a/integrations/google-pubsub/manifest.json +++ b/integrations/google-pubsub/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://cloud.google.com/pubsub", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/google-pubsub", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/data-export/google-pubsub", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/googleapps-sso/manifest.json b/integrations/googleapps-sso/manifest.json index 8b6ca8c0..98eeab0e 100644 --- a/integrations/googleapps-sso/manifest.json +++ b/integrations/googleapps-sso/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://cloud.google.com/identity/sso", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/account-security/google", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/account/google", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/grafana/README.md b/integrations/grafana/README.md index 0503290d..70be3b9c 100644 --- a/integrations/grafana/README.md +++ b/integrations/grafana/README.md @@ -1,6 +1,6 @@ # Grafana -Documentation for this integration is available on the LaunchDarkly documentation site: [User documentation](https://docs.launchdarkly.com/integrations/grafana) +Documentation for this integration is available on the LaunchDarkly documentation site: [User documentation](https://launchdarkly.com/docs/integrations/grafana) API documentation for this integration is available on the Grafana documentation site: [API documentation](https://grafana.com/docs/grafana/latest/http_api/annotations/#create-annotation) diff --git a/integrations/grafana/manifest.json b/integrations/grafana/manifest.json index 9fd73a15..0d3df03a 100644 --- a/integrations/grafana/manifest.json +++ b/integrations/grafana/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://grafana.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/grafana", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/grafana", "privacyPolicy": "https://grafana.com/terms/" }, "categories": ["monitoring"], diff --git a/integrations/heap-inbound/manifest.json b/integrations/heap-inbound/manifest.json index 51ec1549..57a36314 100644 --- a/integrations/heap-inbound/manifest.json +++ b/integrations/heap-inbound/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@heap.io", "links": { "site": "https://www.heap.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/heap", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/heap", "privacyPolicy": "https://www.heap.io/privacy" }, "categories": ["synced-segments"], diff --git a/integrations/heap/manifest.json b/integrations/heap/manifest.json index 76a41654..8748e0bc 100644 --- a/integrations/heap/manifest.json +++ b/integrations/heap/manifest.json @@ -9,7 +9,7 @@ "links": { "supportWebsite": "https://help.heap.io/", "site": "https://heap.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/heap", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/heap", "privacyPolicy": "https://heap.io/privacy" }, "categories": ["analytics"], diff --git a/integrations/hightouch/manifest.json b/integrations/hightouch/manifest.json index 694023d2..75e74c1b 100644 --- a/integrations/hightouch/manifest.json +++ b/integrations/hightouch/manifest.json @@ -8,7 +8,7 @@ "links": { "site": "https://hightouch.com/", "privacyPolicy": "https://hightouch.com/privacy-policy", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/hightouch" + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/hightouch" }, "categories": ["synced-segments"], "icons": { diff --git a/integrations/honeycomb/README.md b/integrations/honeycomb/README.md index 55c4ac58..aa64e9f4 100644 --- a/integrations/honeycomb/README.md +++ b/integrations/honeycomb/README.md @@ -1,6 +1,6 @@ # Honeycomb -Documentation for this integration is available on the LaunchDarkly documentation site: [Honeycomb](https://docs.launchdarkly.com/integrations/honeycomb) +Documentation for this integration is available on the LaunchDarkly documentation site: [Honeycomb](https://launchdarkly.com/docs/integrations/honeycomb) API documentation for this integration is available on the Honeycomb documentation site: [Markers API](https://docs.honeycomb.io/api/markers/) diff --git a/integrations/honeycomb/manifest.json b/integrations/honeycomb/manifest.json index 6a8f3ab7..839deb1c 100644 --- a/integrations/honeycomb/manifest.json +++ b/integrations/honeycomb/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://honeycomb.io", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/honeycomb", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/honeycomb", "privacyPolicy": "https://honeycomb.io/privacy" }, "categories": ["monitoring"], @@ -62,7 +62,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/honeycomb/triggers#connecting-a-flag-trigger-to-honeycomb", + "documentation": "https://launchdarkly.com/docs/integrations/honeycomb/triggers#connect-a-flag-trigger-to-honeycomb", "parser": { "eventName": "/name", "url": "/result_url" diff --git a/integrations/intellij/manifest.json b/integrations/intellij/manifest.json index 805826f2..584bc805 100644 --- a/integrations/intellij/manifest.json +++ b/integrations/intellij/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://plugins.jetbrains.com/plugin/15159-launchdarkly", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/intellij", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/intellij", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["developer-tools"], diff --git a/integrations/jira/manifest.json b/integrations/jira/manifest.json index 4d77b22d..53b2c762 100644 --- a/integrations/jira/manifest.json +++ b/integrations/jira/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.atlassian.com/software/jira", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/jira", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/jira", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["issue-tracking"], @@ -22,7 +22,7 @@ "header": "Jira issue", "emptyState": { "title": "No Jira issues link to this flag.", - "leadText": "To enable the Jira integration, [read the documentation](https://docs.launchdarkly.com/home/flags/links#creating-jira-flag-links)" + "leadText": "To enable the Jira integration, [read the documentation](https://launchdarkly.com/docs/home/flags/links#create-jira-flag-links)" }, "metadata": { "creator": { diff --git a/integrations/kinesis/manifest.json b/integrations/kinesis/manifest.json index 914cbe89..43e7bf38 100644 --- a/integrations/kinesis/manifest.json +++ b/integrations/kinesis/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://aws.amazon.com/kinesis/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/kinesis", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/data-export/kinesis", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/last9/manifest.json b/integrations/last9/manifest.json index e18f1df3..e1a6f27b 100644 --- a/integrations/last9/manifest.json +++ b/integrations/last9/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://last9.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/last9", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/last9", "privacyPolicy": "https://last9.io/privacy/" }, "categories": ["monitoring"], diff --git a/integrations/ld-to-git/manifest.json b/integrations/ld-to-git/manifest.json index 7a84866b..791983b4 100644 --- a/integrations/ld-to-git/manifest.json +++ b/integrations/ld-to-git/manifest.json @@ -6,7 +6,7 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/integrations", + "site": "https://launchdarkly.com/docs/integrations", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], @@ -26,7 +26,7 @@ { "key": "ldApiToken", "name": "LaunchDarkly API token", - "description": "Enter the API token generated from LaunchDarkly. Instructions for generating a LaunchDarkly API token can be found [here](https://docs.launchdarkly.com/home/account-security/api-access-tokens)", + "description": "Enter the API token generated from LaunchDarkly. Instructions for generating a LaunchDarkly API token can be found [here](https://launchdarkly.com/docs/home/account/api)", "type": "string", "isSecret": true, "isOptional": false diff --git a/integrations/logdna/README.md b/integrations/logdna/README.md index b8dabe25..a5ea5cf5 100644 --- a/integrations/logdna/README.md +++ b/integrations/logdna/README.md @@ -1,6 +1,6 @@ # LogDNA -User documentation for this integration is available on the LaunchDarkly documentation site: [LogDNA](https://docs.launchdarkly.com/integrations/logdna) +User documentation for this integration is available on the LaunchDarkly documentation site: [LogDNA](https://launchdarkly.com/docs/integrations/mezmo) API documentation for this integration is available on the LogDNA API documentation site: [LogDNA](https://docs.logdna.com/reference#api) diff --git a/integrations/logdna/manifest.json b/integrations/logdna/manifest.json index fa548fcd..0c3e03ce 100644 --- a/integrations/logdna/manifest.json +++ b/integrations/logdna/manifest.json @@ -6,8 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://logdna.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/logdna", + "site": "https://www.mezmo.com/", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/mezmo", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["log-management"], diff --git a/integrations/mparticle/manifest.json b/integrations/mparticle/manifest.json index 5916c8c1..f1cc20d4 100644 --- a/integrations/mparticle/manifest.json +++ b/integrations/mparticle/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.mparticle.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/mparticle", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/data-export/mparticle", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/msteams-app/manifest.json b/integrations/msteams-app/manifest.json index 53f37750..7e0c08a1 100644 --- a/integrations/msteams-app/manifest.json +++ b/integrations/msteams-app/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.microsoft.com/en-us/microsoft-teams/group-chat-software", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/microsoft-teams", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/microsoft-teams", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["messaging"], diff --git a/integrations/msteams/README.md b/integrations/msteams/README.md index 11491f39..9c3d9db0 100644 --- a/integrations/msteams/README.md +++ b/integrations/msteams/README.md @@ -1,6 +1,6 @@ # Microsoft Teams -User documentation for this integration is available on the LaunchDarkly documentation site: [Microsoft Teams](https://docs.launchdarkly.com/integrations/microsoft-teams) +User documentation for this integration is available on the LaunchDarkly documentation site: [Microsoft Teams](https://launchdarkly.com/docs/integrations/microsoft-teams) API documentation for this integration is available on Microsoft's documentation site: [Microsoft Teams](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using?tabs=cURL) diff --git a/integrations/msteams/manifest.json b/integrations/msteams/manifest.json index b2c92b3b..63be1e96 100644 --- a/integrations/msteams/manifest.json +++ b/integrations/msteams/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.microsoft.com/microsoft-365/microsoft-teams/group-chat-software", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/microsoft-teams/webhooks", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/microsoft-teams/webhooks", "privacyPolicy": "https://privacy.microsoft.com/en-us" }, "categories": ["messaging"], @@ -20,7 +20,7 @@ "key": "url", "name": "Incoming webhook URL", "type": "uri", - "description": "Enter your Microsoft Teams [incoming webhook URL](https://docs.launchdarkly.com/integrations/microsoft-teams/webhooks#setting-up-a-connector-in-microsoft-teams).", + "description": "Enter your Microsoft Teams [incoming webhook URL](https://launchdarkly.com/docs/integrations/microsoft-teams/webhooks#set-up-a-workflow-in-microsoft-teams).", "isSecret": false } ], diff --git a/integrations/netlify/manifest.json b/integrations/netlify/manifest.json index 8161492a..d0431038 100644 --- a/integrations/netlify/manifest.json +++ b/integrations/netlify/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@netlify.com", "links": { "site": "https://www.netlify.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/netlify", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/netlify", "privacyPolicy": "https://www.netlify.com/privacy/" }, "categories": ["infrastructure"], diff --git a/integrations/new-relic-apm-insights/README.md b/integrations/new-relic-apm-insights/README.md index 67bdfc57..149014c6 100644 --- a/integrations/new-relic-apm-insights/README.md +++ b/integrations/new-relic-apm-insights/README.md @@ -1,6 +1,6 @@ # New Relic -[User documentation](https://docs.launchdarkly.com/integrations/new-relic) +[User documentation](https://launchdarkly.com/docs/integrations/new-relic) [API documentation](https://docs.newrelic.com/docs/data-apis/ingest-apis/event-api/introduction-event-api/) diff --git a/integrations/new-relic-apm-insights/manifest.json b/integrations/new-relic-apm-insights/manifest.json index 238686be..d0af64c6 100644 --- a/integrations/new-relic-apm-insights/manifest.json +++ b/integrations/new-relic-apm-insights/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://newrelic.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/new-relic", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/new-relic", "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" }, "categories": ["monitoring"], diff --git a/integrations/new-relic-apm/README.md b/integrations/new-relic-apm/README.md index 42c81ae8..76820d48 100644 --- a/integrations/new-relic-apm/README.md +++ b/integrations/new-relic-apm/README.md @@ -2,7 +2,7 @@ **Important:** This integration requires a New Relic APM account. -User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic One](https://docs.launchdarkly.com/integrations/new-relic). +User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic One](https://launchdarkly.com/docs/integrations/new-relic). API documentation for this integration is available on the New Relic API documentation site: [New Relic One](https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/record-monitor-deployments). diff --git a/integrations/new-relic-apm/manifest.json b/integrations/new-relic-apm/manifest.json index 6b1b0855..6f3216e8 100644 --- a/integrations/new-relic-apm/manifest.json +++ b/integrations/new-relic-apm/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://newrelic.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/new-relic", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/new-relic", "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" }, "categories": ["monitoring"], @@ -69,7 +69,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/new-relic/triggers#connecting-a-flag-trigger-to-new-relic-one", + "documentation": "https://launchdarkly.com/docs/integrations/new-relic/triggers#connect-a-flag-trigger-to-new-relic-one", "testEventNameRegexp": "^New Relic Alert - Test Condition$", "parser": { "eventName": "/condition_name", diff --git a/integrations/new-relic/README.md b/integrations/new-relic/README.md index cd500da1..fb77856a 100644 --- a/integrations/new-relic/README.md +++ b/integrations/new-relic/README.md @@ -2,7 +2,7 @@ **Important:** This integration requires a New Relic Pro account, including a paid Insights subscription. -User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic One](https://docs.launchdarkly.com/integrations/new-relic) +User documentation for this integration is available on the LaunchDarkly documentation site: [New Relic One](https://launchdarkly.com/docs/integrations/new-relic) API documentation for this integration is available at the New Relic documentation site: [New Relic](https://docs.newrelic.com/docs/insights/insights-data-sources/custom-data/introduction-event-api) diff --git a/integrations/new-relic/manifest.json b/integrations/new-relic/manifest.json index 9559c0d8..78bbedb2 100644 --- a/integrations/new-relic/manifest.json +++ b/integrations/new-relic/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://newrelic.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/new-relic", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/new-relic", "privacyPolicy": "https://newrelic.com/termsandconditions/privacy" }, "categories": ["monitoring"], diff --git a/integrations/okta/manifest.json b/integrations/okta/manifest.json index 28e2f901..b40cb3cf 100644 --- a/integrations/okta/manifest.json +++ b/integrations/okta/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.okta.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/account-security/okta", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/account/okta", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/onelogin/manifest.json b/integrations/onelogin/manifest.json index 631763ab..0c76b2aa 100644 --- a/integrations/onelogin/manifest.json +++ b/integrations/onelogin/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.onelogin.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/account-security/onelogin", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/account/onelogin", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["authentication"], diff --git a/integrations/osano/manifest.json b/integrations/osano/manifest.json index bfbc4123..35eb1439 100644 --- a/integrations/osano/manifest.json +++ b/integrations/osano/manifest.json @@ -9,7 +9,7 @@ "links": { "supportWebsite": "https://docs.osano.com/", "site": "https://osano.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/osano", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/osano", "privacyPolicy": "https://www.osano.com/legal/privacy" }, "categories": ["data"], diff --git a/integrations/pagerduty-guardian-edition/manifest.json b/integrations/pagerduty-guardian-edition/manifest.json index f70c2313..08245d41 100644 --- a/integrations/pagerduty-guardian-edition/manifest.json +++ b/integrations/pagerduty-guardian-edition/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.pagerduty.com", - "launchdarklyDocs": "https://docs.launchdarkly.com", + "launchdarklyDocs": "https://launchdarkly.com/docs", "privacyPolicy": "https://www.pagerduty.com/privacy-policy/" }, "categories": ["monitoring"], diff --git a/integrations/pagerduty/manifest.json b/integrations/pagerduty/manifest.json index 38b43771..ebbea2d3 100644 --- a/integrations/pagerduty/manifest.json +++ b/integrations/pagerduty/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.pagerduty.com", - "launchdarklyDocs": "https://docs.launchdarkly.com", + "launchdarklyDocs": "https://launchdarkly.com/docs", "privacyPolicy": "https://www.pagerduty.com/privacy-policy/" }, "categories": ["monitoring"], diff --git a/integrations/pendo/manifest.json b/integrations/pendo/manifest.json index a086f30d..3046297e 100644 --- a/integrations/pendo/manifest.json +++ b/integrations/pendo/manifest.json @@ -9,7 +9,7 @@ "links": { "supportWebsite": "https://support.pendo.io/hc/en-us/articles/360032592312-LaunchDarkly-Recipe-Automate-the-feature-release-process", "site": "https://www.pendo.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/pendo", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/pendo", "privacyPolicy": "https://www.pendo.io/legal/privacy-policy/" }, "categories": ["analytics"], diff --git a/integrations/port/manifest.json b/integrations/port/manifest.json index f56bac8d..b1f8b7c3 100644 --- a/integrations/port/manifest.json +++ b/integrations/port/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@getport.io", "links": { "site": "https://getport.io", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/port", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/port", "privacyPolicy": "https://www.getport.io/legal/privacy-policy" }, "categories": ["developer-tools", "infrastructure"], diff --git a/integrations/redis/manifest.json b/integrations/redis/manifest.json index f8753aec..c8a23a17 100644 --- a/integrations/redis/manifest.json +++ b/integrations/redis/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://redis.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/redis", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/redis", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["big-segment-store", "data", "synced-segments"], diff --git a/integrations/release/manifest.json b/integrations/release/manifest.json index ac3cd3bd..91390b1a 100644 --- a/integrations/release/manifest.json +++ b/integrations/release/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@releaseapp.io", "links": { "site": "https://releaseapp.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/release", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/release", "supportWebsite": "https://docs.releaseapp.io/integrations/integrations-overview/launchdarkly-integration", "privacyPolicy": "https://releaseapp.io/privacy-policy" }, diff --git a/integrations/resmo/manifest.json b/integrations/resmo/manifest.json index 412eb0cd..b704fee4 100644 --- a/integrations/resmo/manifest.json +++ b/integrations/resmo/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@resmo.com", "links": { "site": "https://www.resmo.com", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/resmo", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/resmo", "privacyPolicy": "https://www.resmo.com/legal/privacy" }, "categories": ["monitoring"], diff --git a/integrations/roadie/manifest.json b/integrations/roadie/manifest.json index 342e7ffa..0a6f806d 100644 --- a/integrations/roadie/manifest.json +++ b/integrations/roadie/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@roadie.io", "links": { "site": "https://roadie.io", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/roadie", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/backstage", "supportWebsite": "https://roadie.io/docs/integrations/launchdarkly/", "privacyPolicy": "https://roadie.io/legal-notices/privacy-notice/v1/" }, diff --git a/integrations/rudderstack/manifest.json b/integrations/rudderstack/manifest.json index 9916e6b7..e97c374a 100644 --- a/integrations/rudderstack/manifest.json +++ b/integrations/rudderstack/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.rudderstack.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/rudderstack", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/rudderstack", "supportWebsite": "https://www.rudderstack.com/docs/destinations/streaming-destinations/launchdarkly-segments/", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, diff --git a/integrations/segment-audiences/manifest.json b/integrations/segment-audiences/manifest.json index d6583011..93d2a073 100644 --- a/integrations/segment-audiences/manifest.json +++ b/integrations/segment-audiences/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://segment.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/segment", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/twilio", "supportWebsite": "https://segment.com/docs/connections/sources/catalog/cloud-apps/launchdarkly-audiences/", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, diff --git a/integrations/segment-inbound/manifest.json b/integrations/segment-inbound/manifest.json index 10229acd..8dfb2561 100644 --- a/integrations/segment-inbound/manifest.json +++ b/integrations/segment-inbound/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://segment.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/creating-experiments/segment/", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/metric-segment", "supportWebsite": "https://segment.com/docs/connections/destinations/catalog/actions-launchdarkly/", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, diff --git a/integrations/segment/manifest.json b/integrations/segment/manifest.json index 1bb9dada..30a95e82 100644 --- a/integrations/segment/manifest.json +++ b/integrations/segment/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://segment.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/segment", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/data-export/segment", "supportWebsite": "https://segment.com/docs/connections/sources/catalog/cloud-apps/launchdarkly/", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, diff --git a/integrations/sentry/manifest.json b/integrations/sentry/manifest.json index 691a8a2f..82cc065a 100644 --- a/integrations/sentry/manifest.json +++ b/integrations/sentry/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.sentry.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/sentry", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/sentry", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/servicenow-app/manifest.json b/integrations/servicenow-app/manifest.json index 2c10caa0..ef850c97 100644 --- a/integrations/servicenow-app/manifest.json +++ b/integrations/servicenow-app/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.servicenow.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/servicenow", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/servicenow", "privacyPolicy": "https://www.servicenow.com/privacy-statement.html" }, "categories": ["approval"], diff --git a/integrations/servicenow-c0/manifest.json b/integrations/servicenow-c0/manifest.json index 52ffc121..8dffb20c 100644 --- a/integrations/servicenow-c0/manifest.json +++ b/integrations/servicenow-c0/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.servicenow.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/servicenow", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/servicenow", "privacyPolicy": "https://www.servicenow.com/privacy-statement.html" }, "categories": ["approval"], @@ -32,7 +32,7 @@ { "key": "assignmentGroup", "name": "ServiceNow assignment group override (Disabled)", - "description": "This request will fail if you have not specified the \"ServiceNow assignment group\" custom property. Read [Custom Properties](https://docs.launchdarkly.com/home/infrastructure/custom-properties) for more information.", + "description": "This request will fail if you have not specified the \"ServiceNow assignment group\" custom property. Read [Custom Properties](https://launchdarkly.com/docs/home/infrastructure/custom-properties) for more information.", "type": "enum", "allowedValues": ["Override disabled"], "isOptional": true diff --git a/integrations/servicenow-normal/manifest.json b/integrations/servicenow-normal/manifest.json index da845a62..6014ba1d 100644 --- a/integrations/servicenow-normal/manifest.json +++ b/integrations/servicenow-normal/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.servicenow.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/servicenow", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/servicenow", "privacyPolicy": "https://www.servicenow.com/privacy-statement.html" }, "categories": ["approval"], diff --git a/integrations/servicenow/manifest.json b/integrations/servicenow/manifest.json index 25b50b72..fdbe5a1f 100644 --- a/integrations/servicenow/manifest.json +++ b/integrations/servicenow/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.servicenow.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/servicenow", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/servicenow", "privacyPolicy": "https://www.servicenow.com/privacy-statement.html" }, "categories": ["approval"], diff --git a/integrations/signalfx/README.md b/integrations/signalfx/README.md index 4164aeee..02e2c223 100644 --- a/integrations/signalfx/README.md +++ b/integrations/signalfx/README.md @@ -1,6 +1,6 @@ # Splunk Observability Cloud (formerly SignalFx) -User documentation for this integration is available on the LaunchDarkly documentation site: [Splunk Observability Cloud](https://docs.launchdarkly.com/integrations/splunk-observability) +User documentation for this integration is available on the LaunchDarkly documentation site: [Splunk Observability Cloud](https://launchdarkly.com/docs/integrations/splunk-observability) API documentation for this integration is available on the Splunk Observability Cloud documentation site: [Splunk Observability Cloud](https://dev.splunk.com/observability/reference/api/ingest_data/latest) diff --git a/integrations/signalfx/manifest.json b/integrations/signalfx/manifest.json index e4fcfea6..7ae6d8c4 100644 --- a/integrations/signalfx/manifest.json +++ b/integrations/signalfx/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.splunk.com/en_us/products/observability.html", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/splunk-observability", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/splunk-observability", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["monitoring"], @@ -60,7 +60,7 @@ ] }, "trigger": { - "documentation": "https://docs.launchdarkly.com/integrations/splunk-observability/triggers#connecting-a-flag-trigger-to-splunk-observability-cloud", + "documentation": "https://launchdarkly.com/docs/integrations/splunk-observability/triggers#connect-a-flag-trigger-to-splunk-observability-cloud", "parser": { "eventName": "/eventType", "url": "/detectorUrl" diff --git a/integrations/slack-app/manifest.json b/integrations/slack-app/manifest.json index 80556632..8730cac2 100644 --- a/integrations/slack-app/manifest.json +++ b/integrations/slack-app/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://slack.com/apps/AKEEF9DTM-launchdarkly", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/slack", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/slack", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["messaging"], @@ -24,7 +24,7 @@ "header": "Slack conversation", "emptyState": { "title": "No Slack conversations link to this flag.", - "leadText": "To enable the Slack integration, [read the documentation](https://docs.launchdarkly.com/home/flags/links#creating-slack-flag-links)" + "leadText": "To enable the Slack integration, [read the documentation](https://launchdarkly.com/docs/home/flags/links#create-slack-flag-links)" }, "metadata": { "avatarUrl": { diff --git a/integrations/slack-webhooks/manifest.json b/integrations/slack-webhooks/manifest.json index f6d522cc..779e811a 100644 --- a/integrations/slack-webhooks/manifest.json +++ b/integrations/slack-webhooks/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://api.slack.com/messaging/webhooks", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/slack/webhooks", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/slack/webhooks", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["notifications"], diff --git a/integrations/sleuth/manifest.json b/integrations/sleuth/manifest.json index 7fdac695..60656954 100644 --- a/integrations/sleuth/manifest.json +++ b/integrations/sleuth/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@sleuth.io", "links": { "site": "https://www.sleuth.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/sleuth", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/sleuth", "supportWebsite": "https://help.sleuth.io/integrations/launchdarkly", "privacyPolicy": "https://www.sleuth.io/privacy" }, diff --git a/integrations/snowflake-experimentation/manifest.json b/integrations/snowflake-experimentation/manifest.json index 148e7a35..f4d0fa28 100644 --- a/integrations/snowflake-experimentation/manifest.json +++ b/integrations/snowflake-experimentation/manifest.json @@ -8,7 +8,7 @@ "allowIntegrationConfigurations": true, "links": { "site": "https://www.snowflake.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/TODO", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/warehouse-native/snowflake", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/snowflake-v2/manifest.json b/integrations/snowflake-v2/manifest.json index a4f0d2bb..4685b4e0 100644 --- a/integrations/snowflake-v2/manifest.json +++ b/integrations/snowflake-v2/manifest.json @@ -8,7 +8,7 @@ "allowIntegrationConfigurations": false, "links": { "site": "https://www.snowflake.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/snowflake", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/data-export/snowflake", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/snowflake/manifest.json b/integrations/snowflake/manifest.json index c6de5429..7af67f04 100644 --- a/integrations/snowflake/manifest.json +++ b/integrations/snowflake/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.snowflake.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/data-export/snowflake", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/data-export/snowflake", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["data"], diff --git a/integrations/snowplow/manifest.json b/integrations/snowplow/manifest.json index efaf07f9..8a5239eb 100644 --- a/integrations/snowplow/manifest.json +++ b/integrations/snowplow/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://snowplow.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/snowplow", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/snowplow", "supportWebsite": "https://docs.snowplow.io/docs/destinations/forwarding-events/google-tag-manager-server-side/launchdarkly-tag-for-gtm-ss/", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, diff --git a/integrations/split/manifest.json b/integrations/split/manifest.json index c621bad8..2f6faa64 100644 --- a/integrations/split/manifest.json +++ b/integrations/split/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://app.split.io", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/flags/import", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/import", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["automation", "import", "migration"], diff --git a/integrations/splunk/README.md b/integrations/splunk/README.md index 7512904f..fecccc0d 100644 --- a/integrations/splunk/README.md +++ b/integrations/splunk/README.md @@ -1,6 +1,6 @@ # Splunk -User documentation for this integration is available on the LaunchDarkly documentation site: [Splunk](https://docs.launchdarkly.com/integrations/splunk) +User documentation for this integration is available on the LaunchDarkly documentation site: [Splunk](https://launchdarkly.com/docs/integrations/splunk) API documentation for this integration is available on the Splunk documentation site: [Splunk](https://docs.splunk.com/Documentation/Splunk/latest/Data/HECExamples#Extract_JSON_fields_example) diff --git a/integrations/splunk/manifest.json b/integrations/splunk/manifest.json index d0cd6bc6..bf6f5322 100644 --- a/integrations/splunk/manifest.json +++ b/integrations/splunk/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.splunk.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/splunk", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/splunk", "privacyPolicy": "https://www.splunk.com/en_us/legal/splunk-data-security-and-privacy.html" }, "categories": ["monitoring"], diff --git a/integrations/sprig/manifest.json b/integrations/sprig/manifest.json index 57b5bda9..14ecc6ca 100644 --- a/integrations/sprig/manifest.json +++ b/integrations/sprig/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@sprig.com", "links": { "site": "https://www.sprig.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/sprig", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/sprig", "privacyPolicy": "https://sprig.com/privacy-policy" }, "categories": ["messaging", "developer-tools"], diff --git a/integrations/sumatra-synced-segments/manifest.json b/integrations/sumatra-synced-segments/manifest.json index 85cd6117..141f415f 100644 --- a/integrations/sumatra-synced-segments/manifest.json +++ b/integrations/sumatra-synced-segments/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@sumatra.ai", "links": { "site": "https://sumatra.ai/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/sumatra", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/synced-segments", "privacyPolicy": "https://launchdarkly.com/policies/privacy/", "supportWebsite": "https://optimize-docs.sumatra.ai/experiences/launchdarkly" }, diff --git a/integrations/tealium-inbound/manifest.json b/integrations/tealium-inbound/manifest.json index 67981c72..2c284b60 100644 --- a/integrations/tealium-inbound/manifest.json +++ b/integrations/tealium-inbound/manifest.json @@ -9,7 +9,7 @@ "supportWebsite": "https://tealium.com/docs-overview/", "site": "https://tealium.com/", "privacyPolicy": "https://tealium.com/privacy", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/tealium" + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/tealium" }, "categories": ["analytics", "data"], "icons": { diff --git a/integrations/terraform-cloud/manifest.json b/integrations/terraform-cloud/manifest.json index f8a1c1f6..30440bb3 100644 --- a/integrations/terraform-cloud/manifest.json +++ b/integrations/terraform-cloud/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://cloud.hashicorp.com/products/terraform", - "launchdarklyDocs": "https://docs.launchdarkly.com", + "launchdarklyDocs": "https://launchdarkly.com/docs/", "privacyPolicy": "https://www.hashicorp.com/privacy" }, "categories": ["automation", "infrastructure"], diff --git a/integrations/terraform/manifest.json b/integrations/terraform/manifest.json index 36361726..521d76a5 100644 --- a/integrations/terraform/manifest.json +++ b/integrations/terraform/manifest.json @@ -7,7 +7,7 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/terraform", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/terraform", "supportWebsite": "https://www.terraform.io/docs/providers/launchdarkly/index.html", "site": "https://www.terraform.io/docs/providers/launchdarkly/index.html", "privacyPolicy": "https://app.terraform.io/pages/privacy" diff --git a/integrations/tray/manifest.json b/integrations/tray/manifest.json index fe372bdf..97036729 100644 --- a/integrations/tray/manifest.json +++ b/integrations/tray/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@tray.io", "links": { "site": "https://tray.io/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/tray", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/tray", "privacyPolicy": "https://tray.io/privacy" }, "categories": ["automation"], diff --git a/integrations/trello/manifest.json b/integrations/trello/manifest.json index 4a032590..b6878bcc 100644 --- a/integrations/trello/manifest.json +++ b/integrations/trello/manifest.json @@ -20,7 +20,7 @@ "header": "Trello card", "emptyState": { "title": "No Trello cards link to this flag.", - "leadText": "To enable the Trello integration, [read the documentation](https://docs.launchdarkly.com/home/flags/links#creating-trello-flag-links)" + "leadText": "To enable the Trello integration, [read the documentation](https://launchdarkly.com/docs/home/flags/links#create-trello-flag-links)" }, "metadata": { "cardTitle": { diff --git a/integrations/unleash/manifest.json b/integrations/unleash/manifest.json index 4e812daf..296e2330 100644 --- a/integrations/unleash/manifest.json +++ b/integrations/unleash/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.getunleash.io", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/flags/import", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/import", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["automation", "import", "migration"], diff --git a/integrations/vercel/manifest.json b/integrations/vercel/manifest.json index 4b3a71c9..f43fac88 100644 --- a/integrations/vercel/manifest.json +++ b/integrations/vercel/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.vercel.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/vercel", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/vercel", "privacyPolicy": "https://vercel.com/legal/privacy-policy" }, "categories": ["infrastructure"], diff --git a/integrations/vscode/manifest.json b/integrations/vscode/manifest.json index c0371853..f3fe99b5 100644 --- a/integrations/vscode/manifest.json +++ b/integrations/vscode/manifest.json @@ -8,7 +8,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://marketplace.visualstudio.com/items?itemName=LaunchDarklyOfficial.launchdarkly", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/vscode", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/vscode", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["developer-tools"], diff --git a/integrations/webhooks/manifest.json b/integrations/webhooks/manifest.json index 322656f7..33662c7f 100644 --- a/integrations/webhooks/manifest.json +++ b/integrations/webhooks/manifest.json @@ -6,8 +6,8 @@ "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { - "site": "https://docs.launchdarkly.com/home/connecting/webhooks", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/connecting/webhooks", + "site": "https://launchdarkly.com/docs/home/infrastructure/webhooks", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/infrastructure/webhooks", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["notifications"], diff --git a/integrations/zendesk/manifest.json b/integrations/zendesk/manifest.json index 1c0ac2a0..71a8c1e0 100644 --- a/integrations/zendesk/manifest.json +++ b/integrations/zendesk/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.zendesk.com/marketplace/apps/support/474556/launchdarkly", - "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/zendesk", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/zendesk", "privacyPolicy": "https://launchdarkly.com/policies/privacy/" }, "categories": ["customer-support"], diff --git a/integrations/zeotap/manifest.json b/integrations/zeotap/manifest.json index a6502d74..fca8b153 100644 --- a/integrations/zeotap/manifest.json +++ b/integrations/zeotap/manifest.json @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://zeotap.com/", - "launchdarklyDocs": "https://docs.launchdarkly.com/home/segments/synced-segments/zeotap", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/flags/zeotap", "privacyPolicy": "https://launchdarkly.com/policies/privacy " }, "categories": ["synced-segments"], From 479762dcc051bd20540163a4d6ed8b23ad1193b6 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Thu, 27 Feb 2025 17:47:54 +0000 Subject: [PATCH 904/936] Update GitHub Action SHA to latest version (#648) --- .github/workflows/jira_linker.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/jira_linker.yml b/.github/workflows/jira_linker.yml index f4d7fdd5..ac67cb90 100644 --- a/.github/workflows/jira_linker.yml +++ b/.github/workflows/jira_linker.yml @@ -9,10 +9,10 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'launchdarkly/integration-framework-private' steps: - - uses: launchdarkly-labs/ld-gh-actions-jira@f32de8780a3f149939408afb1563663b9a80e902 + - uses: launchdarkly-labs/ld-gh-actions-jira@676139161c434b291910fe7f8925d6c6f1026344 with: github-token: ${{ secrets.GITHUB_TOKEN }} jira-base-url: https://launchdarkly.atlassian.net jira-username: ${{ secrets.JIRA_USERNAME }} jira-api-token: ${{ secrets.JIRA_API_TOKEN }} - update-description: true + update-description: true \ No newline at end of file From a6002a60bbbafb31071dfba8aedb0048879ac108 Mon Sep 17 00:00:00 2001 From: Abiola Ayodele Date: Mon, 3 Mar 2025 17:38:50 +0530 Subject: [PATCH 905/936] Add manifest for snowflake product analytics integration (#651) --- .../assets/images/horizontal.svg | 27 +++++++++++++++++++ .../assets/images/square.svg | 1 + .../snowflake-product-analytics/manifest.json | 22 +++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 integrations/snowflake-product-analytics/assets/images/horizontal.svg create mode 100644 integrations/snowflake-product-analytics/assets/images/square.svg create mode 100644 integrations/snowflake-product-analytics/manifest.json diff --git a/integrations/snowflake-product-analytics/assets/images/horizontal.svg b/integrations/snowflake-product-analytics/assets/images/horizontal.svg new file mode 100644 index 00000000..5b792631 --- /dev/null +++ b/integrations/snowflake-product-analytics/assets/images/horizontal.svg @@ -0,0 +1,27 @@ + + logo-blue-svg + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/snowflake-product-analytics/assets/images/square.svg b/integrations/snowflake-product-analytics/assets/images/square.svg new file mode 100644 index 00000000..70bb8a73 --- /dev/null +++ b/integrations/snowflake-product-analytics/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/snowflake-product-analytics/manifest.json b/integrations/snowflake-product-analytics/manifest.json new file mode 100644 index 00000000..cae210ab --- /dev/null +++ b/integrations/snowflake-product-analytics/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Snowflake Product Analytics", + "version": "1.0.0", + "overview": "Run product analytics in LaunchDarkly using Snowflake warehouse data to power your insights.", + "description": "Carry out warehouse-native product analytics in LaunchDarkly by completing this Snowflake integration. Use your Snowflake warehouse data to track feature performance, measure user impact, and more—all without moving data.", + "author": "Snowflake", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.snowflake.com", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/product-analytics/snowflake", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "capabilities": { + "externalConfigurationURL": "https://houseware.io/connect-snowflake-warehouse" + }, + "requiresOAuth": false +} From 591cde0f68749d0e87db1d81bcc88a2b023feeb1 Mon Sep 17 00:00:00 2001 From: Henry Barrow Date: Fri, 14 Mar 2025 19:17:23 +0000 Subject: [PATCH 906/936] Add Crossplane card (#652) --- integrations/crossplane/icons/horizontal.svg | 310 +++++++++++++++++++ integrations/crossplane/icons/square.svg | 158 ++++++++++ integrations/crossplane/manifest.json | 21 ++ 3 files changed, 489 insertions(+) create mode 100644 integrations/crossplane/icons/horizontal.svg create mode 100644 integrations/crossplane/icons/square.svg create mode 100644 integrations/crossplane/manifest.json diff --git a/integrations/crossplane/icons/horizontal.svg b/integrations/crossplane/icons/horizontal.svg new file mode 100644 index 00000000..699ef0b6 --- /dev/null +++ b/integrations/crossplane/icons/horizontal.svg @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/crossplane/icons/square.svg b/integrations/crossplane/icons/square.svg new file mode 100644 index 00000000..29954631 --- /dev/null +++ b/integrations/crossplane/icons/square.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/crossplane/manifest.json b/integrations/crossplane/manifest.json new file mode 100644 index 00000000..502b3636 --- /dev/null +++ b/integrations/crossplane/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Crossplane", + "version": "1.0.0", + "overview": "Manage your LaunchDarkly resources with Crossplane.", + "description": "Use Crossplane to manage your LaunchDarkly resources.", + "details": "Crossplane is a tool for building, changing, and versioning infrastructure safely and efficiently. Crossplane can manage existing and popular service providers as well as custom in-house solutions. With the LaunchDarkly Crossplane provider, you can automate the creation and management of LaunchDarkly resources, such as projects, environments, and feature flags, streamlining your development and release workflows.​", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/crossplane", + "supportWebsite": "https://marketplace.upbound.io/providers/launchdarkly/provider-launchdarkly", + "site": "https://marketplace.upbound.io/providers/launchdarkly/provider-launchdarkly", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "categories": ["infrastructure"], + "icons": { + "square": "icons/square.svg", + "horizontal": "icons/horizontal.svg" + }, + "otherCapabilities": ["external"] +} From 879291f5ed09fafc2032421e723534a3812145dc Mon Sep 17 00:00:00 2001 From: Abiola Ayodele Date: Fri, 21 Mar 2025 15:00:21 +0100 Subject: [PATCH 907/936] =?UTF-8?q?[PA-254]=20Update=20Snowflake=20Product?= =?UTF-8?q?=20Analytics=20manifest=20with=20improved=20description?= =?UTF-8?q?=E2=80=A6=20(#653)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update Snowflake Product Analytics manifest with improved description and updated documentation links * Update integrations/snowflake-product-analytics/manifest.json Co-authored-by: Isabelle Miller --------- Co-authored-by: Isabelle Miller --- integrations/snowflake-product-analytics/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/snowflake-product-analytics/manifest.json b/integrations/snowflake-product-analytics/manifest.json index cae210ab..601b15c7 100644 --- a/integrations/snowflake-product-analytics/manifest.json +++ b/integrations/snowflake-product-analytics/manifest.json @@ -2,12 +2,12 @@ "name": "Snowflake Product Analytics", "version": "1.0.0", "overview": "Run product analytics in LaunchDarkly using Snowflake warehouse data to power your insights.", - "description": "Carry out warehouse-native product analytics in LaunchDarkly by completing this Snowflake integration. Use your Snowflake warehouse data to track feature performance, measure user impact, and more—all without moving data.", + "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features, enabling data-driven decisions to improve adoption and engagement. With LaunchDarkly PA, you can leverage warehouse-native product analytics by connecting your Snowflake data and gain insights without moving the data. ", "author": "Snowflake", "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.snowflake.com", - "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/product-analytics/snowflake", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/product-analytics/setup", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, "categories": ["data"], From 47d921ce0b67a6bcf0e6cf8d1718511b598169b6 Mon Sep 17 00:00:00 2001 From: Abiola Ayodele Date: Tue, 1 Apr 2025 10:54:12 +0100 Subject: [PATCH 908/936] Rename Snowflake Product Analytics to Snowflake Native Product Analytics and update documentation link for LaunchDarkly integration (#654) --- integrations/snowflake-product-analytics/manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/snowflake-product-analytics/manifest.json b/integrations/snowflake-product-analytics/manifest.json index 601b15c7..cc551f79 100644 --- a/integrations/snowflake-product-analytics/manifest.json +++ b/integrations/snowflake-product-analytics/manifest.json @@ -1,5 +1,5 @@ { - "name": "Snowflake Product Analytics", + "name": "Snowflake Native Product Analytics", "version": "1.0.0", "overview": "Run product analytics in LaunchDarkly using Snowflake warehouse data to power your insights.", "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features, enabling data-driven decisions to improve adoption and engagement. With LaunchDarkly PA, you can leverage warehouse-native product analytics by connecting your Snowflake data and gain insights without moving the data. ", @@ -7,7 +7,7 @@ "supportEmail": "support@launchdarkly.com", "links": { "site": "https://www.snowflake.com", - "launchdarklyDocs": "https://launchdarkly.com/docs/home/product-analytics/setup", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/product-analytics", "privacyPolicy": "https://launchdarkly.com/policies/privacy" }, "categories": ["data"], From 9287cbac6d96e3eeb0363a6d14da38921b40fe3a Mon Sep 17 00:00:00 2001 From: Abiola Ayodele Date: Fri, 4 Apr 2025 10:39:27 +0100 Subject: [PATCH 909/936] Refactor: Replace houseware url with LaunchDarkly documentation in Manifest (#655) * Rename Snowflake Product Analytics to Snowflake Native Product Analytics and update documentation link for LaunchDarkly integration * Update externalConfigurationURL in Snowflake Product Analytics manifest to point to the correct LaunchDarkly documentation --- integrations/snowflake-product-analytics/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/snowflake-product-analytics/manifest.json b/integrations/snowflake-product-analytics/manifest.json index cc551f79..342fbfd9 100644 --- a/integrations/snowflake-product-analytics/manifest.json +++ b/integrations/snowflake-product-analytics/manifest.json @@ -16,7 +16,7 @@ "horizontal": "assets/images/horizontal.svg" }, "capabilities": { - "externalConfigurationURL": "https://houseware.io/connect-snowflake-warehouse" + "externalConfigurationURL": "https://launchdarkly.com/docs/home/product-analytics" }, "requiresOAuth": false } From c97c4db8fec1452d5aebd38dcf43c1184724b4b5 Mon Sep 17 00:00:00 2001 From: Behn <7383025+BehnH@users.noreply.github.com> Date: Fri, 4 Apr 2025 10:59:14 +0100 Subject: [PATCH 910/936] Remove jira linker (#656) --- .github/workflows/jira_linker.yml | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 .github/workflows/jira_linker.yml diff --git a/.github/workflows/jira_linker.yml b/.github/workflows/jira_linker.yml deleted file mode 100644 index ac67cb90..00000000 --- a/.github/workflows/jira_linker.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Jira Issue Linker - -on: - pull_request: - types: [opened, edited, synchronize] - -jobs: - jira-issue-link: - runs-on: ubuntu-latest - if: github.repository == 'launchdarkly/integration-framework-private' - steps: - - uses: launchdarkly-labs/ld-gh-actions-jira@676139161c434b291910fe7f8925d6c6f1026344 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - jira-base-url: https://launchdarkly.atlassian.net - jira-username: ${{ secrets.JIRA_USERNAME }} - jira-api-token: ${{ secrets.JIRA_API_TOKEN }} - update-description: true \ No newline at end of file From 5d945696cab54aa642b0c84ed2859e580c6a2d82 Mon Sep 17 00:00:00 2001 From: Abiola Ayodele Date: Tue, 8 Apr 2025 19:13:18 +0100 Subject: [PATCH 911/936] [PA-329] Feat: Add JSON schema for internal configuration URL capability (#658) * Feat: Add JSON schema for internal configuration URL capability * Feat: Add internal configuration URL capability to manifest schema - Introduced new type `InternalConfigurationURL` in `manifest.schema.d.ts` to handle redirection for integration creation and editing. - Updated `manifest.schema.json` and `schemas/base.json` to include `internalConfigurationURL` in capabilities and properties. --- manifest.schema.d.ts | 5 +++++ manifest.schema.json | 11 ++++++++++- schemas/base.json | 6 +++++- schemas/capabilities/internalConfigurationUrl.json | 11 +++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 schemas/capabilities/internalConfigurationUrl.json diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 32a12e7f..486ec9c5 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -734,6 +734,10 @@ export type ErrorMonitoringNewIssueFoundTemplate = string; * Form variables to use for flag cleanup */ export type FlagCleanupFormVariables = FormVariable[]; +/** + * This capability will redirect users to an internal URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly. + */ +export type InternalConfigurationURL = string; /** * Unique key to be used to save and retrieve OAuth credentials used by your app. This is required if your app uses an OAuth flow. */ @@ -887,6 +891,7 @@ export interface Capabilities { flagImport?: FlagImport; eventsHook?: EventsHook; flagCleanup?: FlagCleanup; + internalConfigurationURL?: InternalConfigurationURL; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index f630b3fa..9c02b912 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -764,7 +764,8 @@ "bigSegmentStore", "flagImport", "eventsHook", - "flagCleanup" + "flagCleanup", + "internalConfigurationURL" ] }, "properties": { @@ -5282,6 +5283,14 @@ "default": [] } } + }, + "internalConfigurationURL": { + "$id": "#/properties/capability/internal-configuration-url", + "title": "Internal Configuration URL", + "description": "This capability will redirect users to an internal URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly.", + "type": "string", + "maxLength": 2048, + "pattern": "^(/[^/]+)+(?:\\?[^\\s]*)?$|^[^/]+(/[^/]+)*(?:\\?[^\\s]*)?$" } } }, diff --git a/schemas/base.json b/schemas/base.json index cfb9f32f..910e4a8e 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -279,7 +279,8 @@ "bigSegmentStore", "flagImport", "eventsHook", - "flagCleanup" + "flagCleanup", + "internalConfigurationURL" ] }, "properties": { @@ -324,6 +325,9 @@ }, "flagCleanup": { "$ref": "schemas/capabilities/flagCleanup.json#/flagCleanup" + }, + "internalConfigurationURL": { + "$ref": "schemas/capabilities/internalConfigurationUrl.json#/internalConfigurationURL" } } }, diff --git a/schemas/capabilities/internalConfigurationUrl.json b/schemas/capabilities/internalConfigurationUrl.json new file mode 100644 index 00000000..81f8227a --- /dev/null +++ b/schemas/capabilities/internalConfigurationUrl.json @@ -0,0 +1,11 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "internalConfigurationURL": { + "$id": "#/properties/capability/internal-configuration-url", + "title": "Internal Configuration URL", + "description": "This capability will redirect users to an internal URL when they attempt to create or edit the integration from the integrations page in LaunchDarkly.", + "type": "string", + "maxLength": 2048, + "pattern": "^(/[^/]+)+(?:\\?[^\\s]*)?$|^[^/]+(/[^/]+)*(?:\\?[^\\s]*)?$" + } +} From 23cd574f68059e100dbea488823587f6d1741334 Mon Sep 17 00:00:00 2001 From: Abiola Ayodele Date: Thu, 10 Apr 2025 17:19:05 +0100 Subject: [PATCH 912/936] Feature: Implement warehouse Native Product Analytics integration with manifest and assets (#659) - Added manifest.json for BigQuery , Databricks, snowflake native Product Analytics, - Add new internalConfigurationUrl capabilities . --- .../assets/images/horizontal.svg | 213 ++++++++++++++++++ .../assets/images/square.svg | 12 + .../manifest.json | 22 ++ .../assets/images/horizontal.svg | 62 +++++ .../assets/images/square.svg | 10 + .../manifest.json | 22 ++ .../assets/images/horizontal.svg | 27 +++ .../assets/images/square.svg | 1 + .../manifest.json | 22 ++ 9 files changed, 391 insertions(+) create mode 100644 integrations/bigquery-native-product-analytics/assets/images/horizontal.svg create mode 100644 integrations/bigquery-native-product-analytics/assets/images/square.svg create mode 100644 integrations/bigquery-native-product-analytics/manifest.json create mode 100644 integrations/databricks-native-product-analytics/assets/images/horizontal.svg create mode 100644 integrations/databricks-native-product-analytics/assets/images/square.svg create mode 100644 integrations/databricks-native-product-analytics/manifest.json create mode 100644 integrations/snowflake-native-product-analytics/assets/images/horizontal.svg create mode 100644 integrations/snowflake-native-product-analytics/assets/images/square.svg create mode 100644 integrations/snowflake-native-product-analytics/manifest.json diff --git a/integrations/bigquery-native-product-analytics/assets/images/horizontal.svg b/integrations/bigquery-native-product-analytics/assets/images/horizontal.svg new file mode 100644 index 00000000..03622f8b --- /dev/null +++ b/integrations/bigquery-native-product-analytics/assets/images/horizontal.svg @@ -0,0 +1,213 @@ + + + + + + image/svg+xml + + integration-tile + + + + + + + + integration-tile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/bigquery-native-product-analytics/assets/images/square.svg b/integrations/bigquery-native-product-analytics/assets/images/square.svg new file mode 100644 index 00000000..76e46050 --- /dev/null +++ b/integrations/bigquery-native-product-analytics/assets/images/square.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/integrations/bigquery-native-product-analytics/manifest.json b/integrations/bigquery-native-product-analytics/manifest.json new file mode 100644 index 00000000..f22b571d --- /dev/null +++ b/integrations/bigquery-native-product-analytics/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "BigQuery Native Product Analytics", + "version": "1.0.0", + "overview": "Run product analytics in LaunchDarkly using bigQuery warehouse data to power your insights.", + "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features, enabling data-driven decisions to improve adoption and engagement. With LaunchDarkly PA, you can leverage warehouse-native product analytics by connecting your bigQuery data and gain insights without moving the data. ", + "author": "Google BigQuery", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://cloud.google.com/bigquery", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/product-analytics", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "capabilities": { + "internalConfigurationURL": "product-analytics/integrations/bigquery" + }, + "requiresOAuth": false +} diff --git a/integrations/databricks-native-product-analytics/assets/images/horizontal.svg b/integrations/databricks-native-product-analytics/assets/images/horizontal.svg new file mode 100644 index 00000000..b61e33b9 --- /dev/null +++ b/integrations/databricks-native-product-analytics/assets/images/horizontal.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/integrations/databricks-native-product-analytics/assets/images/square.svg b/integrations/databricks-native-product-analytics/assets/images/square.svg new file mode 100644 index 00000000..b1e921fc --- /dev/null +++ b/integrations/databricks-native-product-analytics/assets/images/square.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/integrations/databricks-native-product-analytics/manifest.json b/integrations/databricks-native-product-analytics/manifest.json new file mode 100644 index 00000000..9d013e5b --- /dev/null +++ b/integrations/databricks-native-product-analytics/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Databricks Native Product Analytics", + "version": "1.0.0", + "overview": "Run product analytics in LaunchDarkly using databricks warehouse data to power your insights.", + "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features, enabling data-driven decisions to improve adoption and engagement. With LaunchDarkly PA, you can leverage warehouse-native product analytics by connecting your databricks data and gain insights without moving the data. ", + "author": "Databricks", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.databricks.com", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/product-analytics", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "capabilities": { + "internalConfigurationURL": "product-analytics/integrations/databricks" + }, + "requiresOAuth": false +} diff --git a/integrations/snowflake-native-product-analytics/assets/images/horizontal.svg b/integrations/snowflake-native-product-analytics/assets/images/horizontal.svg new file mode 100644 index 00000000..5b792631 --- /dev/null +++ b/integrations/snowflake-native-product-analytics/assets/images/horizontal.svg @@ -0,0 +1,27 @@ + + logo-blue-svg + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/snowflake-native-product-analytics/assets/images/square.svg b/integrations/snowflake-native-product-analytics/assets/images/square.svg new file mode 100644 index 00000000..70bb8a73 --- /dev/null +++ b/integrations/snowflake-native-product-analytics/assets/images/square.svg @@ -0,0 +1 @@ + diff --git a/integrations/snowflake-native-product-analytics/manifest.json b/integrations/snowflake-native-product-analytics/manifest.json new file mode 100644 index 00000000..28c5f3d2 --- /dev/null +++ b/integrations/snowflake-native-product-analytics/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Snowflake Native Product Analytics", + "version": "1.0.0", + "overview": "Run product analytics in LaunchDarkly using Snowflake warehouse data to power your insights.", + "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features, enabling data-driven decisions to improve adoption and engagement. With LaunchDarkly PA, you can leverage warehouse-native product analytics by connecting your Snowflake data and gain insights without moving the data. ", + "author": "Snowflake", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.snowflake.com", + "launchdarklyDocs": "https://launchdarkly.com/docs/home/product-analytics", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "capabilities": { + "internalConfigurationURL": "product-analytics/integrations/snowflake" + }, + "requiresOAuth": false +} From da6367333a60b0d6b5ba760d3d431becd49344ef Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 29 Apr 2025 16:28:45 +0200 Subject: [PATCH 913/936] [REL-6866] Imiller/rel 6866/reconcile integration framework repos (#661) * Releasing changes publicly * Bump path-parse from 1.0.6 to 1.0.7 Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump ws from 7.4.2 to 7.5.3 Bumps [ws](https://github.com/websockets/ws) from 7.4.2 to 7.5.3. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.2...7.5.3) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] * Releasing changes publicly * Releasing changes publically (#9) * Releasing changes publicly * Bump url-parse from 1.5.3 to 1.5.8 (#12) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.8. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.8) --- updated-dependencies: - dependency-name: url-parse dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Releasing changes publicly * Adding Atlassian Compass to LD integrations page (#16) * Adding Atlassian Compass to LD integrations page * Update integrations/compass/assets/images/horizontal.svg Co-authored-by: Henry Barrow * Update integrations/compass/assets/images/square.svg Co-authored-by: Henry Barrow Co-authored-by: Matt Dellandrea <9593724+mdellandrea@users.noreply.github.com> Co-authored-by: Henry Barrow * Fix schema from bad merge (#17) * Imiller/ch78837/update some categories (#130) * add missing categories messaging, code-references, log-management, issue-tracking, analytics * update msteams * update honeycomb, logdna, dynatrace * update appoptics, datadog, grafana * update new relic, signalfx, splunk * update appdynamics and jira * update circleci, heap, pendo * update gitlab and trello * update git and slack app * update bitbucket pipes (not pipelines/flags) and github * Imiller/ch78837/remove unused categories (#131) * remove unused from sample-integration * remove from base schema & manifest schema * Update s3 buckets in circle config (#132) * Add validation template (#135) * coderefs copy changes (#138) * coderefs copy changes * update icon * cleanup * Update manifest.json * Update git integration name to "Code references" (#139) * update coderefs integration title * remove yarn.lock * Imiller/ch69350/audit appdynamics template and manifest (#65) * Resolve merge conflict (#141) * Promoting from prod to catfood (#114) * Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru * Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Deploy to prod (#110) * Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Henry Barrow Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Promote staging to production (#119) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Isabelle Miller * Deploy Catfood from production (#121) * Merging these manifest changes forward (#92) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru * Deploy to prod (#108) * Add files via upload * Update logo_new_logo_symbol.svg * Delete logo_new_logo_white.svg Not needed * Delete logo_new_logo_mixed.svg Not needed * Delete logo_new_logo_dark.svg Not needed * Add files via upload adding back in the "dark" image needed for horizontal images * Update logo_new_logo_dark.svg whitespace fix * Sentry updates (#90) * make sure transaction text renders without html entities * add note to sentry readme about versioning * Added details, updated descriptions (#91) * Added details parameter in schema and filled it out for learn more integrations. Updated the descriptions of some integration from the Q1 refresh document * deleting sentry (#95) * Update the readme for scalability and clarity (and correctness) (#93), add license, issue templates, pr template, and more context (#94) * Imiller/ch75071/add oauth consumer support to goaltender (#96) * add requiresOauth to manifest schema base.json * add 'oauth' as a formVariable type * simplify title Co-authored-by: Henry Barrow * change requiresOauth to requiresOAuth Co-authored-by: Henry Barrow * update base.json to change requiresOauth to requiresOAuth * pull oauth vars into endpointContext in preview.js * hardcode oauth params as dummy strings * add function to add oauth context to full context * add requiresOAuth = true to sample-integration manifest * add test to ensure correct oauth parameters are set on the correct integrations and are not null * move oauth to endpointContext instead of fullContext * change getEndpointContext back to getFormVariableContext Co-authored-by: Henry Barrow * add test to make sure no non-string formVariables get set to isSecret so it doesn't break encryption (#97) * final prep for public/private mirror split (#98) * Fix status indicator for new repo (#99) * Copyedits README (#100) * add merge-to-public script (#101) * Update appdynamics manifest to require OAuth and add URL helpers (#102) * Configure app dynamics for OAuth * improve form var description * Add optional comment * Update AppDynamics for OAuth and add new URL helpers * Add configurable host URL to Datadog V2 manifest (#103) * Add configurable host URL * update URLs * Switch to enum * Update Datadog "text" field to support markdown (#104) * Update Datadog "text" field to support markdown * Add markdown support for env and proj templates Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * Deploy to prod (#110) * better logdna link (#112) * Deploying my latest change to prod (#113) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates * Promote staging to production (#119) * minor honeycomb update (#106) * finalize logdna integration (#105) * add community-inspired section to pr template (#109) * better logdna link (#112) * add docs link to manifest schema (#115) * Imiller/ch77495/add patch page deep link to webhook context (#116) * add details link to flag sample-context * add details links to other sample-contexts * add details links to project sample-context * add details to links for env sample-context * for envs with key ~ use other link format * missed one * improvement to merge script (#111) * improvement to merge script * adding logging * adding -x * Add custom property query parameters to AppDynamics events (#117) * Move comment to card and add a bunch of custom properties * Remove extra .json from preview script * Datadog - Add more tags - including envrionment name (#118) * Add more tags - including envrionment name * Add kind to all templates Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * Promoting from stg to prod (#127) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Henry Barrow Co-authored-by: Isabelle Miller * Deploy new relic to prod (#129) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add more detail to new relic template (#126) Co-authored-by: Henry Barrow Co-authored-by: Isabelle Miller * Promote staging -> prod (#133) * Remove duplicate test (#122) * Imiller/ch77495/add patch page deep link to webhook context 2 (#123) * change honeycome _links.site.href to _links.details.href * change appoptics _links.site.href to _links.details.href * change new relic _links.site.href to _links.details.href * Point upload script to new staging bucket (#125) * Imiller/ch77493/update manifest links (#124) * update links in the As * update Bs * update Cs & Ds * update Es and Gs * update Hs, Js, Ks, and Ls * update Ms, Ns, and Os * update Ps and Ss * update Ts, Vs, Ws * update jira site link Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update ansible links * update heap links Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * add more detail to new relic template (#126) * Imiller/ch74105/add member details to existing integrations (#89) * update msteams default template * add user data to dynatrace payload * add instructions for testing signalfx * add user data to signalfx template * remove entire comment field if no comment * make user link to mailto instead of user payload * fix trailing comma Co-Authored-By: Henry Barrow * remove superfluous space Co-Authored-By: Henry Barrow * move comma to inside if to fix invalid json * fix trailing whitespace * move trailing commas to inside handlebars ifs * add if around name for in case it's not set * add user data to splunk payload * only display comment field if there is a comment * revert msteams default template to original * signalfx - separate user and user email into two fields * splunk - separate user and user email into separate fields * update spacing Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * separate dynatrace user into name and email Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * update spacing on splunk Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * remove lingering parentheses * don't display user name if both don't exist * fix capitalization * add missing space * add missing space Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * Imiller/ch78837/update some categories (#130) * add missing categories messaging, code-references, log-management, issue-tracking, analytics * update msteams * update honeycomb, logdna, dynatrace * update appoptics, datadog, grafana * update new relic, signalfx, splunk * update appdynamics and jira * update circleci, heap, pendo * update gitlab and trello * update git and slack app * update bitbucket pipes (not pipelines/flags) and github * Imiller/ch78837/remove unused categories (#131) * remove unused from sample-integration * remove from base schema & manifest schema * Update s3 buckets in circle config (#132) Co-authored-by: Isabelle Miller Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * Deploy prod (#136) Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Isabelle Miller Co-authored-by: Sunny Guduru Co-authored-by: Henry Barrow Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich * renamed coderefs folder to git * delete coderefs folder * Add new capability to manifest schema (#146) * Added OAuth tidbit (#147) * Added OAuth tidbit * Added missing period. * Copy *.svgs to static.launchdarkly.com (#148) * Rename remote update to trigger (#149) * Rename remote update -> trigger * Update title * Update docs * Update docs/capabilities.md Co-authored-by: Isabelle Miller Co-authored-by: Isabelle Miller * Testing Azure Event Hub integration * Requested changes * Requested changes * Update heap url (#154) * Change New Relic integration to use their deployment api (#153) * adding code snippets and validation template info to docs (#155) * Bump lodash from 4.17.15 to 4.17.19 (#158) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fixed name of integration (from azure-event-hub to azure-event-hubs) * Added integration icon * Remove validation templates from integrations with configurable hosts (#160) * Remove MSteams validation (#163) * Re-enable validation template for configurable host integrations (#165) * Imiller/ch83288/add trigger to datadog manifest (#168) * add trigger capability to datadog manifest * add parser * add note to docs about payload * Imiller/ch83287/add trigger to honeycomb manifest (#169) * add trigger to honeycomb + update readme * add sample payload * add some more detail to datadog readme * add parser * remove value from parser * switch out launchdarkly for team name var * Revert "switch out launchdarkly for team name var" This reverts commit 91cdffd4cd10f84876fdebd1388e033a5dde642f. * Revert "remove value from parser" This reverts commit 002deab54ed53d416c5379da916de07a4d0c6f67. * update link to integrations center and remove value from parser (#170) * Update event-hub integration link * Fix broken trigger doc link (#172) * Minor trigger doc update (#173) * Imiller/ch84138/use goaltender parsers when handling inbound (#174) * rename parser paths * rename external condition parser * split trigger parser out into separate parser schema file * remove redundant id paths * Revert "remove redundant id paths" This reverts commit c8c0e7c6a7653c06a03315836f807a5a1fed0cdd. * Revert "split trigger parser out into separate parser schema file" This reverts commit bc3adb0c1a1f0c4e278b9e7a11c21ae38868eb9b. * Revert "rename external condition parser" This reverts commit 7a5dcdbd876c2fbba14f4bd66d7777b6deb1c55d. * Revert "rename parser paths" This reverts commit c131dca2fb0760a1bf32205377a1d749597a896a. * rename trigger parser from 'parser' to 'trigger-parser' * oops make it trigger parser, not trigger body parser * Use the COMMIT_MSG var (#175) * Add support for generic trigger (#176) * Add generic trigger * Update description and logo * Remove templates * Add readme * Change name to Generic (#178) * Update README to call out "trigger" auto-append (#179) * Update README * grammar * Require isOptional = true when defaultValue is used (#181) * Make datadog host optional * Use isOptional wherever defaultValue is used and add test lock this change in * update docs * use org-global for deploy-to-s3 jobs (#182) * Update bucket names in circle config (#184) * clean up circle config * Update datadog trigger parser and readme (#183) * [ch87329] Add automatic clubhouse ticketeting for private repo (#185) * Add generic trigger icon (#186) * [ch87329] Fix clubhouse link (#187) * [ch87972] updated trigger urls and descriptions (#188) * [ch87971] Add new eventName field and default value (#190) * Add new eventName field and default value * Add deprecation warning * Add eventName to all triggers * Fix generic template parser paths (#191) * readme update for generic triggers (#189) * adding some periods (#194) * Bump yargs-parser from 18.1.1 to 18.1.3 (#197) Bumps [yargs-parser](https://github.com/yargs/yargs-parser) from 18.1.1 to 18.1.3. - [Release notes](https://github.com/yargs/yargs-parser/releases) - [Changelog](https://github.com/yargs/yargs-parser/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/yargs-parser/compare/v18.1.1...v18.1.3) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [ch83496] Upload archive of manifests to artifacts bucket instead of directy copying to deploy buckets (#198) * Send webhook to spinnaker when build is done (#199) * [ch83496] auto deploy staging pt 2 (#200) * Add Azure Active Directory docs link (#201) * [ch90065] add trigger capability to signalfx (#203) * add trigger capability * add signalfx webhook doc link to readme * [ch91335] remove deprecated alertName trigger parser field (#205) * add triggers capability * eventName and alertName should be the same * chagne event_type to condition_name * remove alertName * update doc link * update capabilities.md to use eventName instead of alertName * remove alertName from all integration manifests * remove alertName from schemas * remove trigger capability from new relic manifest since it should be on a different pr * [ch90570] add testEventNameRegexp field to schema (#206) * add testEventNameRegexp field to schema * add note to doc * add testEventNameRegexp to propertyNames list * [ch90823] add triggers capability (#204) * add triggers capability * eventName and alertName should be the same * chagne event_type to condition_name * remove alertName * update doc link * update name and description" * update overview as well * make exact match Co-authored-by: Henry Barrow * remove triggers from overview and description Co-authored-by: Henry Barrow * [ch90064] add trigger capability to dynatrace manifest (#202) * add trigger * add dynatrace doc link to readme * change parser fields to match datadog * add testEventNameRegexp * [ch92301] add test event to datadog trigger (#207) * add test event regex for datadog * update honeycomb manifest for tests * remove test events & change eventName back * Default is not an accepted value (#208) * [ch78771] update templates to use new displayName field (#209) * add displayName to sample context * update dynatrace flag template * add displayName to all flag sample contexts * add displayName to env sample contexts * add displayName to other sample xontexts * add displayName to project sample contexts * update elastic template * update logdna template * update new relic template (including deprecated just for kicks) * update signalfx template * update splunk template * [ch94760] Save junit tests on Circle (#210) * Use pinned node orb * use junit and save results * [ch95983] add dynamicEnum formVariable type field (#212) * add displayName to sample context * update dynatrace flag template * add displayName to all flag sample contexts * add displayName to env sample contexts * add displayName to other sample xontexts * add displayName to project sample contexts * update elastic template * update logdna template * update new relic template (including deprecated just for kicks) * update signalfx template * update splunk template * add dynamicEnum to formVariables type definition * add sample dropdownOptions field of dynamicEnum type * refactor endpoint out of auditLogEventsHook for general use across capabilities * add parser to dynamicOptions schema * refactor endpoints * add test to check dynamicEnum has dynamicOptions and vice versa * [ch95983] Add reqres API endpoint to sample-integration manifest (#213) * Add reqres API endpoint to sample-integration manifest * make sure dynamic enum is passed to context in preview and tests * Add color as query param * [ch95892] Goaltender info for Tray (tray.io) (#211) * [ch95983] refactor reusable components out of schema (#214) * refactor documentation url out of trigger * replace external condition endpoint with generic * factor out the subparts of the reusable endpoint to allow for description flexibility * replace external condition endpoint properties * refactor endpointProperties * refactor out capability parsers into parser file * Add string type to endpoint method and make it required (#215) * Remove oauth from sample-integration (#216) * Move formVariable items to definitions.json (#217) * [ch95986] Add approval capability schema (#218) * Move formVariable items to definitions.json * Add approval capability * Remove periods in description * generate typescript type definitions from schema JSON * fix indentation * [ch97425] Add first draft of ServiceNow manifest (#220) * Add first draft of servicenow manifest * Bump jest version to remove vulnerability warning * Ensure defualt values are provided when formVariable is optional (#221) * Imiller/ch98557/update approvalParser schema to have approvalId (#222) * add approvalId to approval parser * add approvalId to propertyNames * best guess at servicenow approvalId path * pull package-lock.json over from master * Add short description query param to creation template to verify everything is working (#223) * add urlTemplate to approvalparser (#224) * add deletionRequest * update servicenow status endpoint (#225) * Use Implementing state as Servicenow approval condition (#226) * [ch98744] Add justification to servicenow manifest (#227) * Add justification * Add url template * Add Servicenow svgs (#228) * [ch100894] add new memberListRequest to approvals schema (#229) * add member list request and new member list parser to approvals schema * forgot to add memberListRequest to property list * actually probably want this to be required * add servicenow memberListRequest * make not required for now so it doesn't break all the goaltender tests * oops forgot leading slash * change user to member * update snow manifest * well that was a bug * missed some members * missed some more * update descriptions * how many typos can i make in a day * fix typo (#230) * Imiller/ch97553/make MemberListRequest required (#231) * fix typo * make required * Make deletion request required (#232) * [ch101451] Add postApplyRequest and add parser to deletionRequest (#233) * Add postApplyRequest to schema and add parser to deletionRequest * Make parsers required and move memberListRequest up * [ch101677] add requested_by to SNow creation requests (#234) * it turns out it's user_name, not sys_id, that we wanted * add requested_by to creation request * pass member id from context Co-authored-by: Henry Barrow Co-authored-by: Henry Barrow * Add link to LD approval request to ServiceNow change request (#235) * Minor vscode card updates (#237) * Fix externalMemberId bug (#239) * Reject approval requests when change request is in state 4 (#238) * Improve servicenow description and sentance case environment form variable name (#240) * [ch102661] Improve serveral horizontal icons (#241) * Route staging deploys through Thumb Seeker (#242) * add IntelliJ card (#236) * [ch103605] remove external condition (#243) * remove external condition * remove tests * [ch103708] add otherCapabilities array to phase out legacy kind (#244) * replace legacy with externalCapabilities * everything at once for pre commits * add sso and ide capabilities * categorize sso and ide integrations * add legacy back in + external and externalEnterprise capabilities * remove slackWebhooks from externalCapabilities * add legacy back in to manifests * add test to enforce at least one capability * remove externalEnterprise * change external to other * add minItems to enforce * Adding a better link for the pendo integration (#245) * Add basicAuthHeaderValue helper documentation and example (#246) * Add JSON body template string to all approval requests (#247) * Add horizontal appoptics logo (#248) * Update sample context to include 'simple' timestamp format (#249) * [ch105018] Use JSON body for ServiceNow creation request and set start and end dates (#250) * Use jsonBody for request * Include start and end date in creation request * bump handlebars package due to vulnerability (#253) * Bump hosted-git-info from 2.8.8 to 2.8.9 (#254) * bump lodash (#256) * [ch105018] Add ServiceNow C0 manifest (#251) * Use jsonBody for request * Update servicenow-c0 manifest * Bump ws from 7.4.2 to 7.4.6 (#257) Bumps [ws](https://github.com/websockets/ws) from 7.4.2 to 7.4.6. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.2...7.4.6) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Henry Barrow * [ch105018] Update servicenow-c0 creation request path (#258) * Update servicenow-c0 creation request path * fix creation request url * Temporarily use plaintext password for servicenow-c0 manifest (#259) * Update servicenow-c0 urlTemplate based on provided information (#260) * [ch105018] Update servicenow-c0 creation request based on feedback (#262) * Update servicenow-c0 to use isSecret for password * Update servicenow-c0 creation request based on feedback * Add formatWithOffset helper (#263) * Include timestamp offset in servicenow-c0 and add additional required field (#264) * [ch111110] Use nvmrc file and node v14 (#266) * Use nvmrc file and node v14 * Update docs * [ch111068] fake akamai integration (#265) * Added zendesk goaltender card * Removed unused license file for zendesk * Update integrations/zendesk/manifest.json nice, looks good to me Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> * [ch110701] Utilize reserved custom properties for servicenow-c0 manifest" (#268) * start using custom properties in servicenow-c0 manifest * remove environment form variables * servicenow-c0 ensure end_date is after start_date (#269) * fake fastly integration (#270) * Update servicenow-c0 to use custom properties in postApply and deletion requests (#271) * Descrease timestamp offset (#272) * Added description to reserved custom properties and updated datadog reserved custom property to have description * Updated sample reserved custom property in docs * [ch113600] Update servicenow-c0 description, short_desription, start_date, and end_date (#274) * Update servicenow-c0 description, short_desription, start_date, and end_date * Use double brackets when possible * Add leading \n to serivenow-c0 justification (#275) * [ch110172] Add flag form variables to manifest schema (#276) * Add flag form variables to manifest schema * Fix grammar * Bump path-parse from 1.0.6 to 1.0.7 (#277) Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [ch109967] Add flagFormVariables to servicenow-c0 manifest (#279) * Add flagFormVariables to servicenow-c0 manifest * Add userID to postApply and deletion requests * Add emailLocalPart to all sample context (#280) * Updating heap and pendo doc URLs (#278) * Update servicenow-c0 manifest to use emailLocalPart as serviceNow username (#281) * Reduce start and end date offest for servicenow-c0 (#283) * Use git gatsby tray docs link (#282) * Remove state parameter form servicenow-c0 creation request (#285) * Updating ansible docs link (#284) * [ch120153] Add support for new feature store capability (#286) * add new manifest for featureStore and cloudflare * fixing typo * update svg, update description * run prettier * removing period * fix newline * fixing whitespace, removing placeholders * Added includeErrorResponseBody property in autiLogEventHook capability * Fixed typo * [ch122281] Only include error response body for integrations that do not have customizable domains (#288) * Whitelist including error response body for integrations that do not have customizable domains * Remove feature from signalFX * Bump tmpl from 1.0.4 to 1.0.5 (#289) Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5. - [Release notes](https://github.com/daaku/nodejs-tmpl/releases) - [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5) --- updated-dependencies: - dependency-name: tmpl dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add cache control headers to integrations svgs (#290) * Remove unused copy_to_s3.sh (#291) * [sc-123860] Clubouse GH action -> Shortcut (#292) * Clubouse GH action -> Shortcut * Update name of action * [sc-122283] add test to check domain is static when includeErrorResponseBody is set to true (#293) * this should work * account for dynamic subdomains * check for multiple substrings in hostname * [sc-124497] add connector ui blocks to prelim capability schema (#294) * add connector ui blocks to prelim capability schema * forgot to commit parser * update description * forgot to actually add to base.json (#295) * a few small edits (#296) * forgot brace * some updates * naming updates and add new types (#297) * small updates for cloudflare * updating doc links (#299) * [sc-128309] Update labels for Clouflare KV ID form field (#300) Also adds missing periods to description text. * [sc-126368] add external references to slack-app (#301) * remove lingering redundant parser property from externalReferences * update metadata block paths and add hyperlink type * Added definitions and schema for UI block and elements for external flag refs capability * Updated with PR feedback and replaced timestamp type with isTimestamp boolean boolean * Made ui block text required and updated jira ui block template string * [sc-130013] add placeholders to cloudflare manifest (#303) Uses example values which are straight out of Cloudflare's own API docs See: https://api.cloudflare.com/ * Added UI blocks for slack app * Fixing slack context block timestamp defaulting to the 70s * [sc-129873] add eu data center option for new relic one integration (#308) * feat: add and use new formVariable * feat: integration working with new EU endpoint * docs: fix typo in readme * fix: fix existing US url * fix: fix existing US url * chore: Apply suggestions from code review Co-authored-by: Henry Barrow * fix: escape quotes in description * fix: remove includeErrorResponseBody as domain is not static anymore * feedback: account for existing integrations not having domain field Co-authored-by: Henry Barrow * chore: make things pretty Co-authored-by: Henry Barrow * [sc-132618] Upgrade node to v16 and resolve secuirty vulnerabilities (#309) * Upgrade node to v16 * Resolve security vulnerabilities * Add the option to change where default information is populated in ServiceNow (#310) * Renaming external refs to flag links * More renaming * Renamed link context -> flag link context * Update Cloudflare manifest * Update feature store capability schema * Initial integration for ld2git. * add template for webhook event. * Review comments. * adding general integration docs. * scoping out secret/token based on value set. * expose ld api token. * cleanup. * Fix description. Co-authored-by: Isabelle Miller * Fix secret description. Co-authored-by: Isabelle Miller * Update integrations/ld-to-git/manifest.json * Update integrations/ld-to-git/manifest.json * Escaping some flag link templates * Fix Cloudflare manifest JSON pointers * [sc-129419] First draft documentation for feature store capability (#313) * first draft feature store capability * removing ... * Update docs/capabilities.md Co-authored-by: Jaz White * swap sections * Apply suggestions from code review Co-authored-by: Molly * PR feedback * sample to example * Apply suggestions from code review Co-authored-by: Molly * Apply suggestions from code review Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Jaz White Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> * Add 5 minute offset to end date in servicenow creation request (#317) * Updated empty state text * Add all 6 Datadog sites to Datadog manifest (#319) * Updated flag link metadata schema to be an object instead of an array * Removed unused flag link metadata property for slack app * Replace slack manifest's flag link permalink metadata attribute with deeplink since they are both the same * Updated URLs for flag links docs * Updated Jira header text match Atlassian's branding * [sc-137630] remove parser for delivery request (#323) * [sc-137630] remove parser for delivery request * [sc-138928] add generic feature store integration manifest for testing (#324) Co-authored-by: Henry Barrow Co-authored-by: Carmen Quan Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> * Increase servicenow-c0 end_date offset to 5 mins (#325) * Increase servicenow-c0 start_date from 1s to 5s (#326) * Renaming references to master to be main * Rename master to main in bash script * Added Dynatrace cloud automation manifest for trigerring flag change events in LaunchDarkly from their cloud sequence * Updated the flag links capaibility verbiage to match the new design verbiage * Small text change * Bump url-parse from 1.5.3 to 1.5.9 (#332) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.9. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.9) --- updated-dependencies: - dependency-name: url-parse dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Removing date/time elements from the flag links ui blocks since these are no longer needed in the new design * request issue if user is not service owner * Updated context text for jira * Remove unnecessary line breaks (#336) * Remove unnecessary line breaks * Trim trailing whitespace * Remove flag link stub * [sc-143291] Add a hide member details checkbox to datadog integration (#333) * add hideMemberDetails formVariable * dont send memberName tag if hideMemberDetails is true * build title from titleVerb and targetName for project and env templates * default template sends nothing for member events with hideMemberDetails, and filters memberDetails for other events if required * fix tag generation in project and env templates * update logic in default template, add equalWithElse helper * [sc-145741] docs: copyedits and minor cleanup (#338) * docs: copyedits and minor cleanup * Apply suggestions from code review Co-authored-by: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> * Update docs/capabilities.md * Apply suggestions from code review: integrations team, not integration team Co-authored-by: Henry Barrow * remove mention of auth per discussion here: https://github.com/launchdarkly/integration-framework-private/pull/338/files#r828030266 * one more integration -> integrations team correction Co-authored-by: Ember Stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Henry Barrow * Back merge public to pick up Compass tile (#342) Co-authored-by: Isabelle Miller Co-authored-by: Arnold Trakhtenberg Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich Co-authored-by: Rich Manalang Co-authored-by: Wei We Lu Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Blake Wilson Co-authored-by: Dan O'Brien Co-authored-by: Kevin Brackbill Co-authored-by: Ben Woskow Co-authored-by: Clifford Tawiah Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Co-authored-by: carmenquan Co-authored-by: Dan O'Brien Co-authored-by: Jaz White Co-authored-by: Fabian Co-authored-by: Christie Williams Co-authored-by: Mahek Chheda Co-authored-by: Mahek Chheda <86633378+mchheda-ld@users.noreply.github.com> Co-authored-by: Christie Williams Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Fabian * Releasing changes publicly * Releasing changes publicly * Releasing changes publicly (#18) * Releasing changes publicly (#19) * Bump minimatch from 3.0.4 to 3.1.2 (#20) Bumps [minimatch](https://github.com/isaacs/minimatch) from 3.0.4 to 3.1.2. - [Release notes](https://github.com/isaacs/minimatch/releases) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump decode-uri-component from 0.2.0 to 0.2.2 (#21) Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump json5 from 2.1.3 to 2.2.3 (#22) Bumps [json5](https://github.com/json5/json5) from 2.1.3 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.1.3...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: Add CloudQuery integration (#23) * feat: Add CloudQuery integration * Remove 'data' as per CR * Update integrations/cloudquery/manifest.json Co-authored-by: Dan O'Brien --------- Co-authored-by: Kemal Hadimli Co-authored-by: Dan O'Brien * Update CODEOWNERS with new PD org changes (#25) * Dob/roost (#26) * Releasing Roost.ai LaunchDarkly Integration * Changing support mail * Changing the square image * Preetier changes * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update manifest.json * Roost Commit * Deleting roost config files * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Update integrations/roost.ai/manifest.json Co-authored-by: Dan O'Brien * Added otherCapabilities in roost.ai manifest * lint fixes * lint fixes * lint fixes * lint fixes --------- Co-authored-by: Divyeshzb <60085094+Divyeshzb@users.noreply.github.com> Co-authored-by: roost-io * Releasing changes publicly (#27) * add census integration (#28) * add census integration * add capabilities field * add link to docs Co-authored-by: Dan O'Brien --------- Co-authored-by: Dan O'Brien * add ngrok integration (#29) * Adding Liquibase integration (#30) * Adding Liquibase integration * Adding Liquibase integration * Making requested changes * Dob/release fixes (#31) * lint fixes editorial feedback add editorconfig file * build fixes * manifest for okteto integration (#33) * manifest for okteto integration * Apply suggestions from code review Co-authored-by: Dan O'Brien * Add link to launchdarklyDocs --------- Co-authored-by: Dan O'Brien * sprig integration page (#34) * sprig integration page * new line * fix lint build * fix integration test * update privacy policy * Resmo LaunchDarkly Integration (#35) * implements Resmo's LaunchDarkly integration docs * refactorings * adds other capabilities as external * adds horizontal logo * changes overview text * Update integrations/resmo/manifest.json Co-authored-by: Dan O'Brien --------- Co-authored-by: Dan O'Brien * adding ctrlstack integration manifest (#36) * adding ctrlstack integration manifest * update ctrlstack manifest details and categories * Add Snowplow LaunchDarkly integration (#37) * Add Snowplow LaunchDarkly integration * Address review comments * Releasing changes publicly (#39) * Releasing changes publicly (#41) * add Tealium inbound events integration card (#46) * add Tealium inbound events integration card * prettier fix * Added manifest for Osano (#45) * adding FullStory integration card (#48) * adding FullStory integration card * shorten description * remove evaluation revert description * Releasing changes publicly (#49) * Releasing changes publicly * Rebuild schema * Fix prettier * Run pre-commit * feat: add RudderStack LaunchDarkly Integration (#50) * feat: add RudderStack LaunchDarkly Integration * chore: used prettier * chore: update description Co-authored-by: Henry Barrow --------- Co-authored-by: Henry Barrow * feat: update RudderStack horizontal svg (#51) * Releasing changes publicly (#53) * Sureshot Heap integration (#54) * Sureshot Heap integration * Address PR feedback * Add Hightouch integration: synced segments (#52) * Add Hightouch integration: manifest and logos * Add contextKindPath * Update integrations/hightouch/manifest.json Co-authored-by: Dan O'Brien --------- Co-authored-by: Dan O'Brien * Census Synced Segments Integration (#55) * Census manifest.json to use synchedSegment capability * Overview should NOT be longer than 100 characters * Address prettier warnings * Split up census and census-synced-segments * manifest name: Census -> Census Segments * update landing page urls for synced segment partners (#57) * Fulcrum Integration : synced-segments (#56) * Fulcrum Integration : synced-segments * add newline * trim whitespace * add member * add id * update horizontal * Update integrations/fulcrum/manifest.json Fitting to under 100 characters --------- Co-authored-by: Dan O'Brien * update Fulcrum link for LD Docs (#59) * add cortex docs (#60) * add cortex docs * prettier * move images + fix support email * readd other capabilities * move images into folder * cut length of overview * remove internal-developer-portal from categories * add another category * remove unnecessary files * remove .idea files * revert package.json changes * Apply suggestions from code review Co-authored-by: Dan O'Brien --------- Co-authored-by: Dan O'Brien * /api/v2/segment-target -> /api/v2/segment-targets to match prod environment (#58) * add chronosphere partner integration (#61) * add chronosphere partner integration * update actions to only allow the ones we are interested in * Adds Bitrise integration manifest (#63) * Adds Bitrise integration manifest * Update manifest.json remove oauth * Update manifest.json Shortening overview to match required length. Integration card will automatically add learn more. * Update horizontal.svg * Update square.svg * Update manifest.json --------- Co-authored-by: Dan O'Brien Co-authored-by: Dan O'Brien * sumatra-synced-segments integration (#64) * initial sumatra synced segments integration * ran npm run prettier:write * Ditto integration (#65) * add manifest.json for Ditto integration * add assets and README * small copy tweaks * missing newline * prettier formatting * Update manifest.json Remove some tags and add LaunchDarkly docs property. --------- Co-authored-by: Dan O'Brien * add flag link capability for github (#66) * Add Zeotap Sync Segment Integration (#68) * updateFallThrough should be updateFallthrough (#67) * Adding Tealium Synced Segment (#69) * prettier fixes * minor rewording * add period for overview * Add Port integration (#70) * Add integration manifest for Port LD integration * Fix typo * Apply suggestions from code review Co-authored-by: Dan O'Brien --------- Co-authored-by: Dan O'Brien * Last9 Launchdarkly Integration (#71) * last9-launchdarkly-integration: last9 manifest for launch darkly * last9-launchdarkly-integration: add square svg logo * last9-launchdarkly-integration: make paylaod structure intutive * Update README.md * last9-launchdarkly-integration: make help text more clear and add horizontal image * last9-launchdarkly-integration: improve Readme --------- Co-authored-by: Preeti Dewani * last9-integration: correct the header key (#72) Co-authored-by: Preeti Dewani * Releasing changes publicly (#75) * Fix typo in CODEOWNERS (#76) * LaunchDarkly - Kosli integration (#73) * Create kosli manifest.json * Update Kosli manifest with more details * Update overview and description * Update actions of defaultPolicy * Update overview to end with a period * Add Convex integration manifest (#77) * Add Convex integration manifest * add api token to headers * Apply suggestions from code review Co-authored-by: Henry Barrow * fix --------- Co-authored-by: Henry Barrow * convex: update docs (#80) * convex: replace auth header with hmac signature * remove payload prefix * fix lint * Remove hmac signature * Update placeholder to not possibly be a real deployment URL * Update hmacSignature header (#79) * Add Netlify (#81) * Bump send and express (#84) Bumps [send](https://github.com/pillarjs/send) to 0.19.0 and updates ancestor dependency [express](https://github.com/expressjs/express). These dependencies need to be updated together. Updates `send` from 0.18.0 to 0.19.0 - [Release notes](https://github.com/pillarjs/send/releases) - [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md) - [Commits](https://github.com/pillarjs/send/compare/0.18.0...0.19.0) Updates `express` from 4.18.2 to 4.21.0 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.21.0) --- updated-dependencies: - dependency-name: send dependency-type: indirect - dependency-name: express dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix URL template string for Netlify (#88) * Add Roadie/Backstage docs (#89) * Add Roadie/Backstage docs * Update integrations/roadie/manifest.json Co-authored-by: Dan O'Brien * Update horizontal.svg Fix for end of line test failure * Update horizontal.svg Fix to incorrect svg --------- Co-authored-by: Dan O'Brien * Releasing changes publicly (#90) * Bump path-to-regexp from 0.1.7 to 0.1.10 (#92) Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) from 0.1.7 to 0.1.10. - [Release notes](https://github.com/pillarjs/path-to-regexp/releases) - [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md) - [Commits](https://github.com/pillarjs/path-to-regexp/compare/v0.1.7...v0.1.10) --- updated-dependencies: - dependency-name: path-to-regexp dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump braces from 3.0.2 to 3.0.3 (#93) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump cookie and express (#91) Bumps [cookie](https://github.com/jshttp/cookie) to 0.7.1 and updates ancestor dependency [express](https://github.com/expressjs/express). These dependencies need to be updated together. Updates `cookie` from 0.5.0 to 0.7.1 - [Release notes](https://github.com/jshttp/cookie/releases) - [Commits](https://github.com/jshttp/cookie/compare/v0.5.0...v0.7.1) Updates `express` from 4.21.0 to 4.21.1 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/4.21.1/History.md) - [Commits](https://github.com/expressjs/express/compare/4.21.0...4.21.1) --- updated-dependencies: - dependency-name: cookie dependency-type: indirect - dependency-name: express dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update convex docs link (#94) * Releasing changes publicly (#97) * Bump path-to-regexp and express (#98) Bumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) to 0.1.12 and updates ancestor dependency [express](https://github.com/expressjs/express). These dependencies need to be updated together. Updates `path-to-regexp` from 0.1.10 to 0.1.12 - [Release notes](https://github.com/pillarjs/path-to-regexp/releases) - [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md) - [Commits](https://github.com/pillarjs/path-to-regexp/compare/v0.1.10...v0.1.12) Updates `express` from 4.21.1 to 4.21.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/4.21.2/History.md) - [Commits](https://github.com/expressjs/express/compare/4.21.1...4.21.2) --- updated-dependencies: - dependency-name: path-to-regexp dependency-type: indirect - dependency-name: express dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Releasing changes publicly (#100) * Releasing changes publicly * Remove unwanted integrations * Update CODEOWNERS * Use HMAC signature header in Chronosphere integration (#99) use HMAC token Co-authored-by: Henry Barrow * Update GitHub Action SHA to latest version (#107) * Update logos for Kosli integration (#110) * Remove custom template for Chronosphere integration (#111) Remove custom template * Remove jira linker (#113) * remove the gha that sets shortcut links on PRs * uncaught merge conflict in readme? * remove templates for chronosphere --------- Signed-off-by: dependabot[bot] Co-authored-by: Ben Woskow Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Henry Barrow Co-authored-by: parrishioner Co-authored-by: Matt Dellandrea <9593724+mdellandrea@users.noreply.github.com> Co-authored-by: Arnold Trakhtenberg Co-authored-by: Ben Woskow <48036130+bwoskow-ld@users.noreply.github.com> Co-authored-by: Jared Jones <62678288+almostjones@users.noreply.github.com> Co-authored-by: Sunny Guduru Co-authored-by: Sarah Day Co-authored-by: Aaron Aldrich Co-authored-by: Rich Manalang Co-authored-by: Wei We Lu Co-authored-by: Blake Wilson Co-authored-by: Dan O'Brien Co-authored-by: Kevin Brackbill Co-authored-by: Clifford Tawiah Co-authored-by: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Co-authored-by: carmenquan Co-authored-by: Dan O'Brien Co-authored-by: Jaz White Co-authored-by: Fabian Co-authored-by: Christie Williams Co-authored-by: Mahek Chheda Co-authored-by: Mahek Chheda <86633378+mchheda-ld@users.noreply.github.com> Co-authored-by: Christie Williams Co-authored-by: Molly Co-authored-by: ember-stevens <79482775+ember-stevens@users.noreply.github.com> Co-authored-by: Fabian Co-authored-by: Kemal <223029+disq@users.noreply.github.com> Co-authored-by: Kemal Hadimli Co-authored-by: Alex Smolen Co-authored-by: Divyeshzb <60085094+Divyeshzb@users.noreply.github.com> Co-authored-by: roost-io Co-authored-by: Nick Carchedi Co-authored-by: Niji Co-authored-by: Robert Reeves Co-authored-by: Ramiro Berrelleza Co-authored-by: Cindy Nguyen Co-authored-by: Korhan Keser <48186697+shuetisha@users.noreply.github.com> Co-authored-by: jj-ctrlstack <128837927+jj-ctrlstack@users.noreply.github.com> Co-authored-by: adatzer Co-authored-by: Clayton Surfus Co-authored-by: Gauravudia <60897972+Gauravudia@users.noreply.github.com> Co-authored-by: Igor Vyatkin Co-authored-by: masonawong <98341094+masonawong@users.noreply.github.com> Co-authored-by: oneearedrabbit Co-authored-by: sharad-fulcrum <138425433+sharad-fulcrum@users.noreply.github.com> Co-authored-by: Cristina Buenahora Co-authored-by: Sophia Hanley Co-authored-by: miklosboros <77286422+miklosboros@users.noreply.github.com> Co-authored-by: Greg Kuhlmann Co-authored-by: Reed Barnes Co-authored-by: sanjaykukreti11 <122770597+sanjaykukreti11@users.noreply.github.com> Co-authored-by: Mor Paz <1912.mor@gmail.com> Co-authored-by: Preeti-Dewani Co-authored-by: Preeti Dewani Co-authored-by: SimonC Co-authored-by: Ari Co-authored-by: Ramon Snir Co-authored-by: Ramon Snir Co-authored-by: Sam Nixon Co-authored-by: Ari Co-authored-by: Laura Watiker Co-authored-by: SimonC Co-authored-by: Behn <7383025+BehnH@users.noreply.github.com> --- .github/workflows/pull_request.yml | 15 ----- integrations/chronosphere/README.md | 1 - integrations/chronosphere/manifest.json | 5 +- .../chronosphere/templates/default.json.hbs | 2 - .../kosli/assets/images/horizontal.svg | 67 ++++++++----------- integrations/kosli/assets/images/square.svg | 28 ++++++-- 6 files changed, 52 insertions(+), 66 deletions(-) delete mode 100644 .github/workflows/pull_request.yml delete mode 100644 integrations/chronosphere/templates/default.json.hbs diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml deleted file mode 100644 index 8c1c59a8..00000000 --- a/.github/workflows/pull_request.yml +++ /dev/null @@ -1,15 +0,0 @@ -on: pull_request -name: Pull request -jobs: - setShortcutLinkInPR: - if: github.repository == 'launchdarkly/integration-framework-private' - name: Set Shortcut Link in PR - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set Shortcut Link in PR - uses: launchdarkly-labs/ld-gh-actions-shortcut/set-link@main - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - AUTOLINK_PREFIX: 'SC-' - CREATE_STORY_URL: https://app.shortcut.com/launchdarkly/stories/new?template_id=5f3fbdce-dfa0-446b-91c5-0cf6e01f5045 diff --git a/integrations/chronosphere/README.md b/integrations/chronosphere/README.md index f9378613..a014e6f7 100644 --- a/integrations/chronosphere/README.md +++ b/integrations/chronosphere/README.md @@ -1,5 +1,4 @@ # Chronosphere [User documentation](https://launchdarkly.com/docs/integrations/chronosphere) - [API documentation](https://docs.chronosphere.io/documentation/explore/change-events/third-party#launchdarkly) diff --git a/integrations/chronosphere/manifest.json b/integrations/chronosphere/manifest.json index 82088ecd..3af64d67 100644 --- a/integrations/chronosphere/manifest.json +++ b/integrations/chronosphere/manifest.json @@ -46,9 +46,8 @@ "hmacSecretFormVariableKey": "secretToken" } }, - "templates": { - "default": "templates/default.json.hbs" - }, + "templates": {}, + "useStandardWebhookPayload": true, "defaultPolicy": [ { "effect": "allow", diff --git a/integrations/chronosphere/templates/default.json.hbs b/integrations/chronosphere/templates/default.json.hbs deleted file mode 100644 index 2c63c085..00000000 --- a/integrations/chronosphere/templates/default.json.hbs +++ /dev/null @@ -1,2 +0,0 @@ -{ -} diff --git a/integrations/kosli/assets/images/horizontal.svg b/integrations/kosli/assets/images/horizontal.svg index 3d92dd39..b7ca48a8 100644 --- a/integrations/kosli/assets/images/horizontal.svg +++ b/integrations/kosli/assets/images/horizontal.svg @@ -1,39 +1,28 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/integrations/kosli/assets/images/square.svg b/integrations/kosli/assets/images/square.svg index 6c79c795..acdfe6bc 100644 --- a/integrations/kosli/assets/images/square.svg +++ b/integrations/kosli/assets/images/square.svg @@ -1,6 +1,22 @@ - - - - - - + + + + + + + + + + \ No newline at end of file From 3b8c7e6c9c32e409c9f335f12a085ab82987a92e Mon Sep 17 00:00:00 2001 From: Abiola Ayodele Date: Thu, 1 May 2025 09:58:05 +0100 Subject: [PATCH 914/936] Remove Snowflake Product Analytics integration v1 files including manifest and associated assets (SVG images). (#662) --- .../assets/images/horizontal.svg | 27 ------------------- .../assets/images/square.svg | 1 - .../snowflake-product-analytics/manifest.json | 22 --------------- 3 files changed, 50 deletions(-) delete mode 100644 integrations/snowflake-product-analytics/assets/images/horizontal.svg delete mode 100644 integrations/snowflake-product-analytics/assets/images/square.svg delete mode 100644 integrations/snowflake-product-analytics/manifest.json diff --git a/integrations/snowflake-product-analytics/assets/images/horizontal.svg b/integrations/snowflake-product-analytics/assets/images/horizontal.svg deleted file mode 100644 index 5b792631..00000000 --- a/integrations/snowflake-product-analytics/assets/images/horizontal.svg +++ /dev/null @@ -1,27 +0,0 @@ - - logo-blue-svg - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/snowflake-product-analytics/assets/images/square.svg b/integrations/snowflake-product-analytics/assets/images/square.svg deleted file mode 100644 index 70bb8a73..00000000 --- a/integrations/snowflake-product-analytics/assets/images/square.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/integrations/snowflake-product-analytics/manifest.json b/integrations/snowflake-product-analytics/manifest.json deleted file mode 100644 index 342fbfd9..00000000 --- a/integrations/snowflake-product-analytics/manifest.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "Snowflake Native Product Analytics", - "version": "1.0.0", - "overview": "Run product analytics in LaunchDarkly using Snowflake warehouse data to power your insights.", - "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features, enabling data-driven decisions to improve adoption and engagement. With LaunchDarkly PA, you can leverage warehouse-native product analytics by connecting your Snowflake data and gain insights without moving the data. ", - "author": "Snowflake", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://www.snowflake.com", - "launchdarklyDocs": "https://launchdarkly.com/docs/home/product-analytics", - "privacyPolicy": "https://launchdarkly.com/policies/privacy" - }, - "categories": ["data"], - "icons": { - "square": "assets/images/square.svg", - "horizontal": "assets/images/horizontal.svg" - }, - "capabilities": { - "externalConfigurationURL": "https://launchdarkly.com/docs/home/product-analytics" - }, - "requiresOAuth": false -} From f5da73300052e6803e7781d7e3889a335e872a89 Mon Sep 17 00:00:00 2001 From: Abiola Ayodele Date: Tue, 6 May 2025 18:59:12 +0100 Subject: [PATCH 915/936] Refactor: Update manifest files for BigQuery, Databricks, and Snowflake Native Product Analytics with improved descriptions and capitalization. Enhance clarity in overviews and descriptions to better convey integration capabilities. (#663) --- integrations/bigquery-native-product-analytics/manifest.json | 4 ++-- .../databricks-native-product-analytics/manifest.json | 4 ++-- integrations/snowflake-native-product-analytics/manifest.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/bigquery-native-product-analytics/manifest.json b/integrations/bigquery-native-product-analytics/manifest.json index f22b571d..7199e5af 100644 --- a/integrations/bigquery-native-product-analytics/manifest.json +++ b/integrations/bigquery-native-product-analytics/manifest.json @@ -1,8 +1,8 @@ { "name": "BigQuery Native Product Analytics", "version": "1.0.0", - "overview": "Run product analytics in LaunchDarkly using bigQuery warehouse data to power your insights.", - "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features, enabling data-driven decisions to improve adoption and engagement. With LaunchDarkly PA, you can leverage warehouse-native product analytics by connecting your bigQuery data and gain insights without moving the data. ", + "overview": "Run product analytics in LaunchDarkly using BigQuery warehouse data to power your insights.", + "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features—so you can make data-driven decisions that boost adoption and engagement. By connecting your BigQuery data, you get powerful, warehouse-native analytics without moving data out of your stack.", "author": "Google BigQuery", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/databricks-native-product-analytics/manifest.json b/integrations/databricks-native-product-analytics/manifest.json index 9d013e5b..4943f077 100644 --- a/integrations/databricks-native-product-analytics/manifest.json +++ b/integrations/databricks-native-product-analytics/manifest.json @@ -1,8 +1,8 @@ { "name": "Databricks Native Product Analytics", "version": "1.0.0", - "overview": "Run product analytics in LaunchDarkly using databricks warehouse data to power your insights.", - "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features, enabling data-driven decisions to improve adoption and engagement. With LaunchDarkly PA, you can leverage warehouse-native product analytics by connecting your databricks data and gain insights without moving the data. ", + "overview": "Run product analytics in LaunchDarkly using Databricks warehouse data to power your insights.", + "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features—so you can make data-driven decisions that boost adoption and engagement. By connecting your Databricks data, you get powerful, warehouse-native analytics without moving data out of your stack. ", "author": "Databricks", "supportEmail": "support@launchdarkly.com", "links": { diff --git a/integrations/snowflake-native-product-analytics/manifest.json b/integrations/snowflake-native-product-analytics/manifest.json index 28c5f3d2..332f5b0d 100644 --- a/integrations/snowflake-native-product-analytics/manifest.json +++ b/integrations/snowflake-native-product-analytics/manifest.json @@ -2,7 +2,7 @@ "name": "Snowflake Native Product Analytics", "version": "1.0.0", "overview": "Run product analytics in LaunchDarkly using Snowflake warehouse data to power your insights.", - "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features, enabling data-driven decisions to improve adoption and engagement. With LaunchDarkly PA, you can leverage warehouse-native product analytics by connecting your Snowflake data and gain insights without moving the data. ", + "description": "LaunchDarkly Product Analytics helps you understand how users interact with your features—so you can make data-driven decisions that boost adoption and engagement. By connecting your Snowflake data, you get powerful, warehouse-native analytics without moving data out of your stack.", "author": "Snowflake", "supportEmail": "support@launchdarkly.com", "links": { From c799d70e0dbe1a6749d5a5885207f2c7f37ad0ec Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Fri, 20 Jun 2025 18:31:42 +0200 Subject: [PATCH 916/936] add new oauth manifest (#664) --- __tests__/validateIntegrationManifests.js | 1 + .../assets/images/horizontal.svg | 3 + .../assets/images/square.svg | 3 + .../custom-approvals-oauth/manifest.json | 137 ++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 integrations/custom-approvals-oauth/assets/images/horizontal.svg create mode 100644 integrations/custom-approvals-oauth/assets/images/square.svg create mode 100644 integrations/custom-approvals-oauth/manifest.json diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 3b264c5e..313db567 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -17,6 +17,7 @@ const OAUTH_INTEGRATIONS = [ 'servicenow', 'servicenow-normal', 'servicenow-app', + 'custom-approvals-oauth', ]; // add oauth integrations here const INTEGRATIONS_WITH_DUP_OAUTH_KEYS = [ 'servicenow', diff --git a/integrations/custom-approvals-oauth/assets/images/horizontal.svg b/integrations/custom-approvals-oauth/assets/images/horizontal.svg new file mode 100644 index 00000000..2c338d9f --- /dev/null +++ b/integrations/custom-approvals-oauth/assets/images/horizontal.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/custom-approvals-oauth/assets/images/square.svg b/integrations/custom-approvals-oauth/assets/images/square.svg new file mode 100644 index 00000000..2c338d9f --- /dev/null +++ b/integrations/custom-approvals-oauth/assets/images/square.svg @@ -0,0 +1,3 @@ + + + diff --git a/integrations/custom-approvals-oauth/manifest.json b/integrations/custom-approvals-oauth/manifest.json new file mode 100644 index 00000000..d17966a0 --- /dev/null +++ b/integrations/custom-approvals-oauth/manifest.json @@ -0,0 +1,137 @@ +{ + "name": "Custom Approvals with OAuth", + "version": "1.0.0", + "overview": "Integrate LaunchDarkly approvals with an application of your own design.", + "description": "Integrate LaunchDarkly approvals with an application of your own design.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://launchdarkly.com/", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/custom-approvals-oauth", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "categories": ["approval"], + "requiresOAuth": true, + "oauthIntegrationKey": "custom-approvals-oauth", + "formVariables": [], + "allowIntegrationConfigurations": true, + "capabilities": { + "approval": { + "name": "Custom Approvals with OAuth", + "approvalFormVariables": [], + "allowApprovalIntegrationConfigurations": true, + "allowAdditionalApprovalFormVariables": true, + "environmentFormVariables": [], + "creationRequest": { + "endpoint": { + "url": "{{ oauth.baseURI }}/api/approvals", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{ oauth.accessToken }}" + } + ] + }, + "jsonBody": "{\"_site\": {\"href\": \"{{_links.approval.href}}\"}, \"_id\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.milliseconds}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{approvalDescription}}\" }", + "parser": { + "approvalId": "/_id", + "statusValue": "/status/value", + "statusDisplay": "/status/display", + "approvalMatcher": "approved", + "rejectionMatcher": "declined", + "urlTemplate": "{{ oauth.baseURI }}/approvals?approvalID={{ context.approvalId }}" + } + }, + "statusRequest": { + "endpoint": { + "url": "{{ oauth.baseURI }}/api/approvals/{{ context.approvalId }}/status", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{ oauth.accessToken }}" + } + ] + }, + "parser": { + "statusValue": "/status/value", + "statusDisplay": "/status/display", + "approvalMatcher": "approved", + "rejectionMatcher": "declined" + } + }, + "postApplyRequest": { + "endpoint": { + "url": "{{ oauth.baseURI }}/api/approvals/{{ context.approvalId }}/apply", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{ oauth.accessToken }}" + } + ] + }, + "parser": { + "statusValue": "/status/value", + "statusDisplay": "/status/display", + "approvalMatcher": "approved", + "rejectionMatcher": "declined" + } + }, + "deletionRequest": { + "endpoint": { + "url": "{{ oauth.baseURI }}/api/approvals/{{ context.approvalId }}/cancel", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{ oauth.accessToken }}" + } + ] + }, + "parser": { + "statusValue": "/status/value", + "statusDisplay": "/status/display", + "approvalMatcher": "approved", + "rejectionMatcher": "declined" + } + }, + "memberListRequest": { + "endpoint": { + "url": "{{ oauth.baseURI }}/api/members", + "method": "GET", + "headers": [ + { + "name": "Authorization", + "value": "Bearer {{oauth.accessToken}}" + } + ] + }, + "parser": { + "memberArrayPath": "/members", + "memberItems": { + "memberId": "/name", + "email": "/email" + } + } + } + } + } +} From 42a4adaec1ca3011c956f8c7b270db8cc656b71b Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Thu, 26 Jun 2025 15:57:24 +0100 Subject: [PATCH 917/936] triple-escape approval and comment fields to avoid escaping breaking hte json parsing & fix memberListRequest (#665) --- integrations/custom-approvals/manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index f593e7c6..f03cccfb 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -55,7 +55,7 @@ } ] }, - "jsonBody": "{\"_site\": {\"href\": \"{{_links.approval.href}}\"}, \"_id\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{details.plainText}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.milliseconds}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{approvalDescription}}\" }", + "jsonBody": "{\"_site\": {\"href\": \"{{_links.approval.href}}\"}, \"_id\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{{details.plainText}}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{{this}}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{{this}}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{{this}}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.milliseconds}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{{this}}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{{approvalDescription}}}\" }", "parser": { "approvalId": "/_id", "statusValue": "/status/value", @@ -129,12 +129,12 @@ }, "memberListRequest": { "endpoint": { - "url": "{{baseURI}}/api/members", + "url": "{{baseURL}}/api/members", "method": "GET", "headers": [ { "name": "Authorization", - "value": "Bearer {{apiToken}}" + "value": "Bearer {{apiKey}}" } ] }, From 8886d1ab5c1aa963bc2bd736cebfd46f483cd679 Mon Sep 17 00:00:00 2001 From: Christie Williams Date: Fri, 27 Jun 2025 14:07:32 -0400 Subject: [PATCH 918/936] Add manifests for BigQuery and Databricks (#666) --- .../assets/images/horizontal.svg | 213 ++++++++++++++++++ .../assets/images/square.svg | 12 + .../bigquery-data-export/manifest.json | 22 ++ .../assets/images/horizontal.svg | 62 +++++ .../assets/images/square.svg | 10 + .../databricks-data-export/manifest.json | 22 ++ 6 files changed, 341 insertions(+) create mode 100644 integrations/bigquery-data-export/assets/images/horizontal.svg create mode 100644 integrations/bigquery-data-export/assets/images/square.svg create mode 100644 integrations/bigquery-data-export/manifest.json create mode 100644 integrations/databricks-data-export/assets/images/horizontal.svg create mode 100644 integrations/databricks-data-export/assets/images/square.svg create mode 100644 integrations/databricks-data-export/manifest.json diff --git a/integrations/bigquery-data-export/assets/images/horizontal.svg b/integrations/bigquery-data-export/assets/images/horizontal.svg new file mode 100644 index 00000000..03622f8b --- /dev/null +++ b/integrations/bigquery-data-export/assets/images/horizontal.svg @@ -0,0 +1,213 @@ + + + + + + image/svg+xml + + integration-tile + + + + + + + + integration-tile + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/bigquery-data-export/assets/images/square.svg b/integrations/bigquery-data-export/assets/images/square.svg new file mode 100644 index 00000000..76e46050 --- /dev/null +++ b/integrations/bigquery-data-export/assets/images/square.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/integrations/bigquery-data-export/manifest.json b/integrations/bigquery-data-export/manifest.json new file mode 100644 index 00000000..88354caa --- /dev/null +++ b/integrations/bigquery-data-export/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "BigQuery Data Export", + "version": "1.0.0", + "overview": "Run analysis in your warehouse enriched by experiment traffic data or detailed flag eval events.", + "description": "Export Launchdarkly data to your BigQuery warehouse.", + "author": "Google BigQuery", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://cloud.google.com/bigquery", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/data-export", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "dataExport" + }, + "otherCapabilities": ["dataExport", "warehouseExport"] +} diff --git a/integrations/databricks-data-export/assets/images/horizontal.svg b/integrations/databricks-data-export/assets/images/horizontal.svg new file mode 100644 index 00000000..b61e33b9 --- /dev/null +++ b/integrations/databricks-data-export/assets/images/horizontal.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/integrations/databricks-data-export/assets/images/square.svg b/integrations/databricks-data-export/assets/images/square.svg new file mode 100644 index 00000000..b1e921fc --- /dev/null +++ b/integrations/databricks-data-export/assets/images/square.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/integrations/databricks-data-export/manifest.json b/integrations/databricks-data-export/manifest.json new file mode 100644 index 00000000..9a1114c3 --- /dev/null +++ b/integrations/databricks-data-export/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Databricks Data Export", + "version": "1.0.0", + "overview": "Run analysis in your warehouse enriched by experiment traffic data or detailed flag eval events.", + "description": "Export Launchdarkly data to your Databricks warehouse.", + "author": "Databricks", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.databricks.com", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/data-export", + "privacyPolicy": "https://launchdarkly.com/policies/privacy" + }, + "categories": ["data"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "legacy": { + "kind": "dataExport" + }, + "otherCapabilities": ["dataExport", "warehouseExport"] +} From a521b4851c2c511ec23adb42526b585e445030fb Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 22 Jul 2025 18:34:23 +0200 Subject: [PATCH 919/936] fix typo (#667) --- integrations/pagerduty/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/pagerduty/manifest.json b/integrations/pagerduty/manifest.json index ebbea2d3..34bcefc7 100644 --- a/integrations/pagerduty/manifest.json +++ b/integrations/pagerduty/manifest.json @@ -27,7 +27,7 @@ "capabilities": { "reservedCustomProperties": [ { - "name": "PagerDuy integration key override", + "name": "PagerDuty integration key override", "description": "The PagerDuty integration key to use for all changes associated with this flag. Only the first key will be used.", "key": "pagerDutyIntegrationKey" } From 0798726bda385a1efcb4b0ae2c73f4c844a45bd9 Mon Sep 17 00:00:00 2001 From: Christie Williams Date: Thu, 24 Jul 2025 14:47:37 -0400 Subject: [PATCH 920/936] Rename databricks and bigquery manifest kinds (#668) --- .../assets/images/horizontal.svg | 0 .../{bigquery-data-export => bigquery}/assets/images/square.svg | 0 integrations/{bigquery-data-export => bigquery}/manifest.json | 0 .../assets/images/horizontal.svg | 0 .../assets/images/square.svg | 0 integrations/{databricks-data-export => databricks}/manifest.json | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename integrations/{bigquery-data-export => bigquery}/assets/images/horizontal.svg (100%) rename integrations/{bigquery-data-export => bigquery}/assets/images/square.svg (100%) rename integrations/{bigquery-data-export => bigquery}/manifest.json (100%) rename integrations/{databricks-data-export => databricks}/assets/images/horizontal.svg (100%) rename integrations/{databricks-data-export => databricks}/assets/images/square.svg (100%) rename integrations/{databricks-data-export => databricks}/manifest.json (100%) diff --git a/integrations/bigquery-data-export/assets/images/horizontal.svg b/integrations/bigquery/assets/images/horizontal.svg similarity index 100% rename from integrations/bigquery-data-export/assets/images/horizontal.svg rename to integrations/bigquery/assets/images/horizontal.svg diff --git a/integrations/bigquery-data-export/assets/images/square.svg b/integrations/bigquery/assets/images/square.svg similarity index 100% rename from integrations/bigquery-data-export/assets/images/square.svg rename to integrations/bigquery/assets/images/square.svg diff --git a/integrations/bigquery-data-export/manifest.json b/integrations/bigquery/manifest.json similarity index 100% rename from integrations/bigquery-data-export/manifest.json rename to integrations/bigquery/manifest.json diff --git a/integrations/databricks-data-export/assets/images/horizontal.svg b/integrations/databricks/assets/images/horizontal.svg similarity index 100% rename from integrations/databricks-data-export/assets/images/horizontal.svg rename to integrations/databricks/assets/images/horizontal.svg diff --git a/integrations/databricks-data-export/assets/images/square.svg b/integrations/databricks/assets/images/square.svg similarity index 100% rename from integrations/databricks-data-export/assets/images/square.svg rename to integrations/databricks/assets/images/square.svg diff --git a/integrations/databricks-data-export/manifest.json b/integrations/databricks/manifest.json similarity index 100% rename from integrations/databricks-data-export/manifest.json rename to integrations/databricks/manifest.json From 4ea4d58b018208a91d3c25c621a7dd898a7035d6 Mon Sep 17 00:00:00 2001 From: Chris Blackburn Date: Wed, 30 Jul 2025 06:43:14 -0400 Subject: [PATCH 921/936] [REL-7176] add integration for dynatrace api v2 (#669) * add integration for dynatrace api v2 * update README to point to Dynatrace events api v2 * minor cleanup * accommodate the case where the tag was not provided * tweaks --------- Co-authored-by: Isabelle Miller --- integrations/dynatrace-v2/LICENSE.md | 13 ++ integrations/dynatrace-v2/README.md | 9 + .../dynatrace-v2/assets/horizontal.svg | 17 ++ integrations/dynatrace-v2/assets/square.svg | 8 + integrations/dynatrace-v2/manifest.json | 175 ++++++++++++++++++ .../dynatrace-v2/templates/flag.json.hbs | 28 +++ 6 files changed, 250 insertions(+) create mode 100644 integrations/dynatrace-v2/LICENSE.md create mode 100644 integrations/dynatrace-v2/README.md create mode 100644 integrations/dynatrace-v2/assets/horizontal.svg create mode 100644 integrations/dynatrace-v2/assets/square.svg create mode 100644 integrations/dynatrace-v2/manifest.json create mode 100644 integrations/dynatrace-v2/templates/flag.json.hbs diff --git a/integrations/dynatrace-v2/LICENSE.md b/integrations/dynatrace-v2/LICENSE.md new file mode 100644 index 00000000..9dcbe896 --- /dev/null +++ b/integrations/dynatrace-v2/LICENSE.md @@ -0,0 +1,13 @@ +Copyright 2020 Catamorphic Co. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/integrations/dynatrace-v2/README.md b/integrations/dynatrace-v2/README.md new file mode 100644 index 00000000..eb498d15 --- /dev/null +++ b/integrations/dynatrace-v2/README.md @@ -0,0 +1,9 @@ +# Dynatrace + +[User documentation](https://launchdarkly.com/docs/integrations/dynatrace) + +[API documentation](https://docs.dynatrace.com/docs/discover-dynatrace/references/dynatrace-api/environment-api/events-v2/post-event/) + +To set up a trigger, follow the instructions for a [Dynatrace webhook integration](https://www.dynatrace.com/support/help/setup-and-configuration/integrations/third-party-integrations/problem-notification-systems/webhook-integration/). + +Run `npm run curl dynatrace` in the root repository directory to generate a `curl` command to send data to Dynatrace. diff --git a/integrations/dynatrace-v2/assets/horizontal.svg b/integrations/dynatrace-v2/assets/horizontal.svg new file mode 100644 index 00000000..f36df202 --- /dev/null +++ b/integrations/dynatrace-v2/assets/horizontal.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/integrations/dynatrace-v2/assets/square.svg b/integrations/dynatrace-v2/assets/square.svg new file mode 100644 index 00000000..2bacc0b7 --- /dev/null +++ b/integrations/dynatrace-v2/assets/square.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/integrations/dynatrace-v2/manifest.json b/integrations/dynatrace-v2/manifest.json new file mode 100644 index 00000000..816703ac --- /dev/null +++ b/integrations/dynatrace-v2/manifest.json @@ -0,0 +1,175 @@ +{ + "name": "Dynatrace (V2 API)", + "version": "1.0.0", + "overview": "Monitor LaunchDarkly flag changes in Dynatrace.", + "description": "Monitor LaunchDarkly flag change events alongside your Dynatrace performance graphs. Correlate feature rollouts to changes in your system's operational health.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://www.dynatrace.com/", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations/dynatrace", + "privacyPolicy": "https://www.dynatrace.com/company/trust-center/privacy/" + }, + "categories": ["monitoring"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + { + "key": "apiToken", + "name": "Dynatrace Access token", + "type": "string", + "description": "Enter your Dynatrace Access token. [Learn more](https://www.dynatrace.com/support/help/shortlink/api-authentication#generate-a-token) about generating tokens. The 'Access problem and event feed, metrics, and topology' scope is required.", + "isSecret": true + }, + { + "key": "url", + "name": "Dynatrace URL", + "type": "uri", + "description": "Enter the URL used to access your Dynatrace (managed or hosted) service. Follow the pattern shown in the placeholder text.", + "placeholder": "https://{your-environment-id}.live.dynatrace.com", + "isSecret": false + }, + { + "key": "entity", + "name": "Dynatrace entity", + "type": "enum", + "description": "Select the Dynatrace entity `meType` to associate with all events.", + "defaultValue": "APPLICATION", + "isOptional": true, + "allowedValues": [ + "APPLICATION", + "APPLICATION_METHOD", + "APPLICATION_METHOD_GROUP", + "AUTO_SCALING_GROUP", + "AUXILIARY_SYNTHETIC_TEST", + "AWS_APPLICATION_LOAD_BALANCER", + "AWS_AVAILABILITY_ZONE", + "AWS_CREDENTIALS", + "AWS_LAMBDA_FUNCTION", + "AWS_NETWORK_LOAD_BALANCER", + "AZURE_API_MANAGEMENT_SERVICE", + "AZURE_APPLICATION_GATEWAY", + "AZURE_COSMOS_DB", + "AZURE_CREDENTIALS", + "AZURE_EVENT_HUB", + "AZURE_EVENT_HUB_NAMESPACE", + "AZURE_FUNCTION_APP", + "AZURE_IOT_HUB", + "AZURE_LOAD_BALANCER", + "AZURE_MGMT_GROUP", + "AZURE_REDIS_CACHE", + "AZURE_REGION", + "AZURE_SERVICE_BUS_NAMESPACE", + "AZURE_SERVICE_BUS_QUEUE", + "AZURE_SERVICE_BUS_TOPIC", + "AZURE_SQL_DATABASE", + "AZURE_SQL_ELASTIC_POOL", + "AZURE_SQL_SERVER", + "AZURE_STORAGE_ACCOUNT", + "AZURE_SUBSCRIPTION", + "AZURE_TENANT", + "AZURE_VM", + "AZURE_VM_SCALE_SET", + "AZURE_WEB_APP", + "CF_APPLICATION", + "CF_FOUNDATION", + "CINDER_VOLUME", + "CLOUD_APPLICATION", + "CLOUD_APPLICATION_INSTANCE", + "CLOUD_APPLICATION_NAMESPACE", + "CONTAINER_GROUP", + "CONTAINER_GROUP_INSTANCE", + "CUSTOM_APPLICATION", + "CUSTOM_DEVICE", + "CUSTOM_DEVICE_GROUP", + "DCRUM_APPLICATION", + "DCRUM_SERVICE", + "DCRUM_SERVICE_INSTANCE", + "DEVICE_APPLICATION_METHOD", + "DISK", + "DOCKER_CONTAINER_GROUP_INSTANCE", + "DYNAMO_DB_TABLE", + "EBS_VOLUME", + "EC2_INSTANCE", + "ELASTIC_LOAD_BALANCER", + "ENVIRONMENT", + "EXTERNAL_SYNTHETIC_TEST_STEP", + "GCP_ZONE", + "GEOLOCATION", + "GEOLOC_SITE", + "GOOGLE_COMPUTE_ENGINE", + "HOST", + "HOST_GROUP", + "HTTP_CHECK", + "HTTP_CHECK_STEP", + "HYPERVISOR", + "KUBERNETES_CLUSTER", + "KUBERNETES_NODE", + "MOBILE_APPLICATION", + "NETWORK_INTERFACE", + "NEUTRON_SUBNET", + "OPENSTACK_PROJECT", + "OPENSTACK_REGION", + "OPENSTACK_VM", + "OS", + "PROCESS_GROUP", + "PROCESS_GROUP_INSTANCE", + "RELATIONAL_DATABASE_SERVICE", + "SERVICE", + "SERVICE_INSTANCE", + "SERVICE_METHOD", + "SERVICE_METHOD_GROUP", + "SWIFT_CONTAINER", + "SYNTHETIC_LOCATION", + "SYNTHETIC_TEST", + "SYNTHETIC_TEST_STEP", + "VIRTUALMACHINE", + "VMWARE_DATACENTER" + ] + }, + { + "name": "Dynatrace tag", + "key": "tag", + "type": "string", + "isOptional": true, + "defaultValue": "", + "description": "If provided, all feature flag events matching the policy filter will be associated with Dynatrace entities with the same tag." + } + ], + "capabilities": { + "reservedCustomProperties": [ + { + "name": "Dynatrace tags (V2 API)", + "key": "dynatrace-v2" + } + ], + "auditLogEventsHook": { + "endpoint": { + "url": "{{url}}/api/v2/events/ingest", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Api-Token {{apiToken}}" + } + ] + }, + "templates": { + "flag": "templates/flag.json.hbs" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +} diff --git a/integrations/dynatrace-v2/templates/flag.json.hbs b/integrations/dynatrace-v2/templates/flag.json.hbs new file mode 100644 index 00000000..2d7e0396 --- /dev/null +++ b/integrations/dynatrace-v2/templates/flag.json.hbs @@ -0,0 +1,28 @@ +{ + "eventType": "CUSTOM_CONFIGURATION", + "entitySelector": "type({{#if formVariables.entity}}{{formVariables.entity}}{{else}}APPLICATION{{/if}}),tag( + {{~#if customProperties}}{{#if customProperties.dynatrace-v2}}{{#if customProperties.dynatrace-v2.values~}} + {{~#with customProperties~}} + {{~#each dynatrace-v2.values~}} + \"{{this}}\"{{~#if formVariables.tag}},{{else}}{{#unless @last}},{{/unless}}{{/if}} + {{~/each~}} + {{~/with~}} + {{~/if}}{{/if}}{{/if~}} + {{~#if formVariables.tag~}} + \"{{formVariables.tag}}\" + {{~/if~}})", + "properties": { + "Flag name": "{{name}}", + "Flag key": "{{key}}", + "Project name": "{{project.name}}", + "Project key": "{{project.key}}", + "Environment name": "{{project.environment.name}}", + "Environment key": "{{project.environment.key}}", + "Comment": "{{#if comment}}{{comment}}{{/if}}", + "User name": "{{member.displayName}}", + "User email": "{{ member.email }}", + "Action": "{{verbKind}}" + }, + "startTime": {{ timestamp.milliseconds }}, + "title": "{{{title.plainText}}}" +} From 38ae28600899e003bacf20e2326804e06a21d243 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Mon, 4 Aug 2025 13:46:00 +0200 Subject: [PATCH 922/936] fix quotes (#670) --- integrations/custom-approvals/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/custom-approvals/manifest.json b/integrations/custom-approvals/manifest.json index f03cccfb..3e310dc1 100644 --- a/integrations/custom-approvals/manifest.json +++ b/integrations/custom-approvals/manifest.json @@ -55,7 +55,7 @@ } ] }, - "jsonBody": "{\"_site\": {\"href\": \"{{_links.approval.href}}\"}, \"_id\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{{details.plainText}}}\",{{/if}} \"project\": {\"name\":\"{{project.name}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{{this}}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{project.environment.name}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{{this}}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{flag.name}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{{this}}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.milliseconds}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{{this}}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{{approvalDescription}}}\" }", + "jsonBody": "{\"_site\": {\"href\": \"{{_links.approval.href}}\"}, \"_id\": \"{{approvalId}}\", {{#if details.plainText}}\"details\": \"{{{details.plainText}}}\",{{/if}} \"project\": {\"name\":\"{{{project.name}}}\", \"key\": \"{{project.key}}\", \"tags\":[{{#each project.tags}}\"{{{this}}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"environment\": {\"name\":\"{{{project.environment.name}}}\", \"key\": \"{{project.environment.key}}\", \"tags\":[{{#each project.environment.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]}, \"flag\": {\"name\":\"{{{flag.name}}}\", \"key\": \"{{flag.key}}\", \"tags\":[{{#each flag.tags}}\"{{this}}\"{{#if @last}}{{else}},{{/if}}{{/each}}]},{{#if title.member}}\"requestedBy\": {\"id\": \"{{member._id}}\", \"email\": \"{{member.email}}\"},{{/if}}\"shortDescription\": \"{{{title.plainText}}}\", \"timestamp\": \"{{timestamp.milliseconds}}\", \"approvalFormVariables\": { {{#each approvalFormVariables}} \"{{@key}}\": \"{{{this}}}\"{{#if @last}}{{else}},{{/if}}{{/each}} },\"comment\": \"{{{approvalDescription}}}\" }", "parser": { "approvalId": "/_id", "statusValue": "/status/value", From a03357265d9fe0fd9dd7a4cdaafbc3ff80f8c9e1 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 5 Aug 2025 10:41:58 +0200 Subject: [PATCH 923/936] [PA-842] Imiller/pa 842/add buttonAction capability (#671) * add new capability * add ai to categories * add resourceAction to capabilities enum * stub manifest * add resourceType to capability * add resourceType to manifest * update square icon * udpate horizontal icon * add note about beta * flesh out body * update to buttonAction * cleanup * use flag.key --- .../devin-flag-cleanup/assets/horizontal.svg | 156 ++++++++++++++++++ .../devin-flag-cleanup/assets/square.svg | 6 + integrations/devin-flag-cleanup/manifest.json | 49 ++++++ manifest.schema.d.ts | 6 + manifest.schema.json | 2 + schemas/base.json | 2 + schemas/capabilities/buttonAction.json | 39 +++++ 7 files changed, 260 insertions(+) create mode 100644 integrations/devin-flag-cleanup/assets/horizontal.svg create mode 100644 integrations/devin-flag-cleanup/assets/square.svg create mode 100644 integrations/devin-flag-cleanup/manifest.json create mode 100644 schemas/capabilities/buttonAction.json diff --git a/integrations/devin-flag-cleanup/assets/horizontal.svg b/integrations/devin-flag-cleanup/assets/horizontal.svg new file mode 100644 index 00000000..492fc6de --- /dev/null +++ b/integrations/devin-flag-cleanup/assets/horizontal.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/devin-flag-cleanup/assets/square.svg b/integrations/devin-flag-cleanup/assets/square.svg new file mode 100644 index 00000000..a8b8e552 --- /dev/null +++ b/integrations/devin-flag-cleanup/assets/square.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/integrations/devin-flag-cleanup/manifest.json b/integrations/devin-flag-cleanup/manifest.json new file mode 100644 index 00000000..65a79d7b --- /dev/null +++ b/integrations/devin-flag-cleanup/manifest.json @@ -0,0 +1,49 @@ +{ + "name": "Devin Flag Cleanup Action (Beta)", + "version": "1.0.0", + "overview": "Get Devin to clean up your flags with one easy click.", + "description": "Get Devin to clean up your flags with one easy click. This action is currently in beta and is not yet available to all users.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://devin.ai/", + "launchdarklyDocs": "https://launchdarkly.com/docs/integrations", + "privacyPolicy": "https://docs.devin.ai/security" + }, + "categories": ["ai", "automation"], + "icons": { + "square": "assets/square.svg", + "horizontal": "assets/horizontal.svg" + }, + "formVariables": [ + { + "key": "apiKey", + "name": "Devin API key", + "type": "string", + "description": "Enter your Devin API key. [Learn more](https://docs.devin.ai/api-reference/overview#get-an-api-key) about generating API keys.", + "isSecret": true + } + ], + "capabilities": { + "buttonAction": { + "resourceContext": "flag", + "actionRequest": { + "endpoint": { + "url": "https://api.devin.ai/v1/sessions", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiKey}}" + } + ] + }, + "jsonBody": "{\"prompt\":\"You are an experienced software engineer. We just archived LaunchDarkly flag '{{flag.key}}'.\\nTask:\\n1. Search the codebase for any references to the flag key (including SDK evals, config files, comments).\\n2. Remove dead code so that the ON variation is baked in.\\n3. Run all tests and lints and fix any compilation errors.\\n4. Push a new branch and open a pull request titled 'Cleanup: remove {{flag.key}} flag'.\"}" + } + } + } +} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 486ec9c5..f14b3f42 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -54,6 +54,7 @@ export type SupportWebsite = string; */ export type Categories = | [ + | "ai" | "analytics" | "approval" | "authentication" @@ -75,6 +76,7 @@ export type Categories = ] | [ ( + | "ai" | "analytics" | "approval" | "authentication" @@ -95,6 +97,7 @@ export type Categories = | "notifications" ), ( + | "ai" | "analytics" | "approval" | "authentication" @@ -117,6 +120,7 @@ export type Categories = ] | [ ( + | "ai" | "analytics" | "approval" | "authentication" @@ -137,6 +141,7 @@ export type Categories = | "notifications" ), ( + | "ai" | "analytics" | "approval" | "authentication" @@ -157,6 +162,7 @@ export type Categories = | "notifications" ), ( + | "ai" | "analytics" | "approval" | "authentication" diff --git a/manifest.schema.json b/manifest.schema.json index 9c02b912..5e896af2 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -155,6 +155,7 @@ "items": { "type": "string", "enum": [ + "ai", "analytics", "approval", "authentication", @@ -752,6 +753,7 @@ "propertyNames": { "enum": [ "auditLogEventsHook", + "buttonAction", "reservedCustomProperties", "trigger", "approval", diff --git a/schemas/base.json b/schemas/base.json index 910e4a8e..2e375048 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -143,6 +143,7 @@ "items": { "type": "string", "enum": [ + "ai", "analytics", "approval", "authentication", @@ -267,6 +268,7 @@ "propertyNames": { "enum": [ "auditLogEventsHook", + "buttonAction", "reservedCustomProperties", "trigger", "approval", diff --git a/schemas/capabilities/buttonAction.json b/schemas/capabilities/buttonAction.json new file mode 100644 index 00000000..81805b13 --- /dev/null +++ b/schemas/capabilities/buttonAction.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "buttonAction": { + "$id": "#/properties/capability/button-action", + "title": "Button action", + "description": "This capability will enable LaunchDarkly to send generic requests to an external API upon the click of a button.", + "type": "object", + "propertyNames": { + "enum": ["resourceContext", "actionRequest"] + }, + "properties": { + "resourceContext": { + "$id": "#/properties/capability/button-action/resource-context", + "title": "Resource Context", + "description": "The resource context the action requires", + "type": "string", + "enum": ["flag"] + }, + "actionRequest": { + "$id": "#/properties/capability/button-action/action-request", + "title": "Action Request", + "description": "Describes the HTTP request for the action", + "propertyNames": { + "enum": ["endpoint", "jsonBody"] + }, + "required": ["endpoint", "jsonBody"], + "properties": { + "endpoint": { + "$ref": "../definitions.json#/endpoint" + }, + "jsonBody": { + "$ref": "../definitions.json#/jsonBody" + } + } + } + }, + "required": ["resourceContext", "actionRequest"] + } +} From 45785b79ccaf30b9d97d85195f8a4656cc5ee898 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 5 Aug 2025 11:16:13 +0200 Subject: [PATCH 924/936] allowIntegrationConfigurations (#672) --- integrations/devin-flag-cleanup/manifest.json | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/devin-flag-cleanup/manifest.json b/integrations/devin-flag-cleanup/manifest.json index 65a79d7b..8166242f 100644 --- a/integrations/devin-flag-cleanup/manifest.json +++ b/integrations/devin-flag-cleanup/manifest.json @@ -24,6 +24,7 @@ "isSecret": true } ], + "allowIntegrationConfigurations": true, "capabilities": { "buttonAction": { "resourceContext": "flag", From 75e148cafe85c671347def5ade273e29fbd1af40 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 5 Aug 2025 14:30:14 +0200 Subject: [PATCH 925/936] add (#673) --- manifest.schema.d.ts | 29 +++++++- manifest.schema.json | 170 +++++++++++++++++++++++++++++++++++++++++++ schemas/base.json | 3 + 3 files changed, 198 insertions(+), 4 deletions(-) diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index f14b3f42..c98769a7 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -441,6 +441,14 @@ export type DeliveryMethod = "custom"; * Whether to send the standard audit log webhook payload or to use defined JSON templates */ export type UseStandardWebhookPayload = boolean; +/** + * The resource context the action requires + */ +export type ResourceContext = "flag"; +/** + * Template string used to render the JSON request body + */ +export type JSONBody = string; /** * The reserved custom property's display name. */ @@ -510,10 +518,6 @@ export type AllowAdditionalApprovalFormVariablesForCreationRequestModal = boolea * If true, the user can create integration configurations associated with this integration's approval capability. Requires formVariables to be defined */ export type AllowUsersToConfigureIntegrationConfigurationsForApprovals = boolean; -/** - * Template string used to render the JSON request body - */ -export type JSONBody = string; /** * Externally-created approval entity ID */ @@ -884,6 +888,7 @@ export interface MultiSelectOptionItem { */ export interface Capabilities { auditLogEventsHook?: AuditLogEventsHook; + buttonAction?: ButtonAction; reservedCustomProperties?: ReservedCustomProperties; trigger?: Trigger; approval?: Approval; @@ -935,6 +940,22 @@ export interface Policy { resources?: Resources; [k: string]: unknown; } +/** + * This capability will enable LaunchDarkly to send generic requests to an external API upon the click of a button. + */ +export interface ButtonAction { + resourceContext: ResourceContext; + actionRequest: ActionRequest; + [k: string]: unknown; +} +/** + * Describes the HTTP request for the action + */ +export interface ActionRequest { + endpoint: Endpoint; + jsonBody: JSONBody; + [k: string]: unknown; +} /** * This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly */ diff --git a/manifest.schema.json b/manifest.schema.json index 5e896af2..6c522b07 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1089,6 +1089,176 @@ "templates" ] }, + "buttonAction": { + "$id": "#/properties/capability/button-action", + "title": "Button action", + "description": "This capability will enable LaunchDarkly to send generic requests to an external API upon the click of a button.", + "type": "object", + "propertyNames": { + "enum": [ + "resourceContext", + "actionRequest" + ] + }, + "properties": { + "resourceContext": { + "$id": "#/properties/capability/button-action/resource-context", + "title": "Resource Context", + "description": "The resource context the action requires", + "type": "string", + "enum": [ + "flag" + ] + }, + "actionRequest": { + "$id": "#/properties/capability/button-action/action-request", + "title": "Action Request", + "description": "Describes the HTTP request for the action", + "propertyNames": { + "enum": [ + "endpoint", + "jsonBody" + ] + }, + "required": [ + "endpoint", + "jsonBody" + ], + "properties": { + "endpoint": { + "$id": "#/definitions/endpoint", + "title": "Endpoint", + "description": "Properties that describe an HTTP request to an external endpoint", + "type": "object", + "propertyNames": { + "enum": [ + "url", + "method", + "headers", + "hmacSignature" + ] + }, + "properties": { + "url": { + "$id": "#/definitions/endpoint/url", + "title": "URL", + "type": "string", + "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." + }, + "method": { + "$id": "#/definitions/endpoint/method", + "title": "HTTP method", + "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", + "enum": [ + "POST", + "PUT", + "PATCH", + "GET", + "DELETE" + ], + "type": "string" + }, + "headers": { + "$id": "#/definitions/endpoint/headers", + "title": "HTTP headers", + "description": "Headers to send with the webhook request", + "type": "array", + "items": { + "$id": "#/definitions/endpoint/header/items", + "title": "Header items", + "description": "A name and value pair to send as headers with the hook request", + "type": "object", + "propertyNames": { + "enum": [ + "name", + "value" + ] + }, + "properties": { + "name": { + "$id": "#/definitions/endpoint/header/items/name", + "title": "Name", + "type": "string", + "description": "Name of the header", + "maxLength": 50, + "pattern": "^[^\\s]*$" + }, + "value": { + "$id": "#/definitions/endpoint/header/items/value", + "title": "Value", + "type": "string", + "description": "Value of the header. Form variables can be substituted in using {{variableName}}" + } + }, + "required": [ + "name", + "value" + ] + }, + "default": [ + { + "name": "Content-Type", + "value": "application/json" + } + ], + "examples": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ], + "minProperties": 1 + }, + "hmacSignature": { + "$id": "#/definitions/endpoint/hmac-signature", + "title": "HMAC signature", + "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", + "type": "object", + "propertyNames": { + "enum": [ + "headerName", + "hmacSecretFormVariableKey" + ] + }, + "properties": { + "headerName": { + "$id": "#/definitions/endpoint/hmac-signature/header-name", + "title": "HMAC signature header name", + "description": "The name of the HMAC signature header", + "type": "string" + }, + "hmacSecretFormVariableKey": { + "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", + "title": "HMAC secret form variable key", + "description": "The name of the form variable field that corresponds to the HMAC encryption secret", + "type": "string" + } + } + } + }, + "required": [ + "url", + "method" + ] + }, + "jsonBody": { + "$id": "#/definitions/json-body", + "title": "JSON Body", + "description": "Template string used to render the JSON request body", + "type": "string" + } + } + } + }, + "required": [ + "resourceContext", + "actionRequest" + ] + }, "reservedCustomProperties": { "$id": "#/properties/capability/reserved-custom-properties", "title": "Reserved custom properties", diff --git a/schemas/base.json b/schemas/base.json index 2e375048..42cab357 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -289,6 +289,9 @@ "auditLogEventsHook": { "$ref": "schemas/capabilities/auditLogEventsHook.json#/auditLogEventsHook" }, + "buttonAction": { + "$ref": "schemas/capabilities/buttonAction.json#/buttonAction" + }, "reservedCustomProperties": { "$ref": "schemas/capabilities/reservedCustomProperties.json#/reservedCustomProperties" }, From 22e8b9f9fdea0094b9d1b74312137f00e437897b Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Tue, 5 Aug 2025 16:14:11 +0200 Subject: [PATCH 926/936] [PA-842] Pa 842/add button action to manifest (#674) * add * update context var --- integrations/devin-flag-cleanup/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/devin-flag-cleanup/manifest.json b/integrations/devin-flag-cleanup/manifest.json index 8166242f..e5247b0a 100644 --- a/integrations/devin-flag-cleanup/manifest.json +++ b/integrations/devin-flag-cleanup/manifest.json @@ -43,7 +43,7 @@ } ] }, - "jsonBody": "{\"prompt\":\"You are an experienced software engineer. We just archived LaunchDarkly flag '{{flag.key}}'.\\nTask:\\n1. Search the codebase for any references to the flag key (including SDK evals, config files, comments).\\n2. Remove dead code so that the ON variation is baked in.\\n3. Run all tests and lints and fix any compilation errors.\\n4. Push a new branch and open a pull request titled 'Cleanup: remove {{flag.key}} flag'.\"}" + "jsonBody": "{\"prompt\":\"You are an experienced software engineer. We just archived LaunchDarkly flag '{{flagKey}}'.\\nTask:\\n1. Search the codebase for any references to the flag key (including SDK evals, config files, comments).\\n2. Remove dead code so that the ON variation is baked in.\\n3. Run all tests and lints and fix any compilation errors.\\n4. Push a new branch and open a pull request titled 'Cleanup: remove {{flagKey}} flag'.\"}" } } } From 2298beff73346deebc44de1388e9575b5f86910f Mon Sep 17 00:00:00 2001 From: Dhruv Rawat Date: Wed, 6 Aug 2025 15:01:48 +0530 Subject: [PATCH 927/936] Refactor Devin Flag Cleanup integration to a more general Devin Integration that can be used for multiple things in the codebase (#675) --- .../{devin-flag-cleanup => devin}/assets/horizontal.svg | 0 .../{devin-flag-cleanup => devin}/assets/square.svg | 0 integrations/{devin-flag-cleanup => devin}/manifest.json | 6 +++--- 3 files changed, 3 insertions(+), 3 deletions(-) rename integrations/{devin-flag-cleanup => devin}/assets/horizontal.svg (100%) rename integrations/{devin-flag-cleanup => devin}/assets/square.svg (100%) rename integrations/{devin-flag-cleanup => devin}/manifest.json (82%) diff --git a/integrations/devin-flag-cleanup/assets/horizontal.svg b/integrations/devin/assets/horizontal.svg similarity index 100% rename from integrations/devin-flag-cleanup/assets/horizontal.svg rename to integrations/devin/assets/horizontal.svg diff --git a/integrations/devin-flag-cleanup/assets/square.svg b/integrations/devin/assets/square.svg similarity index 100% rename from integrations/devin-flag-cleanup/assets/square.svg rename to integrations/devin/assets/square.svg diff --git a/integrations/devin-flag-cleanup/manifest.json b/integrations/devin/manifest.json similarity index 82% rename from integrations/devin-flag-cleanup/manifest.json rename to integrations/devin/manifest.json index e5247b0a..c6fe874e 100644 --- a/integrations/devin-flag-cleanup/manifest.json +++ b/integrations/devin/manifest.json @@ -1,8 +1,8 @@ { - "name": "Devin Flag Cleanup Action (Beta)", + "name": "Devin (Beta)", "version": "1.0.0", - "overview": "Get Devin to clean up your flags with one easy click.", - "description": "Get Devin to clean up your flags with one easy click. This action is currently in beta and is not yet available to all users.", + "overview": "AI-driven code automation for LaunchDarkly via Devin integration.", + "description": "Delegates end-to-end flag lifecycle, SDK setup, experiment instrumentation tasks to Devin, delivering pull-ready code changes from a single click. This action is currently in beta and is not yet available to all users.", "author": "LaunchDarkly", "supportEmail": "support@launchdarkly.com", "links": { From c56db72bb4478a78c2db0b17c0f97f6c2184a26d Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 6 Aug 2025 15:56:21 +0200 Subject: [PATCH 928/936] [PA-842] allow for multiple different request bodies in buttonAction (#676) * see title * update schema and add new prompt --- integrations/devin/manifest.json | 16 ++++-- manifest.schema.d.ts | 22 ++++++--- manifest.schema.json | 68 ++++++++++++++++---------- schemas/capabilities/buttonAction.json | 46 +++++++++++------ 4 files changed, 102 insertions(+), 50 deletions(-) diff --git a/integrations/devin/manifest.json b/integrations/devin/manifest.json index c6fe874e..09695e2c 100644 --- a/integrations/devin/manifest.json +++ b/integrations/devin/manifest.json @@ -27,7 +27,6 @@ "allowIntegrationConfigurations": true, "capabilities": { "buttonAction": { - "resourceContext": "flag", "actionRequest": { "endpoint": { "url": "https://api.devin.ai/v1/sessions", @@ -42,9 +41,20 @@ "value": "Bearer {{apiKey}}" } ] + } + }, + "requestBodyTemplates": [ + { + "key": "flagCleanup", + "jsonBody": "{\"prompt\":\"You are an experienced software engineer. We just archived LaunchDarkly flag '{{flagKey}}'.\\nTask:\\n1. Search the codebase for any references to the flag key (including SDK evals, config files, comments).\\n2. Remove dead code so that the ON variation is baked in.\\n3. Run all tests and lints and fix any compilation errors.\\n4. Push a new branch and open a pull request titled 'Cleanup: remove {{flagKey}} flag'.\"}", + "requiredContext": ["flagKey"] }, - "jsonBody": "{\"prompt\":\"You are an experienced software engineer. We just archived LaunchDarkly flag '{{flagKey}}'.\\nTask:\\n1. Search the codebase for any references to the flag key (including SDK evals, config files, comments).\\n2. Remove dead code so that the ON variation is baked in.\\n3. Run all tests and lints and fix any compilation errors.\\n4. Push a new branch and open a pull request titled 'Cleanup: remove {{flagKey}} flag'.\"}" - } + { + "key": "sdkSetup", + "jsonBody": "{\"prompt\":\"You are an experienced software engineer. I need help setting up the LaunchDarkly AI Configs SDK for {{content.selectedSdk}}.\nHere are the import and initialize instructions for {{content.selectedSdk}}:\nImport instructions:\n{{{content.instructions.import}}}\nInitialize instructions:\n{{{content.instructions.initialize}}}\n\nPlease help me:\n1. Set up the LaunchDarkly AI Configs SDK for {{content.environmentKey}}\n2. Use the provided import and initialize code\n3. Make sure the SDK is properly configured with the API key\n4. Make these changes in the {{content.repository}} repository and push a new branch and open a pull request\"}", + "requiredContext": ["content", "environmentKey"] + } + ] } } } diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index c98769a7..1d5ba1c1 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -441,14 +441,25 @@ export type DeliveryMethod = "custom"; * Whether to send the standard audit log webhook payload or to use defined JSON templates */ export type UseStandardWebhookPayload = boolean; -/** - * The resource context the action requires - */ -export type ResourceContext = "flag"; /** * Template string used to render the JSON request body */ export type JSONBody = string; +/** + * An array of json objects that can be sent as request bodies + */ +export type RequestBodyTemplates = { + /** + * A unique identifier for the specific request body + */ + key: string; + jsonBody: JSONBody; + /** + * An array of context strings that are required to correctly resolve the request body + */ + requiredContext: string[]; + [k: string]: unknown; +}[]; /** * The reserved custom property's display name. */ @@ -944,8 +955,8 @@ export interface Policy { * This capability will enable LaunchDarkly to send generic requests to an external API upon the click of a button. */ export interface ButtonAction { - resourceContext: ResourceContext; actionRequest: ActionRequest; + requestBodyTemplates: RequestBodyTemplates; [k: string]: unknown; } /** @@ -953,7 +964,6 @@ export interface ButtonAction { */ export interface ActionRequest { endpoint: Endpoint; - jsonBody: JSONBody; [k: string]: unknown; } /** diff --git a/manifest.schema.json b/manifest.schema.json index 6c522b07..7c7f2bb4 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -1096,33 +1096,26 @@ "type": "object", "propertyNames": { "enum": [ - "resourceContext", - "actionRequest" + "actionRequest", + "requestBodyTemplates" ] }, + "required": [ + "actionRequest", + "requestBodyTemplates" + ], "properties": { - "resourceContext": { - "$id": "#/properties/capability/button-action/resource-context", - "title": "Resource Context", - "description": "The resource context the action requires", - "type": "string", - "enum": [ - "flag" - ] - }, "actionRequest": { "$id": "#/properties/capability/button-action/action-request", "title": "Action Request", "description": "Describes the HTTP request for the action", "propertyNames": { "enum": [ - "endpoint", - "jsonBody" + "endpoint" ] }, "required": [ - "endpoint", - "jsonBody" + "endpoint" ], "properties": { "endpoint": { @@ -1244,20 +1237,43 @@ "url", "method" ] - }, - "jsonBody": { - "$id": "#/definitions/json-body", - "title": "JSON Body", - "description": "Template string used to render the JSON request body", - "type": "string" + } + } + }, + "requestBodyTemplates": { + "$id": "#/properties/capability/button-action/request-body-templates", + "title": "Request Body Templates", + "description": "An array of json objects that can be sent as request bodies", + "type": "array", + "items": { + "type": "object", + "required": [ + "key", + "jsonBody", + "requiredContext" + ], + "properties": { + "key": { + "type": "string", + "description": "A unique identifier for the specific request body" + }, + "jsonBody": { + "$id": "#/definitions/json-body", + "title": "JSON Body", + "description": "Template string used to render the JSON request body", + "type": "string" + }, + "requiredContext": { + "type": "array", + "description": "An array of context strings that are required to correctly resolve the request body", + "items": { + "type": "string" + } + } } } } - }, - "required": [ - "resourceContext", - "actionRequest" - ] + } }, "reservedCustomProperties": { "$id": "#/properties/capability/reserved-custom-properties", diff --git a/schemas/capabilities/buttonAction.json b/schemas/capabilities/buttonAction.json index 81805b13..45a3bda5 100644 --- a/schemas/capabilities/buttonAction.json +++ b/schemas/capabilities/buttonAction.json @@ -6,34 +6,50 @@ "description": "This capability will enable LaunchDarkly to send generic requests to an external API upon the click of a button.", "type": "object", "propertyNames": { - "enum": ["resourceContext", "actionRequest"] + "enum": ["actionRequest", "requestBodyTemplates"] }, + "required": ["actionRequest", "requestBodyTemplates"], "properties": { - "resourceContext": { - "$id": "#/properties/capability/button-action/resource-context", - "title": "Resource Context", - "description": "The resource context the action requires", - "type": "string", - "enum": ["flag"] - }, "actionRequest": { "$id": "#/properties/capability/button-action/action-request", "title": "Action Request", "description": "Describes the HTTP request for the action", "propertyNames": { - "enum": ["endpoint", "jsonBody"] + "enum": ["endpoint"] }, - "required": ["endpoint", "jsonBody"], + "required": ["endpoint"], "properties": { "endpoint": { "$ref": "../definitions.json#/endpoint" - }, - "jsonBody": { - "$ref": "../definitions.json#/jsonBody" + } + } + }, + "requestBodyTemplates": { + "$id": "#/properties/capability/button-action/request-body-templates", + "title": "Request Body Templates", + "description": "An array of json objects that can be sent as request bodies", + "type": "array", + "items": { + "type": "object", + "required": ["key", "jsonBody", "requiredContext"], + "properties": { + "key": { + "type": "string", + "description": "A unique identifier for the specific request body" + }, + "jsonBody": { + "$ref": "../definitions.json#/jsonBody" + }, + "requiredContext": { + "type": "array", + "description": "An array of context strings that are required to correctly resolve the request body", + "items": { + "type": "string" + } + } } } } - }, - "required": ["resourceContext", "actionRequest"] + } } } From 5de37b74bfe6963af5d672cdfbb9e6f395540b23 Mon Sep 17 00:00:00 2001 From: Dhruv Rawat Date: Thu, 7 Aug 2025 19:19:02 +0530 Subject: [PATCH 929/936] fix the jsonBody for the sdkSetup Devin (#677) --- integrations/devin/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/devin/manifest.json b/integrations/devin/manifest.json index 09695e2c..b258c191 100644 --- a/integrations/devin/manifest.json +++ b/integrations/devin/manifest.json @@ -51,7 +51,7 @@ }, { "key": "sdkSetup", - "jsonBody": "{\"prompt\":\"You are an experienced software engineer. I need help setting up the LaunchDarkly AI Configs SDK for {{content.selectedSdk}}.\nHere are the import and initialize instructions for {{content.selectedSdk}}:\nImport instructions:\n{{{content.instructions.import}}}\nInitialize instructions:\n{{{content.instructions.initialize}}}\n\nPlease help me:\n1. Set up the LaunchDarkly AI Configs SDK for {{content.environmentKey}}\n2. Use the provided import and initialize code\n3. Make sure the SDK is properly configured with the API key\n4. Make these changes in the {{content.repository}} repository and push a new branch and open a pull request\"}", + "jsonBody": "{\"prompt\":\"You are an experienced software engineer. I need help setting up the LaunchDarkly AI Configs SDK for {{content.selectedSdk}}.\\nHere are the import and initialize instructions for {{content.selectedSdk}}:\\nImport instructions:\\n{{{content.instructions.import}}}\\nInitialize instructions:\\n{{{content.instructions.initialize}}}\\n\\nPlease help me:\\n1. Set up the LaunchDarkly AI Configs SDK for {{content.environmentKey}}\\n2. Use the provided import and initialize code\\n3. Make sure the SDK is properly configured with the API key\\n4. Make these changes in the {{content.repository}} repository and push a new branch and open a pull request\"}", "requiredContext": ["content", "environmentKey"] } ] From 46e383044e2cab1ea47fa7d4258aacaa9168d1a4 Mon Sep 17 00:00:00 2001 From: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Date: Tue, 26 Aug 2025 15:12:50 -0500 Subject: [PATCH 930/936] [REL-8809] Adding AI config test run manifest (#678) * Adding AI config test run manifest * run prettier * Updated assets --- __tests__/validateIntegrationManifests.js | 4 +- .../assets/images/horizontal.svg | 21 ++++++++++ .../assets/images/square.svg | 21 ++++++++++ integrations/aiconfig-test-run/manifest.json | 38 +++++++++++++++++++ 4 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 integrations/aiconfig-test-run/assets/images/horizontal.svg create mode 100644 integrations/aiconfig-test-run/assets/images/square.svg create mode 100644 integrations/aiconfig-test-run/manifest.json diff --git a/__tests__/validateIntegrationManifests.js b/__tests__/validateIntegrationManifests.js index 313db567..b217fe8b 100644 --- a/__tests__/validateIntegrationManifests.js +++ b/__tests__/validateIntegrationManifests.js @@ -437,8 +437,10 @@ describe('All integrations', () => { test.each(manifests)( 'at least one externalCapability has been defined if no manifest capabilities for %s', (key, manifest) => { + const integrationsWithNoCapabilities = ['aiconfig-test-run']; const capabilities = _.get(manifest, 'capabilities', null); - if (!capabilities) { + + if (!capabilities && !integrationsWithNoCapabilities.includes(key)) { const otherCapabilities = _.get(manifest, 'otherCapabilities', null); expect(otherCapabilities).not.toBeNull(); expect(otherCapabilities.length).toBeGreaterThan(0); diff --git a/integrations/aiconfig-test-run/assets/images/horizontal.svg b/integrations/aiconfig-test-run/assets/images/horizontal.svg new file mode 100644 index 00000000..41fcd9c7 --- /dev/null +++ b/integrations/aiconfig-test-run/assets/images/horizontal.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/aiconfig-test-run/assets/images/square.svg b/integrations/aiconfig-test-run/assets/images/square.svg new file mode 100644 index 00000000..41fcd9c7 --- /dev/null +++ b/integrations/aiconfig-test-run/assets/images/square.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/integrations/aiconfig-test-run/manifest.json b/integrations/aiconfig-test-run/manifest.json new file mode 100644 index 00000000..357a7a60 --- /dev/null +++ b/integrations/aiconfig-test-run/manifest.json @@ -0,0 +1,38 @@ +{ + "name": "AI Config Test Run", + "version": "1.0.0", + "overview": "Configure your LLM provider and API key to use in your AI Config test runs.", + "description": "This integration helps you configure your LLM provider and API key to use in your AI Config test runs.", + "author": "LaunchDarkly", + "supportEmail": "support@launchdarkly.com", + "links": { + "site": "https://launchdarkly.com/", + "launchdarklyDocs": "https://docs.launchdarkly.com/integrations/ai-config-test-runs", + "privacyPolicy": "https://launchdarkly.com/policies/privacy/" + }, + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "categories": ["ai"], + "requiresOAuth": false, + "allowIntegrationConfigurations": true, + "formVariables": [ + { + "key": "provider", + "name": "Model Provider", + "description": "Select your model provider", + "placeholder": "Select your model provider", + "type": "enum", + "allowedValues": ["Anthropic", "Bedrock", "OpenAI"] + }, + { + "key": "apiKey", + "name": "API Key", + "description": "Enter the API key for your selected model provider", + "placeholder": "Enter your API key", + "type": "string", + "isSecret": true + } + ] +} From e372c8a2f167fe2a8fa6f519acda96edb604afe5 Mon Sep 17 00:00:00 2001 From: Patrick Kaeding Date: Thu, 11 Sep 2025 17:14:39 -0700 Subject: [PATCH 931/936] feat: [SEC-7263] Add dependency-scan GitHub Actions workflow (#679) * feat: [SEC-7263] Add dependency-scan GitHub Actions workflow Generate Node.js SBOM using launchdarkly/common-actions for SEC-7263. Add policy evaluation step with bom-* artifacts pattern. Configure triggers for pull requests and main branch pushes. Co-Authored-By: Patrick Kaeding * fix: use ubuntu-latest runner instead of invalid runner spec Replace runs-on=${{ github.run_id }}/runner=ubuntu22-2cpu-8gb-x64 with ubuntu-latest to resolve 'invalid runner spec' error in private repository CI. Use actions/checkout@v4 instead of runs-on/action for standard GitHub runner. Co-Authored-By: Patrick Kaeding --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .github/workflows/dependency-scan.yml | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/dependency-scan.yml diff --git a/.github/workflows/dependency-scan.yml b/.github/workflows/dependency-scan.yml new file mode 100644 index 00000000..c207d3c7 --- /dev/null +++ b/.github/workflows/dependency-scan.yml @@ -0,0 +1,29 @@ +name: Dependency Scan + +on: + pull_request: + push: + branches: [main] + +jobs: + generate-nodejs-sbom: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: launchdarkly/common-actions/init@main + + - name: Generate SBOM + uses: launchdarkly/common-actions/dependency-scan/generate-sbom@main + with: + types: 'nodejs' + + evaluate-policy: + runs-on: ubuntu-latest + needs: + - generate-nodejs-sbom + steps: + - uses: actions/checkout@v4 + - name: Evaluate SBOM Policy + uses: launchdarkly/common-actions/dependency-scan/evaluate-policy@main + with: + artifacts-pattern: bom-* From 4aea2676278ec8da5ae20f9df7d48700f37aae5a Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 8 Oct 2025 12:44:20 +0200 Subject: [PATCH 932/936] [REL-8880] merge --- .github/workflows/pull_request.yml | 15 + package-lock.json | 5390 +--------------------------- 2 files changed, 17 insertions(+), 5388 deletions(-) create mode 100644 .github/workflows/pull_request.yml diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 00000000..8c1c59a8 --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,15 @@ +on: pull_request +name: Pull request +jobs: + setShortcutLinkInPR: + if: github.repository == 'launchdarkly/integration-framework-private' + name: Set Shortcut Link in PR + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set Shortcut Link in PR + uses: launchdarkly-labs/ld-gh-actions-shortcut/set-link@main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + AUTOLINK_PREFIX: 'SC-' + CREATE_STORY_URL: https://app.shortcut.com/launchdarkly/stories/new?template_id=5f3fbdce-dfa0-446b-91c5-0cf6e01f5045 diff --git a/package-lock.json b/package-lock.json index bc3c5a15..aa0e5622 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "@launchdarkly/integration-framework", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -4088,6 +4088,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -7168,5392 +7169,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - } - } - }, - "@apidevtools/json-schema-ref-parser": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-8.0.0.tgz", - "integrity": "sha512-n4YBtwQhdpLto1BaUCyAeflizmIbaloGShsPyRtFf5qdFJxfssj+GgLavczgKJFa3Bq+3St2CKcpRJdjtB4EBw==", - "dev": true, - "requires": { - "@jsdevtools/ono": "^7.1.0", - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.25.7", - "picocolors": "^1.0.0" - } - }, - "@babel/compat-data": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", - "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", - "dev": true - }, - "@babel/core": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", - "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.8", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.8", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", - "dev": true, - "requires": { - "@babel/types": "^7.25.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "@babel/helper-module-imports": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", - "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", - "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", - "dev": true, - "requires": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - } - }, - "@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", - "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", - "dev": true - }, - "@babel/helpers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", - "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", - "dev": true, - "requires": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" - } - }, - "@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "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==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", - "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", - "dev": true, - "requires": { - "@babel/types": "^7.25.8" - } - }, - "@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.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", - "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.7" - } - }, - "@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-jsx": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", - "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.7" - } - }, - "@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-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", - "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.25.7" - } - }, - "@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" - } - }, - "@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "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 - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "@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": { - "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" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - } - }, - "@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "requires": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - } - }, - "@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3" - } - }, - "@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - } - }, - "@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - } - } - }, - "@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - } - } - }, - "@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - } - } - }, - "@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - } - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/fined": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/fined/-/fined-1.1.3.tgz", - "integrity": "sha512-CWYnSRnun3CGbt6taXeVo2lCbuaj4mchVJ4UF/BdU5TSuIn3AmS13pGMwCsBUoehGbhZrBrpNJZSZI5EVilXww==", - "dev": true - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/inquirer": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.1.tgz", - "integrity": "sha512-wKW3SKIUMmltbykg4I5JzCVzUhkuD9trD6efAmYgN2MrSntY0SMRQzEnD3mkyJ/rv9NLbTC7g3hKKE86YwEDLw==", - "dev": true, - "requires": { - "@types/through": "*", - "rxjs": "^7.2.0" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@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==", - "dev": true - }, - "@types/liftoff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/liftoff/-/liftoff-4.0.0.tgz", - "integrity": "sha512-Ny/PJkO6nxWAQnaet8q/oWz15lrfwvdvBpuY4treB0CSsBO1CG0fVuNLngR3m3bepQLd+E4c3Y3DlC2okpUvPw==", - "dev": true, - "requires": { - "@types/fined": "*", - "@types/node": "*" - } - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "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/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "@types/through": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "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==", - "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" - } - }, - "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-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "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==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "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" - } - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "requires": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "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": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@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-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - } - }, - "babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", - "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - } - }, - "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": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001668", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", - "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", - "dev": true - }, - "capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", - "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", - "dev": true, - "requires": { - "ansi-regex": "^2.1.1", - "d": "^1.0.1", - "es5-ext": "^0.10.51", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.7" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "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" - } - }, - "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "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 - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "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==" - } - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dateformat": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.5.1.tgz", - "integrity": "sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q==" - }, - "debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "requires": {} - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "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" - }, - "dependencies": { - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "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" - } - } - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "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": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "electron-to-chromium": { - "version": "1.5.36", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", - "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==", - "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "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 - }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "dev": true, - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "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 - }, - "esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "dev": true, - "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "dependencies": { - "type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "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==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "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" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "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==" - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "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==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "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" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "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" - } - }, - "findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", - "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", - "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^5.0.0", - "object.defaults": "^1.1.0", - "object.pick": "^1.3.0", - "parse-filepath": "^1.0.2" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - } - } - }, - "flagged-respawn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", - "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", - "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 - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", - "dev": true - } - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "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", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "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-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob": { - "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", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-promise": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", - "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", - "dev": true, - "requires": { - "@types/glob": "*" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "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": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "dependencies": { - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - } - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "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 - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, - "requires": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "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 - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "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 - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "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==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - } - } - }, - "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 - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "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 - }, - "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.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true - }, - "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 - }, - "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.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-unicode-supported": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", - "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "requires": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - } - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jackspeak": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", - "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - } - }, - "jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "requires": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - } - }, - "jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - } - }, - "jest-expect-message": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jest-expect-message/-/jest-expect-message-1.0.2.tgz", - "integrity": "sha512-WFiXMgwS2lOqQZt1iJMI/hOXpUm32X+ApsuzYcQpW5m16Pv6/Gd9kgC+Q+Q1YVNU04kYcAOv9NXMnjg6kKUy6Q==", - "dev": true - }, - "jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true - }, - "jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-junit": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.0.0.tgz", - "integrity": "sha512-JSHR+Dhb32FGJaiKkqsB7AR3OqWKtldLd6ZH2+FJ8D4tsweb8Id8zEVReU4+OlrRO1ZluqJLQEETm+Q6/KilBg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" - } - }, - "jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "requires": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - } - }, - "jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true - }, - "jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "requires": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - } - }, - "jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "requires": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "requires": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - } - }, - "jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "requires": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "requires": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "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.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "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-ref-parser": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", - "integrity": "sha512-z0JGv7rRD3CnJbZY/qCpscyArdtLJhr/wRBmFUdoZ8xMjsFyNdILSprG2degqRLjBjyhZHAEBpGOxniO9rKTxA==", - "dev": true, - "requires": { - "@apidevtools/json-schema-ref-parser": "9.0.6" - }, - "dependencies": { - "@apidevtools/json-schema-ref-parser": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", - "integrity": "sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==", - "dev": true, - "requires": { - "@jsdevtools/ono": "^7.1.3", - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - } - } - }, - "json-schema-to-typescript": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.0.0.tgz", - "integrity": "sha512-G5RZlHchI9r/v31QhH5k57K+2kvYRBWKIGctJPsUuIkUIf3J3xXzvQZJGa16bhVjgs1fStaLamfFIti6K6V6wQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "cli-color": "^2.0.0", - "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "is-glob": "^4.0.1", - "json-schema-ref-parser": "^9.0.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "mz": "^2.7.0", - "prettier": "^2.2.0", - "stdin": "0.0.1" - } - }, - "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==", - "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 - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true - }, - "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 - }, - "liftoff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-4.0.0.tgz", - "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==", - "dev": true, - "requires": { - "extend": "^3.0.2", - "findup-sync": "^5.0.0", - "fined": "^2.0.0", - "flagged-respawn": "^2.0.0", - "is-plain-object": "^5.0.0", - "object.map": "^1.0.1", - "rechoir": "^0.8.0", - "resolve": "^1.20.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - } - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "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.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "requires": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "dependencies": { - "chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true - } - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "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 - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "memoizee": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.45", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.5" - } - }, - "merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "requires": { - "mime-db": "1.51.0" - } - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-plop": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/node-plop/-/node-plop-0.31.0.tgz", - "integrity": "sha512-aKLPxiBoFTNUovvtK8j/Whc4PZREkYx6htw2HJPiU8wYquXmN8pkd9B3xlFo6AJ4ZlzFsQSf/NXR5xET8EqRYw==", - "dev": true, - "requires": { - "@types/inquirer": "^8.2.1", - "change-case": "^4.1.2", - "del": "^6.0.0", - "globby": "^13.1.1", - "handlebars": "^4.4.3", - "inquirer": "^8.2.2", - "isbinaryfile": "^4.0.8", - "lodash.get": "^4.4.2", - "lower-case": "^2.0.2", - "mkdirp": "^1.0.4", - "resolve": "^1.20.0", - "title-case": "^3.0.3", - "upper-case": "^2.0.2" - } - }, - "node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true - }, - "nodemon": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", - "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "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==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "requires": { - "abbrev": "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 - }, - "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" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "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" - } - }, - "ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", - "dev": true, - "requires": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true - }, - "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "requires": { - "restore-cursor": "^4.0.0" - } - }, - "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.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" - }, - "dependencies": { - "p-limit": { - "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-map": { - "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-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 - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "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" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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 - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "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 - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", - "dev": true - }, - "path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", - "dev": true, - "requires": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", - "dev": true - } - } - }, - "path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "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" - } - }, - "plop": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/plop/-/plop-3.1.1.tgz", - "integrity": "sha512-NuctKmuNUACXBQn25bBr5oj/75nHxdKGwjA/+b7cVoj1sp+gTVqcc8eAr4QcNJgMPsZWRJBN2kMkgmsqbqV9gg==", - "dev": true, - "requires": { - "@types/liftoff": "^4.0.0", - "chalk": "^5.0.1", - "interpret": "^2.2.0", - "liftoff": "^4.0.0", - "minimist": "^1.2.6", - "node-plop": "^0.31.0", - "ora": "^6.0.1", - "v8flags": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true - } - } - }, - "prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", - "dev": true - }, - "pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true - }, - "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "requires": { - "side-channel": "^1.0.6" - } - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, - "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" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "requires": { - "resolve": "^1.20.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.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==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "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.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true - }, - "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" - } - }, - "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": "5.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", - "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", - "dev": true, - "requires": { - "glob": "^10.2.5" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.0.tgz", - "integrity": "sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" - } - }, - "minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "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.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, - "send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - } - } - }, - "sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "requires": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "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 - }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "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", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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 - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "stdin": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/stdin/-/stdin-0.0.1.tgz", - "integrity": "sha1-0wQZgarsPf28d6GzjWNy449ftx4=", - "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" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "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==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "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" - } - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "title-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", - "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "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": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "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" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - } - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "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.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", - "dev": true - }, - "uglify-js": { - "version": "3.13.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.5.tgz", - "integrity": "sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==", - "dev": true, - "optional": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "dev": true - }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "dev": true, - "requires": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - } - }, - "upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse": { - "version": "1.5.9", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.9.tgz", - "integrity": "sha512-HpOvhKBvre8wYez+QhHcYiVvVmeF6DVnuSOOPhe3cTum3BnqHhvKaZm8FU5yTiOu/Jut2ZpB2rA/SbBA1JIGlQ==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - } - } - }, - "v8flags": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.0.tgz", - "integrity": "sha512-83N0OkTbn6gOjJ2awNuzuK4czeGxwEwBoTqlhBZhnp8o0IJ72mXRQKphj/azwRf3acbDJZYZhbOPEJHd884ELg==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "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" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } From 6c4fccac15d815a898fc2230c29877b06e15f303 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 8 Oct 2025 13:00:43 +0200 Subject: [PATCH 933/936] [REL-8880] add docs directory back --- docs/capabilities.md | 299 ++++++++++++++++++++++++++++++++++++++++ docs/form-variables.md | 44 ++++++ docs/getting-started.md | 85 ++++++++++++ docs/manifest.md | 104 ++++++++++++++ 4 files changed, 532 insertions(+) create mode 100644 docs/capabilities.md create mode 100644 docs/form-variables.md create mode 100644 docs/getting-started.md create mode 100644 docs/manifest.md diff --git a/docs/capabilities.md b/docs/capabilities.md new file mode 100644 index 00000000..77967c21 --- /dev/null +++ b/docs/capabilities.md @@ -0,0 +1,299 @@ +# Capabilities + +Your integration's `capabilities` describe how it interacts with LaunchDarkly. + +We support three capabilities: + +- [Audit log events hook](#audit-log-events-hook-auditlogeventshook) (`auditLogEventsHook`) +- [Trigger](#trigger-trigger) (`trigger`) +- [Reserved custom properties](#reserved-custom-properties-reservedcustomproperties) (`reservedCustomProperties`) + +## Audit log events hook (`auditLogEventsHook`) + +An audit log events hook is a webhook that LaunchDarkly sends whenever an +event happens inside of LaunchDarkly. Each of these events +result in an event being published to LaunchDarkly's audit log. +You can use this capability to send data to or trigger an event in another service. + +The `auditLogEventsHook` has three properties: + +1. [`endpoint`](#endpoint): + Describes the HTTP handler that will receive the webhook. +2. [`templates`](#templates): + A map of template paths relative to your integration's directory. You can use templates to transform the raw audit log events to a format that your integration expects. These templates can be any file type. +3. [`defaultPolicy`](#default-policy): + An array of [LaunchDarkly + policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) that + act as a filter determining which events to send to your webhook endpoint. + +Here's an example of an audit log events hook capability that subscribes to flag +events in a LaunchDarkly account: + +```json + "capabilities": { + "auditLogEventsHook": { + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, + "templates": { + "flag": "templates/flag.json" + }, + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] + } + } +``` + +### Endpoint + +Every `auditLogEventsHook` capability must specify the endpoint to which LaunchDarkly should send webhook data. This specification must include all appropriate request semantics including the URL, method, and headers. + +In the example +above, a few of the properties (`endpoint.url` and +`endpoint.headers[].value`) accept template variables. These template +variables can reference any `formVariables` you've defined in your manifest. +The templating language we use is based off of a subset of the +Handlebars syntax. + +To learn more, read [Handlebars' documentation](https://handlebarsjs.com/). + +There are a few properties that allow you to substitute template variables at +runtime. The main ones are the `endpoint.url` and the +`endpoint.headers[].value`. This lets you configure a dynamic endpoint +based on the `formVariables` your integration collects from the user. Examples follow. + +This example uses the `endpointUrl` form variable as the URL of the endpoint and the `apiToken` as a `Bearer` token in the `Authorization` header: + +```json + "endpoint": { + "url": "{{endpointUrl}}", + "method": "POST", + "headers": [ + { + "name": "Content-Type", + "value": "application/json" + }, + { + "name": "Authorization", + "value": "Bearer {{apiToken}}" + } + ] + }, +``` + +This example uses the `apiToken` formVariable as a query parameter on the URL: + +```json + "endpoint": { + "url": "https://example.com/apiToken?={{apiToken}}", + "method": "POST" + }, +``` + +### Templates + +Before the `auditLogEventsHook` capability sends the request to the endpoint +handling your webhook, you can transform the body of the request +sent to your handler. + +In your manifest, you can specify templates to be executed when webhook events are of kinds `flag`, `project`, and `environment`. Additionally, you can specify a `default` template as a catch-all for any event without a more specific template. A `validation` template is also provided in case you want to provide users with the ability to validate their connection by sending a test event from LaunchDarkly to your service. + +```json + "templates": { + "default": "templates/default.json.hbs", + "flag": "templates/flag.json.hbs", + "project": "templates/project.json.hbs", + "environment": "templates/environment.json.hbs", + "validation": "templates/default.json.hbs" + }, +``` + +If you don't provide one or more templates, LaunchDarkly +sends you a default JSON payload that looks like this: + +```json +{ + "_links": { + "canonical": { + "href": "/api/v2/flags/always-snippet/example-test", + "type": "application/json" + }, + "parent": { + "href": "/api/v2/auditlog", + "type": "application/json" + }, + "self": { + "href": "/api/v2/auditlog/5defebd006121dd9f7ea90d0", + "type": "application/json" + }, + "site": { + "href": "/always-snippet/production/features/example-test", + "type": "text/html" + } + }, + "_id": "5defebd006121dd9f7ea90d0", + "_accountId": "", + "timestamp": { + "milliseconds": 1580778134028, + "seconds": 1580778134, + "rfc3339": "2020-02-04T01:02:14Z" + }, + "kind": "flag", + "name": "Example test", + "description": "", + "shortDescription": "", + "comment": "This is just a test", + "member": { + "_links": { + "parent": { + "href": "/api/v2/members", + "type": "application/json" + }, + "self": { + "href": "/api/v2/members/569f514183f2164430000002", + "type": "application/json" + } + }, + "_id": "569f514183f2164430000002", + "email": "testing@example.com", + "firstName": "Henry", + "lastName": "Barrow" + }, + "titleVerb": "", + "markdownTitle": "[Henrietta Powell](mailto:testing@example.com) turned on the flag [Example test](http://app.launchdarkly/exampledotcom/production/features/example-test) in `Production`", + "title": "Henrietta Powell turned on the flag Example test in 'Production'", + "target": { + "_links": null, + "name": "" + } +} +``` + +If you choose to provide one or more +`templates`, +LaunchDarkly renders your template using the context data above. Your +template can be any text based format, but you must specify the appropriate +`Content-Type` header in your `endpoint.headers` property to match the content +type of your template body. + +We use a basic subset of the Handlebars template syntax to render +your template. + +To learn more about Handlebars' sysntax, read [Handlebars' Language +Guide](https://handlebarsjs.com/guide/). + +In addition to the basic language syntax, we support the following [built-in +helpers](https://handlebarsjs.com/guide/builtin-helpers.html): + +- `if` +- `unless` +- `each` +- `with` +- `lookup` + +Furthermore, the following custom helpers are supported: + +- `equal` - renders a block if the string version of both arguments are equals +- `pathEncode` - URL path encodes the string version of the argument +- `queryEncode` - URL query encodes the string version of the argument + +To test your templates, you can run `npm run preview $INTEGRATION_NAME` or use the [Handlebars +Sandbox](http://tryhandlebarsjs.com/). + +### Default policy + +When you configure your integration, customers can specify an array of [LaunchDarkly +policies](https://docs.launchdarkly.com/home/account-security/custom-roles/policies) filter which events to send to your webhook endpoint. + +To simplify onboarding your integration, you can specify a default policy which follows best practices for your integration's use case. + +Assuming your integration only cares about flag activity, we recommend the following default policy. This policy specifies that LaunchDarkly will notify your integration of all flag activity across production environments from all projects. + +Here is the policy: + +```json + "defaultPolicy": [ + { + "effect": "allow", + "resources": ["proj/*:env/production:flag/*"], + "actions": ["*"] + } + ] +``` + +### Validation + +To preview your integration's templates with sample data, run `npm run preview INTEGRATION_NAME`. + +Alternatively, to produce a sample `curl` command, run `npm run curl INTEGRATION_NAME`. This returns data with your integration's service as if it was sent by the audit log event hook capability. + +## Trigger (`trigger`) + +**At the time of this writing, LaunchDarkly's trigger functionality is only available to customers opted in to an early access program. Email [partnerships@launchdarkly.com](mailto:partnerships@launchdarkly.com) to request access.** + +The trigger capability is used to generate a unique webhook URL that your service can request to generate a user-defined flag change in LaunchDarkly. + +By default, the trigger URL contains a globally unique path parameter to provide security in the form of an [unguessable URL](https://www.schneier.com/blog/archives/2015/07/googles_unguess.html). However, if your service supports additional security settings such as shared secrets when firing webhooks, you can specify those with the optional `auth` object. **Note**: at launch, the `auth` attribute is unsupported and should be omitted. + +The required `documentation` field must be a link to documentation outlining how webhooks should be configured in your service. + +If the integration offers the option to send test events / webhook requests, the optional `testEventNameRegexp` fields allows you to specify regex to match the expected `eventName` value below. This will tell our integration framework not to make any real flag or resource changes associated with matching events. + +If your webhooks' request bodies are non-empty, you can specify the optional `parser` object with one or more of `eventName`, `value`, and `url`. The provided values will flow through LaunchDarkly into the resulting audit log messages when your service invokes a trigger in LaunchDarkly. + +Here is a sample `trigger` capability including all optional properties: + +```json + "trigger": { + "documentation": "https://example.com/configuring-webhooks", + "auth": { + "type": "sharedSecret" + }, + "parser": { + "eventName": "/event", + "value": "/value", + "url": "/links/self/href" + }, + } +``` + +**Note**: if an integration only has the trigger capability, the word "trigger" will be added to its name in the LaunchDarkly UI. For this reason, do not include the word "trigger" in the manifest name. See the [generic-trigger manifest](/integrations/generic-trigger/manifest.json) for an example. + +## Reserved custom properties (`reservedCustomProperties`) + +Custom properties allow you to store data in LaunchDarkly alongside a feature flag. For example, you can use custom properties to indicate flag-level associations with data on your service. If you don't have any flag-level associations or configurations, you don't need to use this capability. + +To learn more, read [Custom properties](https://docs.launchdarkly.com/home/advanced/custom-properties). + +By default, users must specify a custom property name and key when they attach the custom property value to a feature flag. This step introduces the possibility of user error. To prevent this, developers can _reserve_ a custom property for their integration, which makes it much easier for users to correctly add the property's value to feature flags. + +Reserved custom properties are simple to define. Their only requirements are a `name` and `key`. + +After your integration is configured by a user, the custom property starts appearing in the dropdown on the flag's Settings page. + +Here is a sample `reservedCustomProperties` capability: + +```json + "reservedCustomProperties": [ + { + "name": "Foobar Entities", + "key": "foobar" + } + ], +``` \ No newline at end of file diff --git a/docs/form-variables.md b/docs/form-variables.md new file mode 100644 index 00000000..152d12ac --- /dev/null +++ b/docs/form-variables.md @@ -0,0 +1,44 @@ +# Form variables + +Most integrations need to collect one or more pieces of configuration data +that supports the integration, such as API tokens or webhook endpoints. + +To support these configurations, describe a set of +`formVariables` that define these configuration properties. + +Here's an example: + +```json + "formVariables": [ + { + "key": "endpointUrl", + "name": "Webhook endpoint URL", + "description": "Enter the URL to the webhook endpoint", + "defaultValue": "https://example.com/inbound_webhook", + "type": "url" + }, + { + "key": "apiToken", + "name": "API Key", + "description": "Enter your [API key](https://example.com/api) here", + "type": "string", + "isSecret": true + } + ], +``` + +The `formVariables` entry above displays as the following UI in the [LaunchDarkly Integrations +page](https://app.launchdarkly.com/default/integrations): + +![Example configuration +form](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/810d8941f29c0306021a973bd6cf10c42bdea03b/goaltender-config-ui.png) + +Form variables apply to the entire integration configuration. There are no capability-specific form variables. + +The `formVariables[].description` will be used as a field label on the UI. You +can use simple markdown to link a word or phrase to an external URL. + +Accepted form variable types are `string`, `boolean`, `uri`, `enum`, and `dynamicEnum`. +Optionally, you can set `isSecret` or `isOptional` if necessary, or provide guidance with `placeholder` and `defaultValue`. If you provide a `defaultValue`, you must also set `isOptional` to `true` and vice versa. + +To learn more, read the [manifest schema](../manifest.schema.json). \ No newline at end of file diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 00000000..f6c9aaf1 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,85 @@ +# Getting started + +There are several steps to building an integration with LaunchDarkly. + +## Prerequisites + +Before you connect LaunchDarkly with a third-party service, replicate your integration's desired behavior in an isolated standalone environment separate from LaunchDarkly. + +The easiest way to do this is to use [`curl`](https://curl.haxx.se/docs/manpage.html). Find the API documentation for your third-party service and execute sample commands against it. A lot of API documentation has `curl` example commands provided for developers to use. + +When you execute your sample commands, observe the request semantics. This helps streamline your manifest and template definitions. + +## Step 1: Fork this repository + +Fork this repository to your own GitHub account. + +After you finish building your integration, you can submit a pull request to LaunchDarkly to have it approved and deployed. + +To learn more about submitting a pull request, read [Step 8: Submit your integration](#step-8-submit-your-integration). + +## Step 2: Create a new directory inside `./integrations` + +Create a new directory inside the [integrations](../integrations) directory. Name it +after your organization or give it the integration's name (For example, `your-company-name-dot-com`). + +The directory name must not have any spaces and must use +[kebab-casing](https://wiki.c2.com/?KebabCase). + +Only change files and directories inside your new directory. Our validation process rejects any pull requests with modified content outside of your directory. + +## Step 3: Create your integration manifest + +Each integration contains a manifest defining basic concepts about your integration and organization. Manifests also instruct LaunchDarkly in how to interact with your integration. + +Defining your manifest is the single most important step in contributing your integration to LaunchDarkly's platform. It's important to configure your manifest correctly. + +To learn more, read [Integration manifest](manifest.md). + +## Step 4: Collect integration configuration data from LaunchDarkly users + +Most integrations need to collect one or more pieces of configuration data +that support the integration (for example, API tokens or webhook endpoints). + +You can describe a set of `formVariables` that define these configuration properties. + +To learn more, read [Form variables](form-variables.md). + +## Step 5: Define your integration's capabilities + +The next step to define your LaunchDarkly integration is describing its +`capabilities`. Your integration's `capabilities` are how it interacts with LaunchDarkly. + +To learn more, read [Capabilities](capabilities.md). + +## Step 6: Validate your integration + +To validate your integration: + +1. Run `npm install` to install the validation dependencies. +2. Run `npm test` to run the validation suite. + +Additionally, we +recommend you install [pre-commit hooks](https://pre-commit.com/#install) with `pre-commit install`. This will make the validation suite run before every commit, saving you time if you need to troubleshoot anything. + +Some of the capabilities have their own validation tools. To learn more, read [Capabilities](capabilities.md). + +## Step 7: Create your user documentation and README + +Now that your integration is built and validated, you must provide documentation for users and integration maintainers. + +Find LaunchDarkly's user documentation at [docs.launchdarkly.com](https://docs.launchdarkly.com/integrations). You can submit new docs to the [LaunchDarkly-Docs repository](https://github.com/launchdarkly/LaunchDarkly-Docs). + +Submit a pull request to this repository with a new integrations guide. Follow the pattern and language used by existing integration guides. + +In addition to user documentation, you must to provide guidance on how to maintain and test your integration. Specify this developer-focused information in an integration README (`README.md`) in your integration's directory. The README should also link to the user documentation you provide. + +## Step 8: Submit your integration + +After you've built your integration, [submit a pull request against this +repo](https://github.com/launchdarkly/integration-framework/pull/new/master). + +When you do, your branch will run through some automated validations and be reviewed by +our team. If we're ready to publish your integration, we'll get your permission and make it live on our site. + +We'll also work with you on submitting your user documentation to our [documentation site](https://github.com/launchdarkly/LaunchDarkly-Docs). \ No newline at end of file diff --git a/docs/manifest.md b/docs/manifest.md new file mode 100644 index 00000000..cd56485f --- /dev/null +++ b/docs/manifest.md @@ -0,0 +1,104 @@ +# Integration manifest + +Each integration contains a manifest defining basic concepts about your +integration and organization. Manifests also instruct LaunchDarkly in how to +interact with your integration. + +Defining your manifest is the single most important step in contributing your +integration to LaunchDarkly's platform. It's important to configure your +manifest correctly. + +## Introduction + +Create an empty `manifest.json` file inside your new directory. You will use the +`manifest.json` to describe your integration's details and capabilities. + +The properties of LaunchDarkly's integration manifests are defined through a +[JSON schema](../manifest.schema.json). Many IDEs can provide you inline help +and validation while editing your manifest. You can register the JSON schema in +your IDE to enable this kind of help. + +If you use [VSCode](https://code.visualstudio.com/), it detects the settings in +this repository and aplies the schema validation without any additional +configuration. + +![vscode-hints](https://gist.githubusercontent.com/rmanalan/447b78a8c00a46c8638cca834c3009a3/raw/264fafe547a82ada8e5c134832bf35508a6b6458/manifest-vscode.png) + +## Getting started + +The first part of the manifest describes your organization, contacts, URLs, and +a few items LaunchDarkly needs to list your integration properly. + +We use most of this information when we render your integration card and +configuration form in the LaunchDarkly UI. + +```json +{ + "name": "Sample Integration", + "version": "1.0.0", + "overview": "Short one-liner describing your integration", + "description": "Send flag data to space. Markdown based description.", + "author": "Example Dot Com", + "supportEmail": "support@example.com", + "links": { + "site": "https://example.com", + "privacyPolicy": "https://example.com/privacy" + }, + "categories": ["apm", "monitoring", "alerts"], + "icons": { + "square": "assets/images/square.svg", + "horizontal": "assets/images/horizontal.svg" + }, + "requiresOAuth": false +} +``` + +There are a few properties in the manifest that can accept simple +[markdown](https://daringfireball.net/projects/markdown/). One of them is the +`description`. + +LaunchDarkly's UI converts markdown to HTML. To get the best results, only use +simple markdown, like links and basic text formatting. + +Notice that the `icons` described above are in SVG format. This is intentional. +We do not accept other image formats. + +We use your organization's or integration's logo in the LaunchDarkly UI and a +public facing integrations listing on +[launchdarkly.com/integrations](https://launchdarkly.com/integrations/). SVG +files allow your logo to scale nicely on different devices. To make sure your +logo appears correctly everywhere we use it, make sure that your SVG logos don't +have any padding around the image. + +Also, notice that the `icon.square` and `icon.horizontal` properties point to +relative paths. These paths are relative to your integration's directory. You +are free to create any directories and files that support your integration. + +## OAuth + +Many integrations in LaunchDarkly today use API Tokens. However, if your API +requires OAuth for authentication, we can support that as well. Currently, we +support two types of OAuth: + +* [Authorization Code Flow](https://oauth.net/2/grant-types/authorization-code/) + (aka, 3-legged OAuth) +* [Client Credentials Flow](https://oauth.net/2/grant-types/client-credentials/) + (aka, 2-legged OAuth) + +With these flows, LaunchDarkly acts as the OAuth consumer. In order for this to +work, LaunchDarkly will need to store a consumer ID and secret. Please contact +us at to register your OAuth consumer details. +You'll also need to set the `requiresOAuth` root-level property in your manifest +to `true`. At runtime, LaunchDarkly will lookup your OAuth consumer ID and +secret from our registry based on your integration key. **Simply setting the +`requiresOAuth` property to `true` will not enable OAuth on your integration -- +you'll need to provide us with the OAuth consumer details first.** + +## Form variables and capabilities + +Form variables and capabilities are the most important part of the manifest. +They define the primary interactions that LaunchDarkly and users will have with +your integration. + +Read more about [form variables](form-variables.md) and +[capabilities](capabilities.md). \ No newline at end of file From c8bcab94892ff9b1fdeab2fc45a4ffd27b376b11 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 8 Oct 2025 13:18:40 +0200 Subject: [PATCH 934/936] [REL-8880] remove devin moonshot integration --- integrations/devin/assets/horizontal.svg | 156 ------------------- integrations/devin/assets/square.svg | 6 - integrations/devin/manifest.json | 60 -------- manifest.schema.d.ts | 39 +---- manifest.schema.json | 187 ----------------------- schemas/base.json | 4 - schemas/capabilities/buttonAction.json | 55 ------- 7 files changed, 4 insertions(+), 503 deletions(-) delete mode 100644 integrations/devin/assets/horizontal.svg delete mode 100644 integrations/devin/assets/square.svg delete mode 100644 integrations/devin/manifest.json delete mode 100644 schemas/capabilities/buttonAction.json diff --git a/integrations/devin/assets/horizontal.svg b/integrations/devin/assets/horizontal.svg deleted file mode 100644 index 492fc6de..00000000 --- a/integrations/devin/assets/horizontal.svg +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/integrations/devin/assets/square.svg b/integrations/devin/assets/square.svg deleted file mode 100644 index a8b8e552..00000000 --- a/integrations/devin/assets/square.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/integrations/devin/manifest.json b/integrations/devin/manifest.json deleted file mode 100644 index b258c191..00000000 --- a/integrations/devin/manifest.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "Devin (Beta)", - "version": "1.0.0", - "overview": "AI-driven code automation for LaunchDarkly via Devin integration.", - "description": "Delegates end-to-end flag lifecycle, SDK setup, experiment instrumentation tasks to Devin, delivering pull-ready code changes from a single click. This action is currently in beta and is not yet available to all users.", - "author": "LaunchDarkly", - "supportEmail": "support@launchdarkly.com", - "links": { - "site": "https://devin.ai/", - "launchdarklyDocs": "https://launchdarkly.com/docs/integrations", - "privacyPolicy": "https://docs.devin.ai/security" - }, - "categories": ["ai", "automation"], - "icons": { - "square": "assets/square.svg", - "horizontal": "assets/horizontal.svg" - }, - "formVariables": [ - { - "key": "apiKey", - "name": "Devin API key", - "type": "string", - "description": "Enter your Devin API key. [Learn more](https://docs.devin.ai/api-reference/overview#get-an-api-key) about generating API keys.", - "isSecret": true - } - ], - "allowIntegrationConfigurations": true, - "capabilities": { - "buttonAction": { - "actionRequest": { - "endpoint": { - "url": "https://api.devin.ai/v1/sessions", - "method": "POST", - "headers": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiKey}}" - } - ] - } - }, - "requestBodyTemplates": [ - { - "key": "flagCleanup", - "jsonBody": "{\"prompt\":\"You are an experienced software engineer. We just archived LaunchDarkly flag '{{flagKey}}'.\\nTask:\\n1. Search the codebase for any references to the flag key (including SDK evals, config files, comments).\\n2. Remove dead code so that the ON variation is baked in.\\n3. Run all tests and lints and fix any compilation errors.\\n4. Push a new branch and open a pull request titled 'Cleanup: remove {{flagKey}} flag'.\"}", - "requiredContext": ["flagKey"] - }, - { - "key": "sdkSetup", - "jsonBody": "{\"prompt\":\"You are an experienced software engineer. I need help setting up the LaunchDarkly AI Configs SDK for {{content.selectedSdk}}.\\nHere are the import and initialize instructions for {{content.selectedSdk}}:\\nImport instructions:\\n{{{content.instructions.import}}}\\nInitialize instructions:\\n{{{content.instructions.initialize}}}\\n\\nPlease help me:\\n1. Set up the LaunchDarkly AI Configs SDK for {{content.environmentKey}}\\n2. Use the provided import and initialize code\\n3. Make sure the SDK is properly configured with the API key\\n4. Make these changes in the {{content.repository}} repository and push a new branch and open a pull request\"}", - "requiredContext": ["content", "environmentKey"] - } - ] - } - } -} diff --git a/manifest.schema.d.ts b/manifest.schema.d.ts index 1d5ba1c1..f14b3f42 100644 --- a/manifest.schema.d.ts +++ b/manifest.schema.d.ts @@ -441,25 +441,6 @@ export type DeliveryMethod = "custom"; * Whether to send the standard audit log webhook payload or to use defined JSON templates */ export type UseStandardWebhookPayload = boolean; -/** - * Template string used to render the JSON request body - */ -export type JSONBody = string; -/** - * An array of json objects that can be sent as request bodies - */ -export type RequestBodyTemplates = { - /** - * A unique identifier for the specific request body - */ - key: string; - jsonBody: JSONBody; - /** - * An array of context strings that are required to correctly resolve the request body - */ - requiredContext: string[]; - [k: string]: unknown; -}[]; /** * The reserved custom property's display name. */ @@ -529,6 +510,10 @@ export type AllowAdditionalApprovalFormVariablesForCreationRequestModal = boolea * If true, the user can create integration configurations associated with this integration's approval capability. Requires formVariables to be defined */ export type AllowUsersToConfigureIntegrationConfigurationsForApprovals = boolean; +/** + * Template string used to render the JSON request body + */ +export type JSONBody = string; /** * Externally-created approval entity ID */ @@ -899,7 +884,6 @@ export interface MultiSelectOptionItem { */ export interface Capabilities { auditLogEventsHook?: AuditLogEventsHook; - buttonAction?: ButtonAction; reservedCustomProperties?: ReservedCustomProperties; trigger?: Trigger; approval?: Approval; @@ -951,21 +935,6 @@ export interface Policy { resources?: Resources; [k: string]: unknown; } -/** - * This capability will enable LaunchDarkly to send generic requests to an external API upon the click of a button. - */ -export interface ButtonAction { - actionRequest: ActionRequest; - requestBodyTemplates: RequestBodyTemplates; - [k: string]: unknown; -} -/** - * Describes the HTTP request for the action - */ -export interface ActionRequest { - endpoint: Endpoint; - [k: string]: unknown; -} /** * This capability is used to manage inbound webhook entry points that trigger feature flag changes in LaunchDarkly */ diff --git a/manifest.schema.json b/manifest.schema.json index 7c7f2bb4..3e014e2f 100644 --- a/manifest.schema.json +++ b/manifest.schema.json @@ -753,7 +753,6 @@ "propertyNames": { "enum": [ "auditLogEventsHook", - "buttonAction", "reservedCustomProperties", "trigger", "approval", @@ -1089,192 +1088,6 @@ "templates" ] }, - "buttonAction": { - "$id": "#/properties/capability/button-action", - "title": "Button action", - "description": "This capability will enable LaunchDarkly to send generic requests to an external API upon the click of a button.", - "type": "object", - "propertyNames": { - "enum": [ - "actionRequest", - "requestBodyTemplates" - ] - }, - "required": [ - "actionRequest", - "requestBodyTemplates" - ], - "properties": { - "actionRequest": { - "$id": "#/properties/capability/button-action/action-request", - "title": "Action Request", - "description": "Describes the HTTP request for the action", - "propertyNames": { - "enum": [ - "endpoint" - ] - }, - "required": [ - "endpoint" - ], - "properties": { - "endpoint": { - "$id": "#/definitions/endpoint", - "title": "Endpoint", - "description": "Properties that describe an HTTP request to an external endpoint", - "type": "object", - "propertyNames": { - "enum": [ - "url", - "method", - "headers", - "hmacSignature" - ] - }, - "properties": { - "url": { - "$id": "#/definitions/endpoint/url", - "title": "URL", - "type": "string", - "description": "URL to send the request to. You can use {{template markup}} to inject a formVariable into the url." - }, - "method": { - "$id": "#/definitions/endpoint/method", - "title": "HTTP method", - "description": "HTTP method to use when LaunchDarkly makes the request to your endpoint", - "enum": [ - "POST", - "PUT", - "PATCH", - "GET", - "DELETE" - ], - "type": "string" - }, - "headers": { - "$id": "#/definitions/endpoint/headers", - "title": "HTTP headers", - "description": "Headers to send with the webhook request", - "type": "array", - "items": { - "$id": "#/definitions/endpoint/header/items", - "title": "Header items", - "description": "A name and value pair to send as headers with the hook request", - "type": "object", - "propertyNames": { - "enum": [ - "name", - "value" - ] - }, - "properties": { - "name": { - "$id": "#/definitions/endpoint/header/items/name", - "title": "Name", - "type": "string", - "description": "Name of the header", - "maxLength": 50, - "pattern": "^[^\\s]*$" - }, - "value": { - "$id": "#/definitions/endpoint/header/items/value", - "title": "Value", - "type": "string", - "description": "Value of the header. Form variables can be substituted in using {{variableName}}" - } - }, - "required": [ - "name", - "value" - ] - }, - "default": [ - { - "name": "Content-Type", - "value": "application/json" - } - ], - "examples": [ - { - "name": "Content-Type", - "value": "application/json" - }, - { - "name": "Authorization", - "value": "Bearer {{apiToken}}" - } - ], - "minProperties": 1 - }, - "hmacSignature": { - "$id": "#/definitions/endpoint/hmac-signature", - "title": "HMAC signature", - "description": "Whether or not and how to configure HMAC validation on outgoing webhooks", - "type": "object", - "propertyNames": { - "enum": [ - "headerName", - "hmacSecretFormVariableKey" - ] - }, - "properties": { - "headerName": { - "$id": "#/definitions/endpoint/hmac-signature/header-name", - "title": "HMAC signature header name", - "description": "The name of the HMAC signature header", - "type": "string" - }, - "hmacSecretFormVariableKey": { - "$id": "#/definitions/endpoint/hmac-signature/secret-form-variable-field", - "title": "HMAC secret form variable key", - "description": "The name of the form variable field that corresponds to the HMAC encryption secret", - "type": "string" - } - } - } - }, - "required": [ - "url", - "method" - ] - } - } - }, - "requestBodyTemplates": { - "$id": "#/properties/capability/button-action/request-body-templates", - "title": "Request Body Templates", - "description": "An array of json objects that can be sent as request bodies", - "type": "array", - "items": { - "type": "object", - "required": [ - "key", - "jsonBody", - "requiredContext" - ], - "properties": { - "key": { - "type": "string", - "description": "A unique identifier for the specific request body" - }, - "jsonBody": { - "$id": "#/definitions/json-body", - "title": "JSON Body", - "description": "Template string used to render the JSON request body", - "type": "string" - }, - "requiredContext": { - "type": "array", - "description": "An array of context strings that are required to correctly resolve the request body", - "items": { - "type": "string" - } - } - } - } - } - } - }, "reservedCustomProperties": { "$id": "#/properties/capability/reserved-custom-properties", "title": "Reserved custom properties", diff --git a/schemas/base.json b/schemas/base.json index 42cab357..51952315 100644 --- a/schemas/base.json +++ b/schemas/base.json @@ -268,7 +268,6 @@ "propertyNames": { "enum": [ "auditLogEventsHook", - "buttonAction", "reservedCustomProperties", "trigger", "approval", @@ -289,9 +288,6 @@ "auditLogEventsHook": { "$ref": "schemas/capabilities/auditLogEventsHook.json#/auditLogEventsHook" }, - "buttonAction": { - "$ref": "schemas/capabilities/buttonAction.json#/buttonAction" - }, "reservedCustomProperties": { "$ref": "schemas/capabilities/reservedCustomProperties.json#/reservedCustomProperties" }, diff --git a/schemas/capabilities/buttonAction.json b/schemas/capabilities/buttonAction.json deleted file mode 100644 index 45a3bda5..00000000 --- a/schemas/capabilities/buttonAction.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "buttonAction": { - "$id": "#/properties/capability/button-action", - "title": "Button action", - "description": "This capability will enable LaunchDarkly to send generic requests to an external API upon the click of a button.", - "type": "object", - "propertyNames": { - "enum": ["actionRequest", "requestBodyTemplates"] - }, - "required": ["actionRequest", "requestBodyTemplates"], - "properties": { - "actionRequest": { - "$id": "#/properties/capability/button-action/action-request", - "title": "Action Request", - "description": "Describes the HTTP request for the action", - "propertyNames": { - "enum": ["endpoint"] - }, - "required": ["endpoint"], - "properties": { - "endpoint": { - "$ref": "../definitions.json#/endpoint" - } - } - }, - "requestBodyTemplates": { - "$id": "#/properties/capability/button-action/request-body-templates", - "title": "Request Body Templates", - "description": "An array of json objects that can be sent as request bodies", - "type": "array", - "items": { - "type": "object", - "required": ["key", "jsonBody", "requiredContext"], - "properties": { - "key": { - "type": "string", - "description": "A unique identifier for the specific request body" - }, - "jsonBody": { - "$ref": "../definitions.json#/jsonBody" - }, - "requiredContext": { - "type": "array", - "description": "An array of context strings that are required to correctly resolve the request body", - "items": { - "type": "string" - } - } - } - } - } - } - } -} From 5d8c1337a66a373668ac669980e468dd443d3332 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 8 Oct 2025 13:22:23 +0200 Subject: [PATCH 935/936] [REL-8880] remove pr gha --- .github/workflows/pull_request.yml | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 .github/workflows/pull_request.yml diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml deleted file mode 100644 index 8c1c59a8..00000000 --- a/.github/workflows/pull_request.yml +++ /dev/null @@ -1,15 +0,0 @@ -on: pull_request -name: Pull request -jobs: - setShortcutLinkInPR: - if: github.repository == 'launchdarkly/integration-framework-private' - name: Set Shortcut Link in PR - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set Shortcut Link in PR - uses: launchdarkly-labs/ld-gh-actions-shortcut/set-link@main - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - AUTOLINK_PREFIX: 'SC-' - CREATE_STORY_URL: https://app.shortcut.com/launchdarkly/stories/new?template_id=5f3fbdce-dfa0-446b-91c5-0cf6e01f5045 From 895418f3bdf392ebe7f160a09e72e22798820733 Mon Sep 17 00:00:00 2001 From: Isabelle Miller Date: Wed, 8 Oct 2025 13:23:12 +0200 Subject: [PATCH 936/936] [REL-8880] remove dependency scan --- .github/workflows/dependency-scan.yml | 29 --------------------------- 1 file changed, 29 deletions(-) delete mode 100644 .github/workflows/dependency-scan.yml diff --git a/.github/workflows/dependency-scan.yml b/.github/workflows/dependency-scan.yml deleted file mode 100644 index c207d3c7..00000000 --- a/.github/workflows/dependency-scan.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Dependency Scan - -on: - pull_request: - push: - branches: [main] - -jobs: - generate-nodejs-sbom: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: launchdarkly/common-actions/init@main - - - name: Generate SBOM - uses: launchdarkly/common-actions/dependency-scan/generate-sbom@main - with: - types: 'nodejs' - - evaluate-policy: - runs-on: ubuntu-latest - needs: - - generate-nodejs-sbom - steps: - - uses: actions/checkout@v4 - - name: Evaluate SBOM Policy - uses: launchdarkly/common-actions/dependency-scan/evaluate-policy@main - with: - artifacts-pattern: bom-*